近期某一天上班一開電腦,就收到了運維警報,有兩臺服務CPU負載很高,同時收到一線同事反饋 系統訪問速度很是慢,幾乎無響應。前端
一個美好的早晨,最怕什麼就來什麼。只好推掉其餘會議,專心搞定問題。java
登陸系統一看,後端的接口訪問果真所有超時。後端
從圖上可看出,pid=26481的Java進程佔用了385%的CPU,機器是4核8G的配置。運維
2.而後查看下是哪一個Java應用 ps -ef | grep java
微服務
發現是咱們後端request服務的應用。優化
3.獲取pid後,能夠查看該進程下的線程列表。 命令: ps -mp pid -o THREAD,tid,time。網站
.png)線程
這裏咱們能夠看出有4個線程,長時間佔用較高的CPU資源。拿到一個tid=26496,printf "%x\n" tid , 轉爲16進制:6780日誌
4.使用jstack打印線程的堆棧信息,./jstack pid | grep tid -A 30excel
從圖上可看出,是因爲該應用的GC異常致使CPU佔用較高。
5.導出堆棧日誌分析。 jstack 26481 >> jstat.out
分析導出jstat.out,查找下RUNNABLE狀態的線程。
ps:這裏推薦一個分析日誌的網站,超級好用,能生成圖形界面的分析日誌。只須要將生產的日誌上傳。Java Thread Dump Analyzer https://fastthread.io/
最終發現是Excel大量導出的問題。用戶導出一年的財務報表,差很少近60萬條數據,因爲系統導出較慢,而後進行了屢次點擊下載,致使應用內存不足,頻繁GC, 致使CPU超高,系統假死。
至此問題發現,解決問題就變得簡單了。