1. 程式人生 > >雲伺服器 ECS Linux 系統 CPU 佔用率較高問題排查思路

雲伺服器 ECS Linux 系統 CPU 佔用率較高問題排查思路

如果雲伺服器 ECS Linux 系統的 CPU 持續跑高,則會對系統穩定性和業務執行造成影響。本文對 CPU 佔用率較高問題的排查分析做簡要說明。

可以通過 vmstat 從系統維度檢視 CPU 資源的使用情況。

用法說明:

  1. 格式:vmstat -n 1
  2. -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 00070352169448

    44845200041011009900000703761694484484840000175406001000000070376169448448484000017341401990000070376169448448484000128212429309610^C

回顯說明:

返回結果中的主要資料列說明: 

  • r: 表示系統中 CPU 等待處理的執行緒。由於 CPU 每次只能處理一個執行緒,所以,該數值越大,通常表示系統執行越慢。
  • us:使用者模式消耗的 CPU 時間百分比。該值較高時,說明使用者程序消耗的 CPU 時間比較多,比如,如果該值長期超過 50%,則需要對程式演算法或程式碼等進行優化。
  • sy:核心模式消耗的 CPU 時間百分比。
  • wa:IO 等待消耗的 CPU 時間百分比。該值較高時,說明 IO 等待比較嚴重,這可能磁碟大量作隨機訪問造成的,也可能是磁碟效能出現了瓶頸。
  • id:處於空閒狀態的 CPU 時間百分比。如果該值持續為 0,同時 sy 是 us 的兩倍,則通常說明系統則面臨著 CPU 資源的短缺。

可以通過 top 從程序緯度來檢視其 CPU、記憶體等資源的使用情況。

用法說明:

  1. 格式:top
  2. 示例輸出: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

  3. PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1 root 2004141238242308 S 0.00.40:19.01 systemd 2 root 200000 S 0.00.00:00.04 kthreadd

回顯說明:

預設介面上第三行會顯示當前 CPU 資源的總體使用情況,下方會顯示各個程序的資源佔用情況。

可以直接在介面輸入大小字母 P,來使監控結果按 CPU 使用率倒序排列,進而定位系統中佔用 CPU 較高的程序。最後,根據系統日誌和程式自身相關日誌,對相應程序做進一步排查分析,以判斷其佔用過高 CPU 的原因。

操作案例

如前面所述,可以通過 top 命令檢視系統的負載問題,並定位耗用較多 CPU 資源的程序。

可以直接在 top 執行介面快速終止相應的異常程序。說明如下:

  1. 想要終止某個程序,只需按下小寫的 k 鍵。
  2. 輸入想要終止的程序 PID (top 輸出結果的第一列)。比如,如下圖所示,假如想要終止 PID 為 23 的程序,輸入 23 後按回車。

     
  3. 如下圖所示,操作成功後,介面會出現類似 “Send pid 23 signal [15/sigterm]” 的提示資訊讓使用者進行確認。按回車確認即可。
  • 問題描述:
    Linux 系統沒有業務程式執行,通過 top 觀察,類似如下圖所示,CPU 很空閒,但是 load average 卻非常高:
  •  處理辦法
    load average 是對 CPU 負載的評估,其值越高,說明其任務佇列越長,處於等待執行的任務越多。
    出現此種情況時,可能是由於僵死程序導致的。可以通過指令 ps -axjf  檢視是否存在 D 狀態程序。
    D 狀態是指不可中斷的睡眠狀態。該狀態的程序無法被 kill,也無法自行退出。只能通過恢復其依賴的資源或者重啟系統來解決。

作業系統都用分頁機制來管理實體記憶體,作業系統將磁碟的一部分劃出來作為虛擬記憶體,由於記憶體的速度要比磁碟快得多,所以作業系統要按照某種換頁機制將不需要的頁面換到磁碟中,將需要的頁面調到記憶體中,由於記憶體持續不足,這個換頁動作持續進行,kswapd0是虛擬記憶體管理中負責換頁的,當伺服器記憶體不足的時候kswapd0會執行換頁操作,這個換頁操作是十分消耗主機CPU資源的。如果通過top發現該程序持續處於非睡眠狀態,且執行時間較長,可以初步判定系統在持續的進行換頁操作,可以將問題轉向記憶體不足的原因來排查。

  • 問題描述:
    kswapd0 程序佔用了系統大量 CPU 資源。
  • 處理辦法:
    Linux 系統通過分頁機制管理記憶體的同時,將磁碟的一部分劃出來作為虛擬記憶體。而 kswapd0 是 Linux 系統虛擬記憶體管理中負責換頁的程序。當系統記憶體不足時,kswapd0 會頻繁的進行換頁操作。而由於換頁操作非常消耗 CPU 資源,所以會導致該程序持續佔用較高 CPU 資源。
    如果通過 top 等監控發現 kswapd0 程序持續處於非睡眠狀態,且執行時間較長並持續佔用較高 CPU 資源,則通常是由於系統在持續的進行換頁操作所致。則可以通過 free 、ps 等指令進一步查詢系統及系統內程序的記憶體佔用情況,做進一步排查分析。