面試過程中,場景類的問題更容易檢測出一個開發人員的基本能力。
這不,一個小伙伴去阿里面試,第一面就遇到了關於“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利用率過高的線程一直是同一個,說明程序中存在線程長期占用CPU沒有釋放的情況,這種情況直接通過jstack獲得線程的Dump日志,定位到線程日志后就可以找到問題的代碼。
- CPU利用率過高的線程id不斷變化,說明線程創建過多,需要挑選幾個線程id,通過jstack去線程dump日志中排查。
-
最后有可能定位的結果是程序正常,只是在CPU飆高的那一刻,用戶訪問量較大,導致系統資源不夠。
以上就是我對這個問題的理解!
總結:
從這個問題來看,面試官主要考察實操能力,以及解決問題的思路。
如果你沒有實操過,但是你知道導致CPU飆高這個現象的原因,並說出你的解決思路,通過面試是沒問題的。
如果你在面試的時候遇到了一些比較***鑽也奇葩的問題,歡迎私信或在評論區給我留言。
我是Mic,一個工作了14年的Java程序員,咱們下篇文章再見。