線上應(yīng)用故障排查之一:高CPU占用

一個應(yīng)用占用CPU很高,除了確實是計算密集型應(yīng)用之外,通常原因都是出現(xiàn)了死循環(huán)。

以我們最近出現(xiàn)的一個實際故障為例,介紹怎么定位和解決這類問題。

第一步:找出占用較高CPU的PID

根據(jù)top命令,發(fā)現(xiàn)PID為28555的Java進(jìn)程占用CPU高達(dá)200%,出現(xiàn)故障。



通過ps aux | grep PID命令,可以進(jìn)一步確定是tomcat進(jìn)程出現(xiàn)了問題。但是,怎么定位到具體線程或者代碼呢?

第二步:顯示線程列表:

ps -mp PID -o THREAD,tid,time


找到了耗時最高的線程28802,占用CPU時間快兩個小時了!

第三步:將需要的線程ID轉(zhuǎn)換為16進(jìn)制格式:

printf "%x\n" TID


第四步:打印線程的堆棧信息:

jstack PID |grep TID -A 30

找到出現(xiàn)問題的代碼了!



最后,總結(jié)下排查CPU故障的方法和技巧有哪些:

1、top命令:Linux命令??梢圆榭磳崟r的CPU使用情況。也可以查看最近一段時間的CPU使用情況。

2、PS命令:Linux命令。強大的進(jìn)程狀態(tài)監(jiān)控命令。可以查看進(jìn)程以及進(jìn)程中線程的當(dāng)前CPU使用情況。屬于當(dāng)前狀態(tài)的采樣數(shù)據(jù)。

3、jstack:Java提供的命令??梢圆榭茨硞€進(jìn)程的當(dāng)前線程棧運行情況。根據(jù)這個命令的輸出可以定位某個進(jìn)程的所有線程的當(dāng)前運行狀態(tài)、運行代碼,以及是否死鎖等等。

4、pstack:Linux命令??梢圆榭茨硞€進(jìn)程的當(dāng)前線程棧運行情況。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容