Linux服務器帶寬和CPU跑滿或跑高排查
CPU 負載查看方法
使用 vmstat 查看系統緯度的 CPU 負載
使用 top 查看進程緯度的 CPU 負載
使用 vmstat 查看系統緯度的 CPU 負載
可以通過 vmstat 從系統維度查看 CPU 資源的使用情況。
用法說明:
格式:vmstat -n 1# -n 1 表示結果一秒刷新一次。示例輸出:$ vmstat -n 1procs —————-memory————— —-swap— ——-io—— -system— ———cpu——- r b swpd free buff cache si so bi bo in cs us sy id wa st 0 0 0 70352 169448 448452 0 0 0 4 10 11 0 0 99 0 0 0 0 0 70376 169448 448484 0 0 0 0 175 406 0 0 100 0 0 0 0 0 70376 169448 448484 0 0 0 0 173 414 0 1 99 0 0 0 0 0 70376 169448 448484 0 0 0 128 212 429 3 0 96 1 0^C
回顯說明:
返回結果中的主要數據列說明:
r: 表示系統中 CPU 等待處理的線程。由于 CPU 每次只能處理一個線程,所以,該數值越大,通常表示系統運行越慢。
us:用戶模式消耗的 CPU 時間百分比。該值較高時,說明用戶進程消耗的 CPU 時間比較多,比如,如果該值長期超過 50%,則需要對程序算法或代碼等進行優化。
sy:內核模式消耗的 CPU 時間百分比。
wa:IO 等待消耗的 CPU 時間百分比。該值較高時,說明 IO 等待比較嚴重,這可能磁盤大量作隨機訪問造成的,也可能是磁盤性能出現了瓶頸。
id:處于空閑狀態的 CPU 時間百分比。如果該值持續為 0,同時 sy 是 us 的兩倍,則通常說明系統則面臨著 CPU 資源的短缺。
使用 top 查看進程緯度的 CPU 負載
可以通過 top 從進程緯度來查看其 CPU、內存等資源的使用情況。
用法說明:
格式:top示例輸出:top - 17:27:13 up 27 days, 3:13, 1 user, load average: 0.02, 0.03, 0.05Tasks: 94 total, 1 running, 93 sleeping, 0 stopped, 0 zombie%Cpu(s): 0.3 us, 0.1 sy, 0.0 ni, 99.5 id, 0.0 wa, 0.0 hi, 0.0 si, 0.1 stKiB Mem: 1016656 total, 946628 used, 70028 free, 169536 buffersKiB Swap: 0 total, 0 used, 0 free. 448644 cached Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1 root 20 0 41412 3824 2308 S 0.0 0.4 0:19.01 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.04 kthreadd
回顯說明:
默認界面上第三行會顯示當前 CPU 資源的總體使用情況,下方會顯示各個進程的資源占用情況。
可以直接在界面輸入大小字母 P,來使監控結果按 CPU 使用率倒序排列,進而定位系統中占用 CPU 較高的進程。最后,根據系統日志和程序自身相關日志,對相應進程做進一步排查分析,以判斷其占用過高 CPU 的原因。
操作案例
使用 top 直接終止 CPU 消耗較大的進程
如前面所述,可以通過 top 命令查看系統的負載問題,并定位耗用較多 CPU 資源的進程。
可以直接在 top 運行界面快速終止相應的異常進程。說明如下:
想要終止某個進程,只需按下小寫的 k 鍵。
輸入想要終止的進程 PID (top 輸出結果的第一列)。比如,如下圖所示,假如想要終止 PID 為 23 的進程,輸入 23 后按回車。
如下圖所示,操作成功后,界面會出現類似 “Send pid 23 signal [15/sigterm]” 的提示信息讓用戶進行確認。按回車確認即可。
CPU 使用率較低但負載較高
問題描述:
Linux 系統沒有業務程序運行,通過 top 觀察,類似如下圖所示,CPU 很空閑,但是 load average 卻非常高:
處理辦法:
load average 是對 CPU 負載的評估,其值越高,說明其任務隊列越長,處于等待執行的任務越多。
出現此種情況時,可能是由于僵死進程導致的。可以通過指令 ps -axjf 查看是否存在 D 狀態進程。
D 狀態是指不可中斷的睡眠狀態。該狀態的進程無法被 kill,也無法自行退出。只能通過恢復其依賴的資源或者重啟系統來解決。
kswapd0 進程占用 CPU 較高
操作系統都用分頁機制來管理物理內存,操作系統將磁盤的一部分劃出來作為虛擬內存,由于內存的速度要比磁盤快得多,所以操作系統要按照某種換頁機制將不需要的頁面換到磁盤中,將需要的頁面調到內存中,由于內存持續不足,這個換頁動作持續進行,kswapd0是虛擬內存管理中負責換頁的,當服務器內存不足的時候kswapd0會執行換頁操作,這個換頁操作是十分消耗主機CPU資源的。如果通過top發現該進程持續處于非睡眠狀態,且運行時間較長,可以初步判定系統在持續的進行換頁操作,可以將問題轉向內存不足的原因來排查。
問題描述:
kswapd0 進程占用了系統大量 CPU 資源。
處理辦法:
Linux 系統通過分頁機制管理內存的同時,將磁盤的一部分劃出來作為虛擬內存。而 kswapd0 是 Linux 系統虛擬內存管理中負責換頁的進程。當系統內存不足時,kswapd0 會頻繁的進行換頁操作。而由于換頁操作非常消耗 CPU 資源,所以會導致該進程持續占用較高 CPU 資源。
如果通過 top 等監控發現 kswapd0 進程持續處于非睡眠狀態,且運行時間較長并持續占用較高 CPU 資源,則通常是由于系統在持續的進行換頁操作所致。則可以通過 free 、ps 等指令進一步查詢系統及系統內進程的內存占用情況,做進一步排查分析。