Java線上應用故障排查之一:高CPU佔用

一個應用佔用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命令。能夠查看某個進程的當前線程棧運行狀況。

相關文章
相關標籤/搜索