如何定位cpu佔用率高的java線程?

場景

測試環境,內部帳戶登錄之後,測試機負載非常高  

p_w_picpath
究竟問題是什麼呢?

工具

  • 【jps】:jps(Java Virtual Machine Process Status Tool)是JDK 1.5提供的一個顯示當前所有java進程pid的命令,簡單實用,非常適合在linux/unix平臺上簡單察看當前java進程的一些簡單情況。

  • 【pidstat】: pidstat主要用於監控全部或指定進程佔用系統資源的情況,如CPU,內存、設備IO、任務切換、線程等。pidstat首次運行時顯示自系統啓動開始的各項統計信息,之後運行pidstat將顯示自上次運行該命令以後的統計信息。用戶可以通過指定統計的次數和時間來獲得所需的統計信息。

  • 【jstack】:jstack用於打印出給定的java進程ID或core file或遠程調試服務的Java堆棧信息,如果是在64位機器上,需要指定選項"-J-d64",Windows的jstack使用方式只支持以下的這種方式。

排查步驟

1、登錄服務器,使用jps查看結果如下:  
web@/home/www$ jps    
11493 Bootstrap    
13022 Jps

2、使用pidstat查看查看結果如下:  
web@/home/www$ pidstat -p 11493 -u 1 3 -t    
Linux 2.6.32-5-amd64 (debian-mongodb-test01) 2014年04月03日 x86_64 (2 CPU)

13時09分09秒 TGID TID %usr %system %guest %CPU CPU Command  
13時09分10秒 11493 - 194.39 2.80 0.00 197.20 1 java    
13時09分10秒 - 11493 0.00 0.00 0.00 0.00 1 |__java    
13時09分10秒 - 11494 0.00 0.00 0.00 0.00 1 |__java    
13時09分10秒 - 11495 7.48 1.87 0.00 9.35 1 |__java    
13時09分10秒 - 11496 9.35 0.00 0.00 9.35 0 |__java    
13時09分10秒 - 11497 0.00 0.00 0.00 0.00 0 |__java    
...中間忽略    
平均時間: - 11669 78.66 0.33 0.00 28.99 - |__java    
平均時間: - 11670 88.66 0.33 0.00 28.99 - |__java

問題鎖定:TID=11669|11670的java

3、導出Java應用程序所有線程  
jstack -l 11493 > /home/www/tmp.txt    
TID=11670的java,11670轉換爲16進制是0x2d96    
在tmp.txt中查找nid=0x2d96

如圖  

p_w_picpath

鎖定了:

BusinessSubscriptionService.getBusinessSusbscriptions(BusinessSubscriptionService.java:65)

BusinessSubscriptionService.getBusinessSusbscriptionsOfLoginUser(BusinessSubscriptionService.java:175)


詢問開發檢查問題所在。

結果開發反饋:

重構有風險,測試需謹慎。 這個錯誤的重構會導致進入帶寬查詢加載業務訂閱時,錯誤的查詢了當前內部帳號綁定的所有賬戶(多達4000多個)的業務訂閱,因此導致CPU負載高,tcp連接數高,頁面一直在等待響應。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章