cpu過高問題排查
阿新 • • 發佈:2020-10-22
問題排查總結
最近一段時間 某臺伺服器上的一個應用總是隔一段時間就自己掛掉 用top看了看 從重新部署應用開始沒有多長時間CPU佔用上升得很快。top命令很快就找到了某個java程序佔用過高。
排查步驟
1、使用top定位到佔用cpu過高的進行PID
top
2、通過ps aux | grep PID命令
ps -mp pid -o THREAD,tid,time | sort -rn
3、將需要的執行緒ID轉換為16進位制格式
printf "%x\n" tid
4、列印執行緒的堆疊資訊 到了這一步具體看堆疊的日誌來定位問題了
jstack pid |grep tid -A 30
案例如下:
1.top
可以看出PID 733程序 的佔用CPU 172%
2.查詢程序733下的執行緒 可以看到TID 執行緒775佔用了96%且持有了很長時間 其實到這一步基本上能猜測到應該是 肯定是那段程式碼發生了死迴圈
ps -mp 733 -o THREAD,tid,time | sort -rn
3.執行緒ID轉換為16進位制格式
printf "%x\n" 775
4.檢視java 的堆疊資訊
jstack 733 |grep 307 -A 30
顯然是 SmsQueueServiceImpl 中的produceMissSms 和 consumeMissSms 方法有問題
和開發一起研究了一下這些程式碼,最後開發說應用一啟動的時候 spring初始化的就會執行這一段處理丟失訊息的程式碼 然後這段死迴圈程式碼 沒有任何作用
解決方法 即 註釋掉whlie(true)這一段程式碼
重新部署後 cpu佔用就很正常了