面試官:生產(chǎn)環(huán)境中 CPU 利用率飆高怎么辦?
生產(chǎn)環(huán)境中 CPU 利用率飆高的情況該如何排查?你是否在面試的時候也被問到過類似的問題呢?今天,我們就一起研究一下。
問題排查
讓 CPU 燥起來
首先,我們需要讓 CPU 燥起來。寫一個死循環(huán)來瘋狂占用 CPU 資源:
查看 CPU 運行情況
然后,運行上面這個小程序,再通過 top 命令來查看一下系統(tǒng)資源的使用情況:

圖中灰色背景的 %CPU 字段就是我們需要關(guān)注的指標(biāo),它表示每個進程對于 CPU(單個核)占用的時間百分比。可以看到,我們的程序?qū)?CPU 的占用率為 75.1%。
定位作妖的線程
接下來我們再進一步查看具體是哪個線程占用了過多的 CPU 資源。執(zhí)行如下命令:
?top?-Hp?1683
H 代表查看線程視圖,p 用來指定具體的進程 ID,上面的命令就是用來查看進程1683 中所有線程的執(zhí)行情況。

可以看到,占用 CPU 最多的線程就是那個 while (true) 線程——cpu test。
找出問題所在
找到了作妖的線程以后,就好辦了,接下來通過 jstack 命令就可以看到該線程的運行棧信息了。不過在此之前,需要先做一個進制轉(zhuǎn)換:
將十進制的線程 ID(17706)轉(zhuǎn)換成十六進制(452a)
有了十六進制的線程 ID 以后,就可以通過 jstack 命令來精確定位導(dǎo)致 CPU 飆高的代碼了。

OK,我們找到了導(dǎo)致 CPU 飆高的「罪魁禍?zhǔn)住?,?CPU.class 的第 8 行:

以上就是開頭那個問題的標(biāo)準(zhǔn)答案了。中小型公司可能會這樣來處理,但是,大型公司基本上不會這樣搞。第一,不會讓你隨便登錄生產(chǎn)服務(wù)器;第二,服務(wù)器太多,這種方式根本管不過來。所以,一般都會有成體系的監(jiān)控平臺。
TOP 命令相關(guān)指標(biāo)
top 命令除了查看 CPU 的使用情況外,還有很多很有用的信息。下面對這些指標(biāo)做一個簡要說明,供參考。
概要信息

當(dāng)然任務(wù)(進程/線程)情況

CPU 資源使用情況

內(nèi)存情況
物理內(nèi)存

swap

進程/線程詳情
