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