來自:孤獨煙(微訊號:zrj_guduyan)
引言
不知道在大家面試中,有沒有遇到這個問題:
生產伺服器上部署了幾個java程式,突然出現了CPU100%的異常告警,你如何定位出問題呢?
這個問題分為兩版回答!
高調版
對不起,我是做研發的,這個問題在生產上是不可能遇見的!因為研發是不可能直接操作生產伺服器,如果貴公司能出現這個問題,應該要反思一下自己的許可權控制是否合理!
面試官心裡活動
:裝13是不是,趕緊走!
低調版
這個問題我在生產上沒碰到過,因為我們是沒法直接操作生產環境的。只能說,在測試環境曾經遇見過。操作步驟如下,balabala…
面試官心裡活動
:許可權控制的不錯,應該是在大廠獃過。
下麵開始我們的正文
正文
下麵給出兩種系統下的排查步驟,都是一模一樣的,只是命令稍有區別!
- 查消耗cpu最高的行程PID
- 根據PID查出消耗cpu最高的執行緒號
- 根據執行緒號查出對應的java執行緒,進行處理。
準備一行死迴圈程式碼:
怎麼跑,應該不用我說了,直接教大家怎麼查!
windows版
可能有人有疑問,我為什麼要說windows版的!因為,我曾經給很多政府部門做過系統。我發現他們用的是windows server,不是linux系統。所有必要說一下!
查消耗cpu最高的行程PID
手邊沒有windows server機器,我以win 10為例,截圖給大家看一下,先調出PID顯示項!
然後發現行程PID如下圖所示,為10856
接下來呢?
根據PID查出消耗cpu最高的執行緒號
這裡用到微軟的工具Process Explorer v16.22,地址如下
https://docs.microsoft.com/zh-cn/sysinternals/downloads/process-explorer
如圖所示
發現最耗cpu的執行緒的TId為6616
這是十進位制的資料,轉成十六進製為19d8
根據執行緒號查出對應的java執行緒,進行處理
執行命令,匯出行程快照
開啟檔案 c:/10856.stack,搜尋19d8,如下圖所示
根據檔案就可以看出,我們的TestFor.java
檔案第七行一直在跑,至此定位到問題
Linux版
Linux版本,步驟是一模一樣的,就是命令換了一下
查消耗cpu最高的行程PID
執行命令
- 執行
top -c
,顯示行程執行資訊串列。按下P,行程按照cpu使用率排序
如下圖所示,PID為3033的行程耗費cpu最高
根據PID查出消耗cpu最高的執行緒號
執行命令
top -Hp 3033
,顯示一個行程的執行緒執行資訊串列。按下P,行程按照cpu使用率排序
如下圖所示,PID為3034的執行緒耗費cpu最高
這是十進位制的資料,轉成十六進製為0xbda
根據執行緒號查出對應的java執行緒,進行處理
執行命令,匯出行程快照
jstack -l 3033 > ./3033.stack
然後執行,grep命令,看執行緒0xbda
做了什麼
cat 3033.stack |grep 'bda' -C 8
輸出如下
至此定位到問題
總結
大家記得一定要去實際操作一次!