因為這段時間一直在弄監控,但是工作還是在進行中
因為機器不多,所以今天早上巡檢了一下,看到一台生產機器上的CPU飆高
top
然后就請出了大神工具JVM
具體JVM的介紹看:http://www.cnblogs.com/smail-bao/p/6027756.html
CPU飆高的話,我們就是用jstack的工具
首先我們使用top查出來是哪個進程導致的CPU飆高
這里我們看到是PID號為11506的進程
這個進程對應的項目是哪個(為了后面可以把錯誤的定位發給相關的開發人員看),使用ps -aux | grep PID
但是我們怎么具體定位到具體的線程或者代碼呢?
首先顯示線程列表:
ps -mp pid -o THREAD,tid,time
從這里我們可以找到耗用最高的線程11508,占用CPU時間也有一分多鍾了
然后這里我們再將線程的TID轉換成十六進制,采用下面的這個方法
printf "%x\n" tid
從這里我們可以看到線程所對應的十六進制是2cf4
最后打印線程的堆棧信息:
jstack PID | grep TID -A100
然后我們把這段內容發給對應的開發,他就可以定位他的問題了
最后,總結下排查CPU故障的方法和技巧有哪些:
1、top命令:Linux命令。可以查看實時的CPU使用情況。也可以查看最近一段時間的CPU使用情況。
2、PS命令:Linux命令。強大的進程狀態監控命令。可以查看進程以及進程中線程的當前CPU使用情況。屬於當前狀態的采樣數據。
3、jstack:Java提供的命令。可以查看某個進程的當前線程棧運行情況。根據這個命令的輸出可以定位某個進程的所有線程的當前運行狀態、運行代碼,以及是否死鎖等等。
4、pstack:Linux命令。可以查看某個進程的當前線程棧運行情況。
文章轉自:http://blog.csdn.net/blade2001/article/details/9065985