一個應(yīng)用占用CPU很高俗冻,除了確實(shí)是計算密集型應(yīng)用之外,通常原因都是出現(xiàn)了死循環(huán)牍颈。
以我們最近出現(xiàn)的一個實(shí)際故障為例迄薄,介紹怎么定位和解決這類問題。
第一步:找出占用較高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命令腌且」8危可以查看實(shí)時的CPU使用情況。也可以查看最近一段時間的CPU使用情況铺董。
2巫击、PS命令:Linux命令。強(qiáng)大的進(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)前線程棧運(yùn)行情況弓颈。根據(jù)這個命令的輸出可以定位某個進(jìn)程的所有線程的當(dāng)前運(yùn)行狀態(tài)、運(yùn)行代碼删掀,以及是否死鎖等等翔冀。
4、pstack:Linux命令披泪∠俗樱可以查看某個進(jìn)程的當(dāng)前線程棧運(yùn)行情況。