簡體   English   中英

調試JBoss 100%的CPU使用率

[英]debugging JBoss 100% CPU usage

最初發布在Server Fault上 ,有人建議在這里提出這個問題。

我們使用JBoss來運行兩個WAR。 一個是我們的網絡應用程序,另一個是我們的Web服務。 Web應用程序訪問另一台計算機上的數據庫並向Web服務發出請求。 Web服務向其他計算機發出JMS請求,聚合數據並返回它。

在我們最大的客戶端,大約每月一次,JBoss Java進程占用了所有CPU的100%。 運行JBoss的機器有8個CPU。 我們的網絡應用程序在此期間仍可訪問,但頁面加載大約需要3分鍾。 重啟JBoss會恢復正常。

數據庫機器和所有其他機器都很好,只有運行JBoss的機器受到影響。 內存使用情況正常。 網絡利用率是正常的。 JBoss日志中沒有可疑的錯誤消息。

我已經建立了一個盡可能接近客戶端生產環境的測試環境,並且我已經完成了高達2倍並發用戶數的負載測試。 我沒有得到我的測試環境來復制問題。

我們從哪里去? 我們怎樣才能縮小問題?

目前我們唯一的計划是等到生產中出現問題,然后進行一些調試以確定原因。 到目前為止,人們剛剛在問題發生時重新啟動了JBoss,以盡量減少停機時間。 下次它發生時,他們會讓開發人員看一看。 問題是,下次發生時,可以采取哪些措施來確定原因?

我們可以在同一個盒子上設置一個單獨的JBoss實例,並與Web服務分開安裝Web應用程序。 這樣,當下一個問題發生時,我們將知道哪個WAR有問題(假設它是我們的代碼)。 盡管如此,這並沒有縮小范圍。

我應該啟用JMX遙控器嗎? 這種方式下次出現問題時我可以與VisualVM連接,看看哪些線程正在占用CPU以及他們到底在做什么。 但是,在生產環境中啟用JMX遠程是否存在重大缺陷?

是否有另一種方法可以查看哪些線程正在占用CPU並獲得堆棧跟蹤以查看它們在做什么?

還有其他想法嗎?

謝謝!

有一種快速而又臟的方法可以識別哪些線程占用了JBoss上的CPU時間。 使用瀏覽器訪問JMX控制台(通常在http:// localhost:8080 / jmx-console ,但可能與您不同),查找名為ServerInfo的bean,它有一個名為listThreadCpuUtilization的操作,它會轉儲實際的CPU時間每個活動線程使用的表格格式很好。 如果有一個行為不端,它通常會像拇指一樣突出。

還有listThreadDump操作,它將每個線程的堆棧轉儲到瀏覽器。

不如分析器好,但更容易獲得基本信息。 對於生產服務器來說,連接分析器通常是個壞消息,它非常方便。

這通常發生在失控代碼或對散列圖的不安全線程訪問中。 一個簡單的線程轉儲(kill -3,如@disown所說,或者在Windows控制台中使用ctrl-break)將揭示這個問題。

由於你無法使用測試重現它,我認為它聞起來像一個並發問題; 通常很難使測試腳本表現得足夠隨機以捕獲此類問題。

我通常會嘗試使其成為標准操作過程來執行由於操作異常而重新啟動的任何 JVM的線程轉儲,並且實際上需要捕獲每月一次的事情。

我認為你應該嘗試設置一個帶有負載測試的測試環境,以便重現你的問題。 分析肯定有助於查明問題。

快速解決方法是下次使用kill -3殺死jboss以獲得轉儲分析。 我要檢查的第二件事是你運行-server標志,你的gc設置是理智的。 您還可以運行一些dstat來查看進程在鎖定期間正在執行的操作。 但同樣 - 只需設置負載測試環境(通過EC2左右)來重現這一點就更安全了。

如果您使用的是JBoss 5.1.0 EAP,Jboss中存在一個錯誤,他們也有一個修復程序。 這是URL: https//issues.jboss.org/browse/JBPAPP-5193

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM