1. 程式人生 > 其它 >CPU監控分析

CPU監控分析

相關工具

名稱 初始安裝 說明
uptime 顯示系統執行時間和cpu負載情況
top 可以實時動態地檢視系統的整體執行情況
htop × top高階版
mpstat × 多核cpu效能分析工具,實時檢視每個cpu的效能指標,以及所有cpu的平均指標
vmstat 檢視系統的整體使用情況
iostat × 檢視cpu和磁碟io使用情況
pidstat × 程序效能分析工具,實時檢視cpu、記憶體、I/O以及上下文切換等效能指標
strace 程式除錯工具,用來監察一個應用程式所使用的系統呼叫
perf × 內置於Linux 核心原始碼樹中的效能剖析(profiling)工具

平均負載

  • 獲取cpu平均負載的命令uptime或top,輸出格式為:load average: 0.00, 0.11, 0.13,代表了1分鐘,5分鐘,15分鐘內的平均負載(Load Average);
  • 平均負載:單位時間內,系統處於可執行狀態和不可中斷狀態的平均程序數,也就是平均活躍程序數,它和cpu使用率沒有直接的關係;
  • 可執行狀態的程序:正在使用cpu或者正在等待cpu的程序,也就是ps命令中處於R狀態(Running或Runnable)的程序;
  • 不可中斷狀態的程序:正處於核心態的關鍵流程中的程序,並且這些程序不可打斷,比如常見的等待硬體裝置I/O響應,也就是ps命令中處於D狀態(Uninterruptible Sleep或Disk Sleep)的程序;
  • 平均負載最理想的情況是等於cpu個數,如果超過cpu個數,則系統出現了過載。

CPU使用率

  • 獲取cpu使用率的命令有:top、vmstat、mpstat、iostat;
  • 引數含義:
    • usr(us): 表示使用者空間程式的cpu使用率(沒有通過nice排程);
    • sys(sy): 表示系統空間的cpu使用率,主要是核心程式;
    • nice(ni): 表示使用者空間且通過nice排程過的程式的cpu使用率;
    • idle(id): CPU空閒時間佔比;
    • iowait(wa): CPU等待IO佔比;
    • irq(hi): CPU處理硬中斷佔比;
    • soft(si): CPU處理軟中斷佔比;
    • steal(st):虛擬CPU無意識等待系統程式處理另外的虛擬處理器所花費時間的百分比。


  • cpu使用率:單位時間內cpu繁忙情況的統計和平均負載並不一定完全對應
    • cpu密集型程序:使用大量cpu會導致平均負載升高,此時cpu使用率也在升高;
    • I/O密集型程序:大量I/O操作的程序,等待I/O會導致平均負載升高,但cpu使用率不一定很高;
    • 大量等待cpu的程序排程也會導致平均負載升高,此時cpu使用率也會比較高。

上下文切換

  • Linux 是一個多工作業系統,它支援遠大於CPU數量的任務同時執行,這些任務實際上並不是真的在同時執行,而是因為系統在很短的時間內,將CPU輪流分配給它們,造成多工同時執行的錯覺;
  • 每個任務執行前,CPU都需要知道任務從哪裡載入、又從哪裡開始執行,也就是說,需要系統事先幫它設定好CPU暫存器和程式計數器(Program Counter,PC);
    • CPU暫存器,是 CPU 內建的容量小、但速度極快的記憶體;
    • 程式計數器,則是用來儲存CPU正在執行的指令位置、或者即將執行的下一條指令位置。它們都是CPU在執行任何任務前,必須的依賴環境,因此也被叫做CPU上下文。
  • CPU上下文切換,就是先把前一個任務的CPU上下文(也就是CPU暫存器和程式計數器)儲存起來,然後載入新任務的上下文到這些暫存器和程式計數器,最後再跳轉到程式計數器所指的新位置,執行新任務。而這些儲存下來的上下文,會儲存在系統核心中,並在任務重新排程執行時再次載入進來。這樣就能保證任務原來的狀態不受影響,讓任務看起來還是連續執行;
  • CPU 的上下文切換就可以分為幾個不同的場景,也就是程序上下文切換、執行緒上下文切換以及中斷上下文切換;
  • 獲取上下文切換的工具:vmstat,pidstat
    • vmstat檢視系統總體上下文切換
      • r(Running or Runnable):就緒佇列的長度,即,正在執行和等待 CPU 的程序數;
      • b(Blocked):處於不可中斷睡眠狀態的程序數;
      • cs(context switch):每秒上下文切換次數;
      • in(interrupt):每秒中斷次數。
    • pidstat檢視程序或執行緒上下文切換
      • cswch/s:每秒自願上下文切換次數;指程序無法獲取所需資源,導致的上下文切換。比如說, I/O、記憶體等系統資源不足時,就會發生自願上下文切換。
      • nvcswch/s:每秒非自願上下文切換次數。是指程序由於時間片已到等原因,被系統強制排程,進而發生的上下文切換。比如說,大量程序都在爭搶 CPU 時,就容易發生非自願上下文切換(系統的就緒佇列過長,也就是正在執行和等待 CPU 的程序數過多,導致大量上下文切換;而上下文切換又會導致系統 CPU 的佔用率升高)。
    • 程序上下文切換
  • 執行緒上下文切換
  • 上下文切換次數多少合理?
    • 每秒上下文切換次數多少才算正常,其實取決於系統本身的CPU效能。如果系統的上下文切換次數比較穩定,那麼從數百到一萬以內,都應該算是正常。但當上下文切換次數超過一萬次,或者切換次數出現數量級的增長時,很可能已經出現了效能問題。實際場景有如下幾個:
      • 自願上下文切換變多,說明程序都在等待資源,可能是發生了 I/O 等其他問題;
      • 非自願上下文切換變多,說明程序都在被強制排程(都在爭搶 CPU),說明CPU成了瓶頸;
      • 中斷次數變多,說明CPU被中斷處理程式佔用,還需要通過檢視 /proc/interrupts 檔案來分析具體的中斷型別。

典型用例

  • 負載高+iowait高:通過iostat同時檢視cpu和io的情況,一般可能為磁碟效能或者io佇列太多導致
  • 負載高+iowait低+user高:通過pidstat檢視負載高的程序,然後通過perf分析程序
  • 負載高+iowait低+user低:通過vmstat和pidstat檢視cpu上下文切換