2014-02-27 68 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