【面試普通人VS高手系列】CPU飆高系統反應慢怎麼排查?

面試過程中,場景類的問題更容易檢測出一個開發人員的基本能力。
這不,一個小夥伴去阿里面試,第一面就遇到了關於「CPU飆高系統反應慢怎麼排查」的問題?
對於這個問題,我們來看看普通人和高手的回答!

普通人:

嗯, CPU飆高的原因可能是執行緒創建過多導致的。

高手:
好的,關於這個問題,我從四個方面來回答。

  1. CPU是整個電腦的核心計算資源,對於一個應用進程來說,CPU的最小執行單元是執行緒。

  2. 導致CPU飆高的原因有幾個方面

    1. CPU上下文切換過多,對於CPU來說,同一時刻下每個CPU核心只能運行一個執行緒,如果有多個執行緒要執行,CPU只能通過上下文切換的方式來執行不同的執行緒。上下文切換需要做兩個事情

      1. 保存運行執行緒的執行狀態
      2. 讓處於等待中的執行緒執行

      這兩個過程需要CPU執行內核相關指令實現狀態保存,如果較多的上下文切換會佔據大量CPU資源,從而使得cpu無法去執行用戶進程中的指令,導致響應速度下降。

      在Java中,文件IO、網路IO、鎖等待、執行緒阻塞等操作都會造成執行緒阻塞從而觸發上下文切換

    2. CPU資源過度消耗,也就是在程式中創建了大量的執行緒,或者有執行緒一直佔用CPU資源無法被釋放,比如死循環!

    CPU利用率過高之後,導致應用中的執行緒無法獲得CPU的調度,從而影響程式的執行效率!

  3. 既然是這兩個問題導致的CPU利用率較高,於是我們可以通過top命令,找到CPU利用率較高的進程,在通過Shift+H找到進程中CPU消耗過高的執行緒,這裡有兩種情況。

    1. CPU利用率過高的執行緒一直是同一個,說明程式中存在執行緒長期佔用CPU沒有釋放的情況,這種情況直接通過jstack獲得執行緒的Dump日誌,定位到執行緒日誌後就可以找到問題的程式碼。
    2. CPU利用率過高的執行緒id不斷變化,說明執行緒創建過多,需要挑選幾個執行緒id,通過jstack去執行緒dump日誌中排查。
  4. 最後有可能定位的結果是程式正常,只是在CPU飆高的那一刻,用戶訪問量較大,導致系統資源不夠。

以上就是我對這個問題的理解!

總結:

從這個問題來看,面試官主要考察實操能力,以及解決問題的思路。

如果你沒有實操過,但是你知道導致CPU飆高這個現象的原因,並說出你的解決思路,通過面試是沒問題的。

如果你在面試的時候遇到了一些比較刁鑽也奇葩的問題,歡迎私信或在評論區給我留言。

我是Mic,一個工作了14年的Java程式設計師,咱們下篇文章再見。