Linux 系統(tǒng) CPU 負(fù)載瘋漲?一線大廠排查方案與優(yōu)化圖譜
在Linux生產(chǎn)環(huán)境中,CPU使用率突然升高或系統(tǒng)負(fù)載激增會(huì)導(dǎo)致服務(wù)性能下降、響應(yīng)變慢甚至應(yīng)用崩潰。這些問(wèn)題常出現(xiàn)在高并發(fā)場(chǎng)景(如電商大促),通常由代碼缺陷、資源分配不當(dāng)或外部依賴瓶頸引起。缺乏有效診斷手段時(shí),運(yùn)維團(tuán)隊(duì)往往只能通過(guò)重啟系統(tǒng)來(lái)應(yīng)急處理,但這并不能根治問(wèn)題。
本文將通過(guò)實(shí)際案例,介紹如何早期識(shí)別CPU性能問(wèn)題,理解關(guān)鍵指標(biāo),定位問(wèn)題根源,并提出長(zhǎng)期解決方案,幫助建立既能應(yīng)對(duì)即時(shí)危機(jī)又能預(yù)防未來(lái)問(wèn)題的策略體系。
一、CPU負(fù)載的查詢分析
在Linux系統(tǒng)中,有一些常用的命令可以幫助我們查看進(jìn)程的狀態(tài)。在這篇文章里,我們將重點(diǎn)介紹兩個(gè)非常實(shí)用的工具——vmstat和top,并學(xué)習(xí)如何使用它們來(lái)更好地了解系統(tǒng)的運(yùn)行情況。
vmstat
top
ps -aux
ps -ef
1. vmstat
vmstat(虛擬內(nèi)存統(tǒng)計(jì)) 是一個(gè)非常有用的工具,它可以幫助我們從整體上了解操作系統(tǒng)的運(yùn)行狀況,包括虛擬內(nèi)存、進(jìn)程以及CPU等關(guān)鍵指標(biāo)。通過(guò)使用 vmstat 命令,我們可以輕松地獲取這些信息,從而更好地監(jiān)控和管理我們的系統(tǒng)。
下面是一些常用的 vmstat 命令示例:
vmstat [-n] [delay [count]]
- [-n]:只在開始時(shí)顯示一次各字段名稱。
- [delay]:刷新時(shí)間間隔。如果不指定,只顯示一條結(jié)果。
- [count]:刷新次數(shù)。如果不指定刷新次數(shù),但指定了刷新時(shí)間間隔,這時(shí)刷新次數(shù)為無(wú)窮。
(1) 使用示例
執(zhí)行如下命令,使用vmstat每1秒統(tǒng)計(jì)一次各進(jìn)程的CPU使用情況,連續(xù)統(tǒng)計(jì)4次。
vmstat -n 1 4
返回示例類似如下。
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 69832 32628 930612 0 0 1028 54 812 1534 5 2 92 1 0
0 0 0 69832 32636 930680 0 0 8 60 1391 2613 3 3 94 0 0
0 0 0 69832 32636 930676 0 0 0 0 1388 2584 1 1 98 0 0
0 0 0 69832 32636 930676 0 0 0 0 1343 2535 2 1 98 0 0
(2) 顯示結(jié)果主要字段說(shuō)明:
- r:等待CPU處理的任務(wù)數(shù)。數(shù)值越大,系統(tǒng)越慢。
- us:用戶程序占用的CPU時(shí)間比例。若長(zhǎng)期超過(guò)50%,建議優(yōu)化代碼或算法。
- sy:內(nèi)核使用CPU時(shí)間的比例。
- wa:CPU等待I/O操作完成的時(shí)間比例。值高表示磁盤讀寫慢或頻繁隨機(jī)訪問(wèn)。
- id:CPU空閑時(shí)間比例。若為0且sy是us兩倍,表明CPU不足。
2. top
在Linux系統(tǒng)中,top命令是一個(gè)非常實(shí)用的小幫手,它能夠?qū)崟r(shí)地向我們展示每個(gè)進(jìn)程是如何使用系統(tǒng)資源的。
top [-n] [-d]
- [-n]:刷新次數(shù)。如果不指定刷新次數(shù),但指定了刷新時(shí)間間隔,這時(shí)刷新次數(shù)為無(wú)窮。
- [-d] :刷新時(shí)間間隔。
(1) 使用示例
你可以試試下面的命令來(lái)查看系統(tǒng)里各個(gè)進(jìn)程用了多少資源。這個(gè)命令每2秒會(huì)刷新一次所有進(jìn)程的信息,刷新5次后就會(huì)自動(dòng)停下。
top -n 5 -d 2
系統(tǒng)顯示類似如下。
top - 12:40:17 up 1:18, 3 users, load average: 0.00, 0.06, 0.08
Tasks: 170 total, 1 running, 169 sleeping, 0 stopped, 0 zombie
%Cpu(s): 1.0 us, 0.5 sy, 0.0 ni, 98.5 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 1685.0 total, 71.2 free, 666.0 used, 947.9 buff/cache
MiB Swap: 0.0 total, 0.0 free, 0.0 used. 854.0 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2078 root 20 0 140536 17052 5120 S 1.3 1.0 1:21.08 AliYunDunMonito
1144 root 20 0 1276316 10180 8544 S 1.0 0.6 0:28.96 argusagent
(2) 顯示結(jié)果主要字段說(shuō)明
在查看CPU使用率和負(fù)載情況時(shí),您可以重點(diǎn)關(guān)注輸出結(jié)果中的第一行和第三行信息。
- 第一行:這里會(huì)顯示如 top - 12:40:17 up 1:18, 3 users, load average: 0.00, 0.06, 0.08 這樣的信息。它依次告訴了我們當(dāng)前的系統(tǒng)時(shí)間、系統(tǒng)自啟動(dòng)以來(lái)已經(jīng)運(yùn)行了多久、現(xiàn)在有多少用戶登錄到了系統(tǒng)中,以及過(guò)去1分鐘、5分鐘和15分鐘內(nèi)的平均系統(tǒng)負(fù)載情況。
- 第三行:這一行則概覽了整個(gè)系統(tǒng)的CPU資源使用概況。緊隨其后列出的是各個(gè)進(jìn)程具體的資源消耗詳情,幫助您了解哪些程序正在占用較多的計(jì)算資源。
使用 top 命令時(shí),可以通過(guò)幾個(gè)交互命令更有效地管理系統(tǒng):
- 按P鍵按CPU使用率從高到低排序進(jìn)程,便于發(fā)現(xiàn)占用大量計(jì)算資源的程序。
- 按 M鍵根據(jù)內(nèi)存使用量對(duì)進(jìn)程進(jìn)行排序。對(duì)于多核處理器,輸入 1 可查看每個(gè)核心的負(fù)載情況。
- 若要了解特定進(jìn)程運(yùn)行的具體程序,可以使用 ll /proc/PID/exe 查看其可執(zhí)行文件路徑。
root@didiplus:~# ll /proc/806/exe
lrwxrwxrwx 1 root root 0 Apr 3 16:27 /proc/806/exe -> /usr/local/bin/1panel*
要停止占用大量CPU資源的進(jìn)程,請(qǐng)按以下步驟操作:
- 輕敲鍵盤上的小寫字母 k。
- 輸入要結(jié)束進(jìn)程的PID(進(jìn)程標(biāo)識(shí)號(hào)),然后按Enter鍵。如果您不確定PID,可以選擇列表中的第一個(gè)。例如,要停止PID為23的進(jìn)程,輸入23后按Enter。
操作成功后,界面上會(huì)顯示類似Send pid 23 signal [15/sigterm]的提示信息。這時(shí),只需輕輕按一下Enter鍵確認(rèn)就可以了。
二、常見(jiàn)CPU資源過(guò)高案例分析
案例一:CPU使用率較低但負(fù)載較高
(1) 問(wèn)題現(xiàn)象
Linux系統(tǒng)上暫時(shí)沒(méi)有運(yùn)行任何業(yè)務(wù)程序。通過(guò)使用top命令查看時(shí),我們注意到CPU的使用率其實(shí)并不高,但奇怪的是,CPU的負(fù)載(load average)卻顯得異常高,就像下面的截圖所展示的一樣。
(2) 問(wèn)題原因
這個(gè)問(wèn)題可能是由于過(guò)多的僵尸(zombie)進(jìn)程引起的。Load average是用來(lái)衡量CPU負(fù)載的一個(gè)指標(biāo),它的值越高,意味著等待執(zhí)行的任務(wù)隊(duì)列越長(zhǎng),也就是說(shuō),有更多的任務(wù)正在排隊(duì)等待處理。
(3) 解決方案
可以通過(guò) ps -axjf 命令來(lái)檢查系統(tǒng)中是否存在處于 D+ 狀態(tài)的進(jìn)程。如果發(fā)現(xiàn)有進(jìn)程處于這種狀態(tài),它們暫時(shí)既不能被手動(dòng)終止,也無(wú)法自行退出。解決這個(gè)問(wèn)題的辦法通常是恢復(fù)這些進(jìn)程所依賴的資源,或者在必要時(shí)重啟系統(tǒng)。
案例二:kswapd0進(jìn)程占用CPU較高
(1) 問(wèn)題現(xiàn)象
服務(wù)器運(yùn)行得特別慢,用top命令查了下,發(fā)現(xiàn)kswapd0這個(gè)進(jìn)程占用了99%的CPU。
(2) 問(wèn)題原因
這個(gè)問(wèn)題可能是因?yàn)橄到y(tǒng)正在不停地進(jìn)行換頁(yè)操作,占用了大量的CPU資源。kswapd0是負(fù)責(zé)管理虛擬內(nèi)存中換頁(yè)的進(jìn)程。當(dāng)服務(wù)器內(nèi)存不夠用時(shí),kswapd0就會(huì)開始換頁(yè),而這個(gè)過(guò)程會(huì)消耗很多CPU資源。
(3) 解決方案
你可以通過(guò)調(diào)整vm.swappiness這個(gè)設(shè)置來(lái)改變系統(tǒng)使用交換空間的方式,這樣可以幫助減少kswapd0進(jìn)程占用太多CPU資源的問(wèn)題。
查看swappiness參數(shù):
cat /proc/sys/vm/swappiness
當(dāng)系統(tǒng)里的物理內(nèi)存使用超過(guò)60%(也就是空閑內(nèi)存低于40%)時(shí),就會(huì)開始用swap空間。
swappiness這個(gè)參數(shù)值設(shè)置得越低,Linux就越少用swap分區(qū),盡量多用物理內(nèi)存;而swappiness值越高,系統(tǒng)就越傾向于把數(shù)據(jù)放到swap空間里。
根據(jù)業(yè)務(wù)需求,你需要調(diào)整swappiness參數(shù)。具體操作是打開內(nèi)核參數(shù)配置文件sysctl.conf進(jìn)行修改。
vi /etc/sysctl.conf
根據(jù)業(yè)務(wù)需求,調(diào)整swappiness參數(shù)的值。具體操作是在sysctl.conf文件里找到vm.swappiness這一行,并將其設(shè)置為10(即寫成vm.swappiness = 10)。修改完成后,記得重新加載sysctl配置,這樣新設(shè)置才能生效。
sysctl -p
案例三:CPU使用率過(guò)高100%問(wèn)題排查
(1) 問(wèn)題現(xiàn)象
如果你發(fā)現(xiàn)CPU使用率飆到100%,但用top或htop這些工具又查不到具體是哪個(gè)進(jìn)程在占用CPU,這情況就比較麻煩了。
(2) 問(wèn)題原因
該問(wèn)題可能是病毒導(dǎo)致。
(3) 解決方案
看看你的Linux系統(tǒng)里的命令在過(guò)去30天內(nèi)有沒(méi)有被改動(dòng)過(guò)?那就用下面這條命令吧。
stat /usr/bin/top
系統(tǒng)顯示類似如下,系統(tǒng)命令有被修改。查看更改時(shí)間是否和監(jiān)控中CPU使用率出現(xiàn)100%的時(shí)間點(diǎn)吻合。
分別執(zhí)行如下命令,查看ps或top命令是否被修改過(guò)。
rpm -Vf /bin/ps
rpm -Vf /usr/bin/top
在一切正常的情況下,系統(tǒng)不會(huì)返回任何修改信息。如果遇到異常情況,系統(tǒng)會(huì)顯示類似以下的信息,這通常意味著ps和top命令可能已經(jīng)被修改了。
請(qǐng)您運(yùn)行以下命令,以檢查當(dāng)前實(shí)例是否連接到了任何異常的域名。
iftop -i [$Device] -n -P
[$Device]請(qǐng)?zhí)鎿Q為當(dāng)前系統(tǒng)使用的網(wǎng)卡,如eth0。
如果系統(tǒng)顯示了類似的信息,并且你之前沒(méi)有連接過(guò)crypto-pool.fr,那么這個(gè)域名可能是有問(wèn)題的。