目錄
- 學習內容與快速應用路徑
- 第一階段:理解 CPU 核心概念 (0.5天)
- 第二階段:掌握核心監控命令與指標 (1-2天)
- 第三階段:識別 CPU 問題與瓶頸 (核心技能)
- 第四階段:整合到性能測試工作流程 (快速應用落地)
- 快速應用到工作中的關鍵策略
零基礎學習 Linux CPU 監控并快速應用到性能測試工作中,關鍵在于 理解核心指標、掌握實用命令、識別瓶頸模式、關聯性能影響。下面是一個聚焦 CPU 監控的詳細學習路徑,助你快速上手:
核心目標:
- 理解 CPU 時間組成: 知道 CPU 時間花在用戶態、內核態、等待 I/O 等不同狀態上的含義。
- 掌握核心監控命令: 熟練使用
top
/htop
,vmstat
,mpstat
,pidstat
,sar
查看 CPU 狀態。 - 識別關鍵 CPU 指標: 能解讀
%us
,%sy
,%wa
,%id
,load average
, 運行隊列長度等指標的含義和健康閾值。 - 定位 CPU 瓶頸與問題: 能判斷 CPU 過載、I/O 等待瓶頸、進程競爭、配置不足等問題。
- 整合到性能測試流程: 在壓測過程中實時監控 CPU,并在報告中分析 CPU 使用情況及其對性能的影響。
學習內容與快速應用路徑
第一階段:理解 CPU 核心概念 (0.5天)
-
CPU 核心 (Cores) vs 線程 (Threads):
- 物理核心: 實實在在的處理器單元。
lscpu
命令查看Core(s) per socket
。 - 邏輯核心 (通常說的 vCPU): 通過超線程 (Hyper-Threading) 技術,一個物理核心可以模擬出兩個邏輯核心。
lscpu
查看CPU(s)
或top
按1
看到的數量。性能監控主要關注邏輯核心。 - 快速應用認知: 運行
lscpu | grep -E '^CPU\(s\):|Core\(s\) per socket|Thread\(s\) per core'
了解你的服務器 CPU 配置。
- 物理核心: 實實在在的處理器單元。
-
CPU 時間組成 (理解
top
/mpstat
輸出):%us
(User): CPU 花費在運行 用戶空間應用程序代碼 上的時間百分比。高%us
通常意味著應用自身計算密集。%sy
(System): CPU 花費在運行 內核空間系統調用和中斷處理 上的時間百分比。高%sy
可能表示系統調用頻繁、進程切換過多、內核鎖競爭或驅動問題。%ni
(Nice): CPU 花費在運行 低優先級 (nice) 用戶進程 上的時間百分比。通常占比很小,可忽略。%id
(Idle): CPU 空閑 時間百分比。理想狀態下,壓測時%id
應很低。%wa
(I/O Wait): 最關鍵指標之一! CPU 在 等待磁盤 I/O 或網絡 I/O 操作完成 而空閑的時間百分比。高%wa
表示 CPU 想干活但被慢速 I/O 卡住了,是 I/O 瓶頸的直接信號!%hi
(Hardware Interrupt): CPU 處理硬件中斷的時間百分比。通常很低。%si
(Software Interrupt): CPU 處理軟件中斷的時間百分比。通常很低。%st
(Steal): (僅虛擬化環境) 被 Hypervisor 偷走用于運行其他虛擬機的時間百分比。高%st
表示宿主機資源不足。- 核心關系:
%us + %sy + %ni + %id + %wa + %hi + %si + %st = 100%
- 快速應用認知: 壓測時,CPU 繁忙 (
%us + %sy
) 高是好事(資源利用充分),但%wa
高是壞事(I/O 阻塞)。 目標是讓 CPU 盡可能忙于計算 (%us
/%sy
),而不是等待 (%wa
)。
-
系統負載平均值 (Load Average):
- 是什么:
uptime
或top
第一行顯示的三個數字 (e.g.,load average: 1.25, 0.89, 0.75
)。 - 含義: 表示在過去的 1分鐘、5分鐘、15分鐘 內,系統處于可運行狀態 ? 或不可中斷睡眠狀態 (D - 通常等 I/O) 的 平均進程數。
- 如何解讀:
- 負載 < 邏輯核心數: 系統相對空閑或有空閑核心。
- 負載 ≈ 邏輯核心數: 系統資源利用充分,但可能沒有明顯排隊。
- 負載 > 邏輯核心數: 表示有進程在排隊等待 CPU 資源。數值越大,排隊越嚴重。
- 看趨勢: 結合 1min, 5min, 15min 值看負載是上升、下降還是穩定。壓測時關注 1min 負載。
- 重要: 負載高 ≠ CPU 利用率高! 負載包含了等待 I/O (
D
狀態) 的進程。高負載可能由高%us
/%sy
(CPU 忙) 或高%wa
(I/O 慢) 引起。 - 快速應用認知: 壓測時,如果
load average (1min)
持續遠高于邏輯 CPU 數,就需要結合%us
,%sy
,%wa
判斷是 CPU 真不夠用還是被 I/O 卡住了。
- 是什么:
第二階段:掌握核心監控命令與指標 (1-2天)
目標:熟練使用命令獲取數據,理解每個關鍵指標的含義和健康閾值。
-
top
/htop
命令 (進程級監控,首選htop
):- 命令:
top
(動態刷新) 或htop
(更友好,yum install htop
/apt install htop
) - CPU 相關視圖 (頂部匯總行):
%Cpu(s)
: 顯示的是 所有邏輯 CPU 的平均使用率。按1
可切換顯示每個邏輯 CPU 核心的詳情。- 關鍵指標:
us
,sy
,ni
,id
,wa
,hi
,si
,st
(含義同上)。 Tasks
: 總進程數,以及處于運行 (R
)、睡眠 (S
)、停止 (T
)、僵尸 (Z
)、不可中斷睡眠 (D
) 狀態的進程數。關注R
(運行中) 和D
(等 I/O) 的數量。Load average
: 系統負載。
- 進程列表:關鍵列:
%CPU
: 該進程占用單個邏輯 CPU 核心的百分比。 如果一個進程占滿一個核心,就是 100%。注意:多核系統中,一個進程的%CPU
可以超過 100% (如占用 2 個核心就是 200%)。TIME+
: 該進程累計使用的 CPU 時間。P
(僅htop
): 進程優先級。STATE
: 進程狀態 (R
=運行,S
=可中斷睡眠,D
=不可中斷睡眠/等 I/O,Z
=僵尸,T
=停止)。
- 健康閾值 (經驗值):
- 整體 CPU:
%us + %sy
: < 70-80% 通常較安全。持續 > 80-90% 表示 CPU 是瓶頸。%wa
: 理想是 0%。 > 1-2% 需關注, > 5-10% 是嚴重 I/O 瓶頸。 - 負載: 1min Load Avg < 邏輯核心數較理想。持續 > 邏輯核心數表示資源緊張。> 2倍邏輯核心數通常有問題。
- 整體 CPU:
- 快速應用:
- 壓測時運行
htop
。 - 按
%CPU
(F6 -> PERCENT_CPU) 降序排序,找出 CPU 消耗最高的進程。 - 觀察頂部匯總行的
us
,sy
,wa
變化。 - 按
1
查看每個核心的利用率是否均衡?是否有核心被 100% 占用而其他空閑? - 關注
Tasks
行R
和D
的數量變化。
- 壓測時運行
- 命令:
-
mpstat
命令 (多核 CPU 詳細統計):- 命令:
mpstat [-P {ALL | 0,1,2...}] [間隔秒數] [次數]
(通常mpstat -P ALL 1
:每秒報告一次所有邏輯核心的統計) - 作用:
top
顯示的是平均值,mpstat
能詳細展示每個邏輯 CPU 核心的使用情況,是分析 CPU 負載均衡和不均衡問題的利器。 - 輸出解讀 (關鍵列):
Linux ... (4 CPU) 10:30:00 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle 10:30:01 AM all 25.00 0.00 15.00 0.25 0.00 0.25 0.00 0.00 0.00 59.50 10:30:01 AM 0 40.00 0.00 20.00 0.00 0.00 0.00 0.00 0.00 0.00 40.00 10:30:01 AM 1 10.00 0.00 10.00 0.00 0.00 0.00 0.00 0.00 0.00 80.00 10:30:01 AM 2 30.00 0.00 20.00 1.00 0.00 1.00 0.00 0.00 0.00 48.00 10:30:01 AM 3 20.00 0.00 10.00 0.00 0.00 0.00 0.00 0.00 0.00 70.00
CPU
: 核心編號 (all
表示平均)。%usr
: 等同于%us
。%sys
: 等同于%sy
。%iowait
: 等同于%wa
。%idle
: 等同于%id
。%irq
,%soft
: 硬件/軟件中斷,通常很低。%steal
: 虛擬化環境被偷走的時間。
- 快速應用:
- 壓測時持續運行
mpstat -P ALL 1
。 - 核心關注點:
- 整體 (
all
) 的%usr
,%sys
,%iowait
。 - 各個核心 (
0
,1
,2
…) 的利用率是否均衡? 是否存在個別核心接近 100% 而其他空閑?(可能應用線程綁定或單線程瓶頸)。 - 是否有核心的
%iowait
特別高? (可能該核心處理的 I/O 請求慢)。
- 整體 (
- 壓測時持續運行
- 命令:
-
vmstat
命令 (系統級統計,包含 CPU 和隊列):- 命令:
vmstat [間隔秒數] [次數]
(如vmstat 1
:每秒刷新) - 輸出解讀 (重點關注 CPU 和進程隊列列):
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----r b swpd free buff cache si so bi bo in cs us sy id wa st2 1 0 1234567 98765 654321 0 0 1000 500 500 1000 30 15 50 5 0
procs
部分:r
(Running): 最重要隊列指標! 正在運行或等待 CPU 時間片的進程數。 如果r
持續大于邏輯 CPU 數,說明 CPU 資源不足,進程在排隊。壓測時重點監控!b
(Blocked): 處于不可中斷睡眠狀態 (D
) 的進程數 (通常是等待 I/O)。
cpu
部分:us
,sy
,id
,wa
,st
: 含義同top
/mpstat
,是所有 CPU 的平均值。
- 快速應用:
- 壓測時持續運行
vmstat 1
。 - 眼睛緊盯
r
列! 如果r
持續大于邏輯 CPU 核心數,是 CPU 資源不足 的強烈信號。 - 同時觀察
us
,sy
,wa
比例。 - 結合
b
列 (等 I/O 進程數) 和wa
判斷 I/O 影響。
- 壓測時持續運行
- 命令:
-
pidstat
命令 (精細的進程級 CPU 統計):- 命令:
pidstat [選項] [間隔秒數] [次數]
(常用pidstat -u 1
或pidstat -u -p <PID> 1
) - 作用: 比
htop
提供更詳細、更定時的單個進程 CPU 使用報告。特別適合監控特定進程。 - 輸出解讀 (
-u
選項):10:35:00 AM UID PID %usr %system %guest %CPU CPU Command 10:35:01 AM 1001 12345 75.00 10.00 0.00 85.00 2 java 10:35:01 AM 1002 54321 5.00 1.00 0.00 6.00 0 nginx
%usr
: 進程在用戶態消耗的 CPU 百分比。%system
: 進程在內核態消耗的 CPU 百分比。%guest
: 運行虛擬機消耗的 CPU (通常0)。%CPU
: 進程消耗的總 CPU 百分比 (所有核心上的總和)。 等同于htop
的%CPU
。CPU
: 進程最后運行在哪個邏輯 CPU 核心上。
- 快速應用:
- 用
htop
找到可疑的高 CPU 進程 PID。 - 針對該 PID 運行
pidstat -u -p <PID> 1
,持續監控其詳細的%usr
,%system
,%CPU
變化。 這有助于判斷是應用邏輯 (%usr
高) 還是系統調用 (%system
高) 消耗 CPU。 - 也可直接運行
pidstat -u 1
查看所有進程的 CPU 使用快照。
- 用
- 命令:
-
sar
命令 (歷史數據收集與分析):- 命令: 通常需要安裝 (
sysstat
包:yum install sysstat
/apt install sysstat
)。默認每10分鐘收集一次系統活動數據。 - 查看歷史 CPU:
sar -u [起始時間] [結束時間]
(e.g.,sar -u -s 10:00:00 -e 11:00:00
) - 查看當天 CPU:
sar -u
(默認顯示當天所有記錄) - 輸出解讀: 類似
mpstat
的all
行,顯示%user
,%nice
,%system
,%iowait
,%steal
,%idle
。 - 快速應用: 當壓測結束后,用
sar -u
或指定時間范圍查看壓測期間的 CPU 整體使用情況概覽和趨勢,特別是峰值 (%user
,%system
,%iowait
)。非常方便生成報告圖表。
- 命令: 通常需要安裝 (
第三階段:識別 CPU 問題與瓶頸 (核心技能)
-
CPU 資源不足 (CPU Bound):
- 現象:
%us + %sy
持續 > 80-90% (平均值或核心最大值)。%id
持續很低 (< 10-20%)。vmstat
的r
列持續 > 邏輯 CPU 數 (排隊嚴重)。load average (1min)
持續 > 邏輯 CPU 數且不斷上升。- 應用響應時間 (
RT
) 隨負載增加而顯著上升,吞吐量 (TPS
) 達到平臺無法提升。
- 原因: 應用計算邏輯復雜、線程/進程過多、配置不足、代碼效率低。
- 快速診斷:
vmstat 1
(看r
),mpstat -P ALL 1
(看各核%us+%sy
),htop
(按%CPU
排序找大戶)。 - 性能測試關聯: TPS 達到上限無法提升,RT 顯著增加,且
r
隊列長、%us+%sy
高。
- 現象:
-
I/O 等待瓶頸 (I/O Bound):
- 現象:
%wa
持續 > 5-10% (平均值或核心最大值)。vmstat
的b
列較高 (有進程在等 I/O)。- 可能伴隨
vmstat
的bi
/bo
(塊設備 I/O) 較高。 %us + %sy
可能并不高 (CPU 想干活但被 I/O 卡住)。load average
可能較高 (包含了等 I/O 的D
狀態進程)。- 應用響應時間 (
RT
) 不穩定或較高,TPS 上不去。
- 原因: 磁盤慢、磁盤過載、網絡慢、數據庫慢查詢、內存不足導致 Swap 頻繁讀寫。
- 快速診斷:
mpstat -P ALL 1
(看%iowait
),vmstat 1
(看%wa
,b
,bi
,bo
),iostat
(分析磁盤 I/O 詳情 - 后續學習)。 - 性能測試關聯: RT 高且波動大,TPS 上不去,
%wa
高是直接信號。 優化 I/O (磁盤/網絡/DB) 是重點。
- 現象:
-
內核瓶頸 (System Time High):
- 現象:
%sy
持續異常高 (e.g., > 30-40%)。%us
可能不高。- 可能伴隨
vmstat
的cs
(Context Switch - 上下文切換) 非常高。 - 系統整體感覺“不順暢”。
- 原因: 進程/線程數量過多導致頻繁切換、系統調用過于頻繁、鎖競爭激烈、網絡中斷處理過多、驅動問題。
- 快速診斷:
mpstat -P ALL 1
(看%sys
),vmstat 1
(看cs
,in
- 中斷),pidstat -w
(看進程級上下文切換),strace
/perf
(分析系統調用 - 進階)。 - 性能測試關聯: TPS/RT 表現不佳,且
%sy
異常高是主要線索。需要優化進程模型、減少系統調用或排查內核/驅動。
- 現象:
-
CPU 負載不均衡:
- 現象:
mpstat -P ALL 1
顯示個別核心利用率接近 100% (%us+%sy
),而其他核心利用率很低 (%id
高)。 - 原因: 單線程應用、進程/線程綁定 (CPU Affinity) 設置不合理、中斷處理集中在少數核心。
- 影響: 整體性能受限于最忙的核心,其他核心資源浪費。
- 快速診斷:
mpstat -P ALL 1
一目了然。 - 性能測試關聯: 限制了系統的水平擴展能力。需要應用支持多線程并行或調整親和性。
- 現象:
第四階段:整合到性能測試工作流程 (快速應用落地)
-
測試前準備:
- 確認監控工具可用:
htop
,vmstat
,mpstat
,pidstat
,sar
(安裝sysstat
)。 - 基線測量: 系統空閑時運行
mpstat -P ALL 1 5
,vmstat 1 5
,sar -u
記錄基線值。記錄lscpu
輸出。
- 確認監控工具可用:
-
壓測中實時監控 (開多個終端/tmux):
- 窗口 1:
vmstat 1
- 緊盯r
(運行隊列),b
(阻塞進程),us
,sy
,wa
列。r > CPU cores
是紅燈! - 窗口 2:
mpstat -P ALL 1
- 觀察整體和每個核心的%usr
,%sys
,%iowait
。 看是否均衡,是否有核心打滿,%wa
是否高。 - 窗口 3:
htop
- 按%CPU
(F6 -> PERCENT_CPU) 降序排序。 找出 CPU 消耗 Top 進程,觀察其%CPU
,STATE
, 所屬用戶。按1
看核心視圖。 - (可選) 窗口 4:
pidstat -u 1
- 針對htop
發現的疑似問題進程,用pidstat -u -p <PID> 1
精細監控。 - 核心關注:
- 當
r
持續 > 邏輯核心數時,記錄時間戳,并關聯此時 TPS 是否停滯/下降?RT 是否飆升? - 當
%wa
持續 > 5% 時,記錄時間戳,并關聯此時 RT 是否波動/上升?TPS 是否上不去? - 當某個核心
%usr+%sy
持續 > 95% 時,記錄時間戳和核心號。 - 當發現某個進程
%CPU
異常高時,記錄其 PID 和命令名。
- 當
- 窗口 1:
-
測試后分析與報告:
- 收集數據: 保存
vmstat
,mpstat
輸出,htop
截圖 (高負載時),sar -u
數據 (用sar -u -f /var/log/sa/saXX
查看歷史某天)。 - 分析關鍵點:
- CPU 利用率峰值:
%us
max,%sy
max,%wa
max (來自mpstat
/sar
)。 - 運行隊列峰值:
vmstat
中r
的最大值。 - 負載峰值:
load average (1min)
最大值 (來自sar -q
或top
記錄)。 - 瓶頸類型判斷: 是 CPU Bound (
%us+%sy
高,r
長), I/O Bound (%wa
高,b
高), 還是 System Bound (%sy
異常高)? - 不均衡性: 是否有核心長期打滿而其他空閑?
- Top 進程: 哪些進程消耗了最多的 CPU (
htop
/pidstat
)?
- CPU 利用率峰值:
- 報告撰寫:
- 清晰描述 CPU 監控結果: 列出關鍵指標峰值 (
%us max
,%sy max
,%wa max
,r max
,load max
)。 - 展示關聯性圖表/描述: 將
r > cores
的時間點、%wa
飆升的時間點、%us+%sy
接近 100% 的時間點 與 性能測試工具記錄的 RT 上升點、TPS 下降點/平臺點 精確對應起來。 - 指出問題與瓶頸:
- 如:“當
r
值持續在 8 (邏輯 CPU=4) 且%us+%sy
平均達 95% 時,TPS 穩定在 200 無法提升,平均 RT 從 50ms 升至 500ms,判斷為 CPU 資源不足瓶頸”。 - 或:“壓測全程
%wa
維持在 15-25%,vmstat
顯示b
列在 5-10,磁盤iostat
顯示%util
100%,判斷為磁盤 I/O 瓶頸導致 CPU 大量時間等待”。 - 或:“應用進程
app_server
的單個線程 (PID 1234
) 持續占用 CPU 核心 2 的 98%,導致該核心成為瓶頸”。
- 如:“當
- 給出建議:
- CPU Bound: 優化代碼算法、增加 CPU 資源 (更多/更強 CPU)、優化線程池配置、水平擴展。
- I/O Bound: 優化磁盤 (SSD、RAID)、優化數據庫 (索引、慢查詢)、優化網絡、增加內存減少 Swap。
- System Time High: 減少不必要的系統調用、優化鎖策略、調整進程/線程數、升級內核/驅動。
- 負載不均衡: 優化應用使其支持多線程并行、調整進程 CPU 親和性 (謹慎)、檢查中斷平衡。
- 清晰描述 CPU 監控結果: 列出關鍵指標峰值 (
- 收集數據: 保存
快速應用到工作中的關鍵策略
- 工具三板斧: 掌握
vmstat 1
(看隊列r
/wa
),mpstat -P ALL 1
(看核心利用率/iowait
),htop
(找進程) 這三個命令足矣覆蓋 90% 場景。pidstat
和sar
作為補充。 - 指標聚焦: 死死盯住
r
(運行隊列長度),%us+%sy
(CPU 計算忙),%wa
(CPU 等 I/O)。它們是判斷 CPU 瓶頸性質和嚴重程度的 黃金三角。 - 關聯分析: CPU 指標必須與性能測試結果關聯! 當
r
持續 > CPU 數 時,TPS 是否上不去了?當%wa
高時,RT 是否飆升了?這種關聯性是證明 CPU 是性能瓶頸的核心證據。 - 進程視角: 發現整體 CPU 高 (
%us+%sy
) 時,立刻用htop
按 CPU 排序,找出消耗最大的進程。 - 區分真假瓶頸:
%us+%sy
高 (r
高) 是真 CPU 不足。%wa
高是 I/O 慢拖累了 CPU。%id
高但負載高/RT 高可能是等鎖或其他資源。 - 理解負載含義:
load average > cores
不一定是 CPU 問題,可能是等 I/O (%wa
)。結合vmstat
的r
和b
分析。 - 動手實踐:
- 運行
stress -c 4
(模擬 CPU 負載) 觀察vmstat
,mpstat
,htop
變化。 - 運行
dd if=/dev/zero of=tempfile bs=1M count=1000 oflag=direct
(模擬磁盤寫,oflag=direct
繞過緩存增加%wa
) 觀察%wa
上升。 - 觀察不同負載下的 CPU 指標變化。
- 運行
總結: 零基礎快速掌握 Linux CPU 監控的核心就是 監控隊列 (vmstat r
), 區分忙閑 (mpstat us/sy/wa
), 定位元兇 (htop %CPU
),并將這些指標的變化 精準關聯 到 TPS 和 RT 上。通過幾次實際的性能測試,結合這個流程進行分析,你就能快速將 CPU 監控技能應用到工作中,有效判斷 CPU 是否成為瓶頸以及瓶頸的類型,為性能優化指明方向。祝你成功!