2014-02-27 41 views
0

我有一个简单的3层设置的Apache服务器,它向Tomcat服务器发送请求,该服务器查询(MySQL)数据库以生成HTML结果。我发现只要Tomcat启动,Java进程中就有线程正在旋转,从而产生futex()调用。几十次Web请求之后,试图服务请求的线程会陷入相同的futex()循环中,并且它会停止回应所有请求 - 它们会在客户端超时。futex()调用的Tomcat java线程

我已经在Tomcat 6和Tomcat 7中尝试了这个。我已经用Oracle的Java 1.7.0_45和OpenJDK 1.6.0尝试了它。这个虚拟机是一个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()调用?他们是否正常?他们是否应该超时?并有一个已知的修复?

感谢您的信息洞察。

回答

0

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