CPU突然飆高,系統反應慢怎么排查,我來教教你
開發人員的基本能力。這不,有一位小伙伴去阿里面試,第一面就遇到了關于“CPU 飆高系統反應慢怎么排查”的問題?當時這位小伙伴不知從何下手。
今天,我給大家分享一下我的解決思路。
CPU 是整個電腦的核心計算資源,對于一個應用進程來說,CPU 的最小執行單元是線程。導致 CPU 飆高的原因有以下兩個:
1.CPU 上下文切換過多
對于 CPU 來說,同一時刻下每個 CPU 核心只能運行一個線程,如果有多個線程要執行,CPU 只能通過上下文切換的方式來執行不同的線程。上下文切換需要做兩個事情
保存運行線程的執行狀態
讓處于等待中的線程執行
這兩個過程需要 CPU 執行內核相關指令實現狀態保存,如果較多的上下文切換會占據大量CPU 資源,從而使得 CPU 無法去執行用戶進程中的指令,導致響應速度下降。在 Java 中,文件 IO、網絡 IO、鎖等待、線程阻塞等操作都會造成線程阻塞從而觸發上下文切換。
2.CPU 資源過度消耗
也就是在程序中創建了大量的線程,或者有線程一直占用CPU 資源無法被釋放,比如死循環!CPU 利用率過高之后,導致應用中的線程無法獲得 CPU 的調度,從而影響程序的執行效率!既然是這兩個問題導致的 CPU 利用率較高,于是我們可以通過 top 命令,找到CPU 利用率較高的進程,在通過 Shift+H 找到進程中 CPU 消耗過高的線程,這里有兩種情況。
CPU 利用率過高的線程一直是同一個,說明程序中存在線程長期占用 CPU 沒有釋放的情況,這種情況直接通過 jstack 獲得線程的 Dump 日志,定位到線程日志后就可以找到問題的代碼。
CPU 利用率過高的線程 ID 不斷變化,說明線程創建過多,需要挑選幾個線程 ID,通過 jstack 去線程 dump 日志中排查。最后有可能定位的結果是程序正常,只是在 CPU 飆高的那一刻,用戶訪問量較大,導致系統資源不夠。
以上就是我對這個問題的理解!從這個問題來看,面試官主要考察實操能力,以及解決問題的思路。如果你沒有實操過,但是你知道導致 CPU 飆高這個現象的原因,并說出你的解決思路,通過面試是沒問題的。