一次線上CPU高的問題排查實踐

指尖逆蒼穹發表於2019-06-23

一次線上CPU高的問題排查實踐

前言

近期某一天上班一開電腦,就收到了運維警報,有兩臺服務CPU負載很高,同時收到一線同事反饋 系統訪問速度非常慢,幾乎無響應。

一個美好的早晨,最怕什麼就來什麼。只好推掉其他會議,專心搞定問題。

排查

登入系統一看,後端的介面訪問果然全部超時。

  1. 先使用top命令檢視下是由哪個程式佔用CPU較高。

一次線上CPU高的問題排查實踐

從圖上可看出,pid=26481的Java程式佔用了385%的CPU,機器是4核8G的配置。

2.然後檢視下是哪個Java應用 ps -ef | grep java
一次線上CPU高的問題排查實踐

發現是我們後端request服務的應用。

3.獲取pid後,可以檢視該程式下的執行緒列表。 命令: ps -mp pid -o THREAD,tid,time。

一次線上CPU高的問題排查實踐

.png)

這裡我們可以看出有4個執行緒,長時間佔用較高的CPU資源。拿到一個tid=26496,printf "%x\n" tid , 轉為16進位制:6780

4.使用jstack列印執行緒的堆疊資訊,./jstack pid | grep tid -A 30

一次線上CPU高的問題排查實踐

從圖上可看出,是由於該應用的GC異常導致CPU佔用較高。

5.匯出堆疊日誌分析。 jstack 26481 >> jstat.out

一次線上CPU高的問題排查實踐

解決問題

分析匯出jstat.out,查詢下RUNNABLE狀態的執行緒。

ps:這裡推薦一個分析日誌的網站,超級好用,能生成圖形介面的分析日誌。只需要將生產的日誌上傳。Java Thread Dump Analyzer https://fastthread.io/

一次線上CPU高的問題排查實踐

一次線上CPU高的問題排查實踐

最終發現是Excel大量匯出的問題。使用者匯出一年的財務報表,差不多近60萬條資料,由於系統匯出較慢,然後進行了多次點選下載,導致應用記憶體不足,頻繁GC, 導致CPU超高,系統假死。

至此問題發現,解決問題就變得簡單了。

  • 重啟應用,讓使用者使用優先。 最快捷、最有效的解決方式,哈哈
  • 前端限制按鈕點選次數。
  • 後端Excel下載優化(考慮阿里的easyexcel,詳細請看後續分享),以及將檔案下載獨立出一個微服務。

相關文章