Tomcat java线程在futex()调用上旋转

时间:2014-02-27 16:58:23

标签: java tomcat futex

我有一个Apache服务器的简单3层设置,它将请求发送到Tomcat服务器,该服务器查询(MySQL)数据库以生成HTML结果。我发现只要Tomcat启动,java进程中的线程就会在futex()调用中消失。在几十个Web请求之后,尝试提供请求的线程被捕获在相同的futex()循环中,并且它停止回答所有请求 - 它们在客户端超时。

我在Tomcat 6和Tomcat 7中尝试了这个。我已经尝试使用Oracle的Java 1.7.0_45和OpenJDK 1.6.0。这个VM是一个64位的Redhat 6系统,我试过他们发布的2.6.32-358.23.2内核和他们的2.6.32-431.3.1内核,并且所有组合都在strace中显示这些系统调用,并最终锁定起来。

futex(an addr, FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME, 1, {a timestamp}, ffffffff)
 = -1 ETIMEDOUT (Connection timed out)
futex(an addr, FUTEX_WAKE_PRIVATE, 1) = 0

JVM使用默认内存执行此操作,或者即使我将可用内存增加到3GB(计算机上的4GB)也是如此。我使用GC记录器运行,并且GC打印了一些次要集合,并且在发生锁定时没有执行一次。这台机器是在2014年1月创建的,因此不会出现任何“闰秒”情况。

所以我的问题是:为什么即使JVM应该“空闲”,Java也会在快速循环中进行所有这些futex()调用?他们正常吗?他们应该暂停吗?是否有一个已知的修复?

感谢您提供信息洞察。

1 个答案:

答案 0 :(得分:0)

我有同样的问题,我怀疑它的“闰秒”是如此。我的java进程很长时间都有很高的CPU负载。我从http://marc.info/?t=134138331900001&r=1&w=2获取一个文件“leap-a-day.c”,并运行为“./leap-a-day -s”和cpu负载突然变低,我不知道为什么....我的操作系统是redhat as6.5