場景
測試環境,內部帳戶登錄之後,測試機負載非常高
工具
【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
如圖
鎖定了:
BusinessSubscriptionService.getBusinessSusbscriptions(BusinessSubscriptionService.java:65)
BusinessSubscriptionService.getBusinessSusbscriptionsOfLoginUser(BusinessSubscriptionService.java:175)
詢問開發檢查問題所在。
結果開發反饋:
重構有風險,測試需謹慎。 這個錯誤的重構會導致進入帶寬查詢加載業務訂閱時,錯誤的查詢了當前內部帳號綁定的所有賬戶(多達4000多個)的業務訂閱,因此導致CPU負載高,tcp連接數高,頁面一直在等待響應。