利用VisualVM找出Tomcat佔用CPU最高的Thread

  • 5696
  • 0

今天要來說明如何利用VisualVM找出Tomcat佔用CPU最高的Thread。

 

前言

        手上的一個維護案,承接前廠商開發好的程式,最近發現客戶的後台主機 Tomcat 隨著使用時間愈久 CPU 使用率也佔用愈來愈高,直到整個後台服務無法使用,最後不得已只好重新啟動 Tomcat,這樣的循環持續了幾次,總覺得一直這樣也不是辦法,決定要來找出原因。

        前後分別使用了手邊常用的工具,PSI ProbeVisualVM,皆看不出來,最後無意中從 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 plugintopthreads-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 使用率過高問題

結論

        以程式碼來研判,工程師試圖透非同步的方式來刪除暫存檔,來避免讓使用者在操作過程中等待太久;但在某些情況下檔案會被鎖定導致刪檔不成功,直到檔案使用完關閉後,才會被刪除,所以才用了這個會造成無窮迴圈的寫法。
 
        我們需要進一步的來追查檔案被鎖定的原因,才能一勞永逸排除這個問題。

參考資料

 

 

世州 2018/10/30
Email: allen.lo@udngroup.com