【面試普通人VS高手系列】CPU飆高系統反應慢怎麼排查?
面試過程中,場景類的問題更容易檢測出一個開發人員的基本能力。
這不,一個小夥伴去阿里面試,第一面就遇到了關於“CPU飆高系統反應慢怎麼排查”的問題?
對於這個問題,我們來看看普通人和高手的回答!
普通人:
嗯, CPU飆高的原因可能是執行緒建立過多導致的。
高手:
好的,關於這個問題,我從四個方面來回答。
-
CPU是整個電腦的核心計算資源,對於一個應用程序來說,CPU的最小執行單元是執行緒。
-
導致CPU飆高的原因有幾個方面
-
CPU上下文切換過多,對於CPU來說,同一時刻下每個CPU核心只能執行一個執行緒,如果有多個執行緒要執行,CPU只能通過上下文切換的方式來執行不同的執行緒。上下文切換需要做兩個事情
- 儲存執行執行緒的執行狀態
- 讓處於等待中的執行緒執行
這兩個過程需要CPU執行核心相關指令實現狀態儲存,如果較多的上下文切換會佔據大量CPU資源,從而使得cpu無法去執行使用者程序中的指令,導致響應速度下降。
在Java中,檔案IO、網路IO、鎖等待、執行緒阻塞等操作都會造成執行緒阻塞從而觸發上下文切換
-
CPU資源過度消耗,也就是在程式中建立了大量的執行緒,或者有執行緒一直佔用CPU資源無法被釋放,比如死迴圈!
CPU利用率過高之後,導致應用中的執行緒無法獲得CPU的排程,從而影響程式的執行效率!
-
-
既然是這兩個問題導致的CPU利用率較高,於是我們可以通過
top
命令,找到CPU利用率較高的程序,在通過Shift+H
- CPU利用率過高的執行緒一直是同一個,說明程式中存線上程長期佔用CPU沒有釋放的情況,這種情況直接通過jstack獲得執行緒的Dump日誌,定位到執行緒日誌後就可以找到問題的程式碼。
- CPU利用率過高的執行緒id不斷變化,說明執行緒建立過多,需要挑選幾個執行緒id,通過jstack去執行緒dump日誌中排查。
-
最後有可能定位的結果是程式正常,只是在CPU飆高的那一刻,使用者訪問量較大,導致系統資源不夠。
以上就是我對這個問題的理解!
總結:
從這個問題來看,面試官主要考察實操能力,以及解決問題的思路。
如果你沒有實操過,但是你知道導致CPU飆高這個現象的原因,並說出你的解決思路,通過面試是沒問題的。
如果你在面試的時候遇到了一些比較刁鑽也奇葩的問題,歡迎私信或在評論區給我留言。
我是Mic,一個工作了14年的Java程式設計師,咱們下篇文章再見。