今天要來說明如何利用VisualVM找出Tomcat佔用CPU最高的Thread。
前言
手上的一個維護案,承接前廠商開發好的程式,最近發現客戶的後台主機 Tomcat 隨著使用時間愈久 CPU 使用率也佔用愈來愈高,直到整個後台服務無法使用,最後不得已只好重新啟動 Tomcat,這樣的循環持續了幾次,總覺得一直這樣也不是辦法,決定要來找出原因。
前後分別使用了手邊常用的工具,PSI Probe、VisualVM,皆看不出來,最後無意中從 stackoverflow 看到了一篇問答,有網友提到 TopThreads JConsole plugin 這個 plugin,安裝上也不困難就來試試,想不到一試就找到問題點了。
Tomcat CPU 使用率莫名的飇高 |
使用 PSI Probe 也看不出個所以然來 |
CPU 使用率 |
VisualVM 資訊不足(CPU 使用率) |
Thread 清單 |
前置準備
1. Tomcat
啟用 JMX 連接。
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=1099
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
2. 下載 TopThreads JConsole plugin:topthreads-1.1.jar。
3. VisualVM
安裝 VisualVM-JConsole plugin |
透過 JMX 連接 Tomcat |
連接成功後的畫面 |
設定 JConsole Plugins 加入 TopThreads JConsole plugin,設定好重新啟動 VisualVM。 |
查找過程
連接 Tomcat 成功後,從 JConsole Plugins 裡就會看到 Thread CPU 使用率 |
Bingo 發現 Thread 可能在這裡無法結束,而且共有 5 個 Thread 持續佔用 |
以程式碼來研判,工程師試圖透非同步的方式來刪除暫存檔,來避免讓使用者在操作過程中等待太久 |
透過 PSI Probe 來將 Thread 刪除,因為是暫存檔,我們可以再手動進行刪除,目前就先解除 CPU 使用率過高問題 |
結論
以程式碼來研判,工程師試圖透非同步的方式來刪除暫存檔,來避免讓使用者在操作過程中等待太久;但在某些情況下檔案會被鎖定導致刪檔不成功,直到檔案使用完關閉後,才會被刪除,所以才用了這個會造成無窮迴圈的寫法。
我們需要進一步的來追查檔案被鎖定的原因,才能一勞永逸排除這個問題。
參考資料
Email: allen.lo@udngroup.com