最初發布on Server Fault,在那裏有人建議這個問題可能會在這裏更好地問。調試JBoss 100%CPU使用率
我們使用JBoss來運行我們的兩個WAR。一個是我們的網絡應用程序,另一個是我們的網絡服務。 Web應用程序訪問另一臺計算機上的數據庫並向Web服務發出請求。 Web服務向其他機器發出JMS請求,彙總數據並將其返回。
在我們最大的客戶端,大約每月一次的JBoss Java進程佔所有CPU的100%。運行JBoss的機器有8個CPU。我們的網絡應用程序在這段時間內仍然可以訪問,但頁面大約需要3分鐘才能加載。重新啓動JBoss將一切恢復正常。
數據庫機器和所有其他機器都很好,只有運行JBoss的機器受到影響。內存使用情況正常。網絡利用率是正常的。 JBoss日誌中沒有可疑的錯誤消息。
我已經建立了一個儘可能接近客戶端生產環境的測試環境,並且我已經完成了負載測試,其併發用戶數量是2倍。我還沒有得到我的測試環境來重現問題。
我們從哪裏出發?我們如何縮小問題的範圍?
目前我們唯一的計劃是等到問題發生在自己的生產中,然後進行一些調試以確定原因。到目前爲止,人們在發生問題時剛剛重新啓動了JBoss以最大限度地縮短停機時間。下次發生時,他們會讓開發人員看一看。問題是,下次發生時,可以做什麼來確定原因?
我們可以在同一個盒子上設置一個單獨的JBoss實例,並從Web服務中單獨安裝Web應用程序。這樣,當下一個問題發生時,我們將知道哪個WAR有問題(假設它是我們的代碼)。儘管如此,這並沒有縮小範圍。
我應該啓用JMX remote嗎?通過這種方式,下次發生問題時,我可以使用VisualVM進行連接,查看哪些線程在使用CPU,以及他們在做什麼。但是,在生產環境中啓用JMX遠程控制是否有重大缺陷?
是否有另一種方法來查看哪些線程正在吃CPU,並得到一個堆棧跟蹤,看看他們在做什麼?
還有其他想法嗎?
謝謝!
你好。 您是否發現了JBoss問題的根源? 我們不時有同樣的問題。 – 2010-05-19 15:47:13
是的,對於延遲抱歉。我們有一個HashMap被兩個線程同時寫入。如果一個放置觸發重新散佈,則第二個放置可以導致兩個映射節點相互指向。接下來的HashMap會觸發一個無限循環。 – NateS 2010-06-06 08:09:03