一個應用占用CPU很高,除了确實是計算密集型應用之外,通常原因都是出現了死循環。
以我們最近出現的一個實際故障為例,介紹怎麼定位和解決這類問題。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SO1ADOwETN5AjMtATO3MDN2ATNxgjM3AzNxAjMtYjM5cjN58CX3AzNxAjMvwlNykzN2kzLcd2bsJ2Lc12bj5ycn9Gbi52YucTMwIzcldWYtl2Lc9CX6MHc0RHaiojIsJye.png)
根據top指令,發現PID為28555的Java程序占用CPU高達200%,出現故障。
通過ps aux | grep PID指令,可以進一步确定是tomcat程序出現了問題。但是,怎麼定位到具體線程或者代碼呢?
首先顯示線程清單:
ps -mp pid -o THREAD,tid,time
找到了耗時最高的線程28802,占用CPU時間快兩個小時了!
其次将需要的線程ID轉換為16進制格式:
printf "%x\n" tid
最後列印線程的堆棧資訊:
jstack pid |grep tid -A 30
找到出現問題的代碼了!
接下來就是具體分析代碼:ShortSocketIO.readBytes(ShortSocketIO.java:106)
最後,總結下排查CPU故障的方法和技巧有哪些:
1、top指令:Linux指令。可以檢視實時的CPU使用情況。也可以檢視最近一段時間的CPU使用情況。
2、PS指令:Linux指令。強大的程序狀态監控指令。可以檢視程序以及程序中線程的目前CPU使用情況。屬于目前狀态的采樣資料。
3、jstack:Java提供的指令。可以檢視某個程序的目前線程棧運作情況。根據這個指令的輸出可以定位某個程序的所有線程的目前運作狀态、運作代碼,以及是否死鎖等等。
4、pstack:Linux指令。可以檢視某個程序的目前線程棧運作情況。