告訴你如何回答"線上CPU100%排查"面試問題

引言

不知道在你們面試中,有沒有遇到這個問題:java

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

這個問題分爲兩版回答!
高調版
對不起,我是作研發的,這個問題在生產上是不可能碰見的!由於研發是不可能直接操做生產服務器,若是貴公司能出現這個問題,應該要反思一下本身的權限控制是否合理!面試

面試官內心活動:裝13是否是,趕忙走!windows

低調版
這個問題我在生產上沒碰到過,由於咱們是無法直接操做生產環境的。只能說,在測試環境曾經碰見過。操做步驟以下,balabala…服務器

面試官內心活動:權限控制的不錯,應該是在大廠呆過。工具

 

Linux上執行過程:測試

一、top -c     【顯示進程運行信息列表。按下P,進程按照cpu使用率排序。發現PID爲3033的進程耗費cpu最高】
二、top -Hp 3033【顯示一個進程的線程運行信息列表。按下P,進程按照cpu使用率排序。發現PID爲3034的線程耗費cpu最高,printf %x 3034,將3034轉成十六進制爲0xbda】
三、jstack -l 3033 > ./3033.stack【執行命令,導出進程快照】
四、cat 3033.stack |grep 'bda' -C 8【執行grep命令,看線程0xbda作了什麼】spa

 

下面開始咱們的正文線程

正文

下面給出兩種系統下的排查步驟,都是如出一轍的,只是命令稍有區別!code

  • 查消耗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線程,進行處理

執行命令,導出進程快照

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

輸出以下

至此定位到問題

總結

你們記得必定要去實際操做一次!

相關文章
相關標籤/搜索