一個應(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)前線程棧運行情況。