一個應用佔用CPU很高,除了確實是計算密集型應用以外,一般緣由都是出現了死循環。java
以咱們最近出現的一個實際故障爲例,介紹怎麼定位和解決這類問題。tomcat
根據top命令,發現PID爲28555的Java進程佔用CPU高達200%,出現故障。.net
經過ps aux | grep PID命令,能夠進一步肯定是tomcat進程出現了問題。可是,怎麼定位到具體線程或者代碼呢?線程
首先顯示線程列表:blog
ps -mp pid -o THREAD,tid,time進程
找到了耗時最高的線程28802,佔用CPU時間快兩個小時了!get
其次將須要的線程ID轉換爲16進制格式:it
printf "%x\n" tidclass
最後打印線程的堆棧信息:監控
jstack pid |grep tid -A 30
找到出現問題的代碼了!
接下來就是具體分析代碼:ShortSocketIO.readBytes(ShortSocketIO.java:106)
最後,總結下排查CPU故障的方法和技巧有哪些:
一、top命令:Linux命令。能夠查看實時的CPU使用狀況。也能夠查看最近一段時間的CPU使用狀況。
二、PS命令:Linux命令。強大的進程狀態監控命令。能夠查看進程以及進程中線程的當前CPU使用狀況。屬於當前狀態的採樣數據。
三、jstack:Java提供的命令。能夠查看某個進程的當前線程棧運行狀況。根據這個命令的輸出能夠定位某個進程的全部線程的當前運行狀態、運行代碼,以及是否死鎖等等。
四、pstack:Linux命令。能夠查看某個進程的當前線程棧運行狀況。