- 使用者 CPU 使用率,包括使用者態 CPU 使用率(user)和低優先順序使用者態 CPU 使用率(nice),表示 CPU 在使用者態執行的時間百分比。使用者 CPU 使用率高,通常說明有應用程式比較繁忙。
- 系統 CPU 使用率,表示 CPU 在核心態執行的時間百分比(不包括中斷)。系統 CPU 使用率高,說明核心比較繁忙。
- 等待 I/O 的 CPU 使用率,通常也稱為 iowait,表示等待 I/O 的時間百分比。iowait 高,通常說明系統與硬體裝置的 I/O 互動時間比較長。
- 軟中斷和硬中斷的 CPU 使用率,分別表示核心呼叫軟中斷處理程式、硬中斷處理程式的時間百分比。它們的使用率高,通常說明系統發生了大量的中斷。
- 除了上面這些,還有在虛擬化環境中會用到的竊取 CPU 使用率(steal)和客戶 CPU 使用率(guest),分別表示被其他虛擬機器佔用的 CPU 時間百分比,和執行客戶虛擬機器的 CPU 時間百分比。
平均負載
- 除了上面這些,還有在虛擬化環境中會用到的竊取 CPU 使用率(steal)和客戶 CPU 使用率(guest),分別表示被其他虛擬機器佔用的 CPU 時間百分比,和執行客戶虛擬機器的 CPU 時間百分比。
- 理想情況下,平均負載等於邏輯 CPU 個數,這表示每個 CPU 都恰好被充分利用。如果平均負載大於邏輯 CPU 個數,就表示負載比較重了
上下文切換
- 上下文切換,本身是保證 Linux 正常執行的一項核心功能。但過多的上下文切換,會將原本執行程式的 CPU 時間,消耗在暫存器、核心棧以及虛擬記憶體等資料的儲存和恢復上,縮短程式真正執行的時間,成為效能瓶頸
- 無法獲取資源而導致的自願上下文切換;
- 被系統強制排程導致的非自願上下文切換.
CPU 效能分析的“指標篩選”清單
- cpu 效能工具有哪些
- 首先,平均負載的案例。我們先用 uptime, 檢視了系統的平均負載;而在平均負載升高後,又用 mpstat 和 pidstat ,分別觀察了每個 CPU 和每個程式 CPU 的使用情況,進而找出了導致平均負載升高的程式。
- 第二個,上下文切換的案例。我們先用 vmstat ,檢視了系統的上下文切換次數和中斷次數;然後通過 pidstat ,觀察了程式的自願上下文切換和非自願上下文切換情況;最後通過 pidstat ,觀察了執行緒的上下文切換情況,找出了上下文切換次數增多的根源,也就是我們的基準測試工具 sysbench
- 第三個,程式 CPU 使用率升高的案例。我們先用 top ,檢視了系統和程式的 CPU 使用情況,發現 CPU 使用率升高的程式是 php-fpm;再用 perf top ,觀察 php-fpm 的呼叫鏈,最終找出 CPU 升高的根源,也就是庫函式 sqrt()
- 第四個,系統的 CPU 使用率升高的案例。我們先用 top 觀察到了系統 CPU 升高,但通過 top 和 pidstat ,卻找不出高 CPU 使用率的程式。於是,我們重新審視 top 的輸出,又從 CPU 使用率不高但處於 Running 狀態的程式入手,找出了可疑之處,最終通過 perf record 和 perf report ,發現原來是短時程式在搗鬼。
- 第五個,不可中斷程式和殭屍程式的案例。我們先用 top 觀察到了 iowait 升高的問題,並發現了大量的不可中斷程式和殭屍程式;接著我們用 dstat 發現是這是由磁碟讀導致的,於是又通過 pidstat 找出了相關的程式。但我們用 strace 檢視程式系統呼叫卻失敗了,最終還是用 perf 分析程式呼叫鏈,才發現根源在於磁碟直接 I/O
- 最後一個,軟中斷的案例。我們通過 top 觀察到,系統的軟中斷 CPU 使用率升高;接著檢視 /proc/softirqs, 找到了幾種變化速率較快的軟中斷;然後通過 sar 命令,發現是網路小包的問題,最後再用 tcpdump ,找出網路幀的型別和來源,確定是一個 SYN FLOOD 攻擊導致的。
- “指標工具”指南
本作品採用《CC 協議》,轉載必須註明作者和本文連結