首頁>科技>

引言

不知道在大家面試中,有沒有遇到這個問題

生產伺服器上部署了幾個java程式,突然出現了CPU100%的異常告警,你如何定位出問題呢?

這個問題分為兩版回答!

高調版

對不起,我是做研發的,這個問題在生產上是不可能遇見的!因為研發是不可能直接操作生產伺服器,如果貴公司研發能遇到這個問題,應該要反思一下自己的許可權控制是否合理!

面試官心裡活動:裝13是不是,趕緊走!

低調版

這個問題我在生產上沒碰到過,因為我們是沒法直接操作生產環境的。只能說,在測試環境曾經遇見過。操作步驟如下,balabala...

面試官心裡活動:許可權控制的不錯,應該是在大廠呆過。

下面開始我們的正文

正文

下面給出兩種系統環節下的排查步驟,都是一模一樣的,只是命令稍有區別!

查消耗cpu最高的程序Pid根據Pid查出消耗cpu最高的執行緒號根據執行緒號查出對應的java執行緒,進行處理。

準備一行死迴圈程式碼

public class TestFor { public static void main(String[] args) { int random = 0; while (random < 100) { random = random * 10; } }}

怎麼跑,應該不用我說了,直接教大家怎麼查!

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

這是十進位制的資料,轉成十六進位制為0x19d8

根據執行緒號查出對應的java執行緒,進行處理

執行命令

jstack -l 10856 > c:/10856.stack

開啟檔案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

輸出如下

至此定位到問題

總結

大家記得一定要去實際操作一次!

  • 整治雙十一購物亂象,國家再次出手!該跟這些套路說再見了
  • 中美差距有多大?從9月新能源車銷量,看兩市場消費者傾向差異