vmstat(Virtual Memory Statistics)是 Linux 系統管理員進行效能診斷的瑞士軍刀。它能即時顯示虛擬記憶體、程序、CPU、I/O 等關鍵指標,幫助快速定位瓶頸。本文深度解析各欄位含義、進階用法與實戰分析技巧。
命令語法與常用選項
vmstat [options] [delay [count]]
常用選項:
-a 顯示活躍/非活躍記憶體
-s 顯示記憶體統計摘要(事件計數器)
-d 顯示磁碟統計
-p 顯示指定分區統計
-t 顯示時間戳
-n 週期性輸出時標題僅顯示一次
-V 顯示版本資訊
delay : 取樣間隔(秒)
count : 取樣次數(預設無限)
常用組合
# 每 2 秒取樣 1 次,共 5 次
vmstat 2 5
# 持續監控,每 3 秒顯示一次(Ctrl+C 結束)
vmstat 3
# 顯示活躍/非活躍記憶體,每 5 秒一次
vmstat -a 5
# 顯示磁碟 I/O 統計
vmstat -d
輸出欄位深度解析
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
procs(程序佇列)
| 欄位 | 含義 | 異常判讀 |
| r | 運行佇列中等待 CPU 的進程數(含正在運行) | 長期 > CPU 核心數 × 2 表示 CPU 壓力大 |
| b | 不可中斷睡眠狀態的進程數(通常等待 I/O) | 持續非零表示 I/O 瓶頸 |
memory(記憶體,單位 KB)
| 欄位 | 含義 | 說明 |
| swpd | 已使用的交換空間 | 持續增長表示記憶體不足 |
| free | 完全空閒記憶體 | 過低(< 總記憶體 5%)需關注 |
| buff | Block Device 緩衝區 | 原始磁碟緩衝 |
| cache | 頁面緩存 | 檔案系統緩存,可被快速回收 |
swap(交換分頁,單位 KB/s)
| 欄位 | 含義 | 異常判讀 |
| si | 從磁碟交換區讀入記憶體(Swap In) | 持續非零 = 記憶體嚴重不足,頻繁換入 |
| so | 從記憶體寫入交換區(Swap Out) | 持續非零 = 主動換出,記憶體壓力大 |
核心判斷:健康系統 si、so 長期為 0。若持續非零,必須增加實體記憶體或優化應用記憶體使用。
io(塊設備,單位 KB/s)
| 欄位 | 含義 |
| bi | 從塊設備讀入總量(讀磁碟) |
| bo | 寫入塊設備總量(寫磁碟) |
system(系統)
| 欄位 | 含義 | 異常判讀 |
| in | 每秒中斷數(含時鐘中斷) | 過高(> 20k/s)可能為硬體問題或驅動程式問題 |
| cs | 每秒上下文切換次數 | 過高(> 10k/s)表示進程/執行緒切換頻繁,CPU 開銷大 |
cpu(CPU 百分比)
| 欄位 | 含義 | 關注重點 |
| us | 用戶態 CPU 時間 | 應用程式計算密集型負載 |
| sy | 系統態 CPU 時間 | 系統呼叫、中斷處理開銷,過高(> 20%)需關注 |
| id | 閒置時間 | 長期接近 0 表示 CPU 飽和 |
| wa | 等待 I/O 時間 | 關鍵指標,持續 > 20% 表示 I/O 瓶頸 |
| st | 虛擬機被 Hypervisor 偷走的時間 | 虛擬化環境關注,過高表示宿主機超售 |
實戰分析場景
場景 1:CPU 瓶頸診斷
# 觀察持續 1 分鐘
vmstat 5 12
# 關注指標
r > 2*CPU_cores → 進程排隊嚴重
us + sy > 80% → CPU 繁忙
sy > 30% → 系統調用過多(鎖競爭、頻繁系統呼叫)
cs > 10000 → 過度上下文切換
場景 2:記憶體壓力與 Swap 暴增
# 關注指標
free < 總記憶體 5% → 可用記憶體不足
swpd 持續增長 → 持續換出
si/so 持續 > 0 → 頻繁換頁,效能嚴重下降
buff/cache 過低 → 檔案緩存被擠佔,I/O 效能下降
場景 3:I/O 瓶頸定位
# 關注指標
wa > 20% → CPU 大量時間等待 I/O
bi/bo 持續高位 → 大量磁碟讀寫
b > 0 → 進程處於不可中斷睡眠(通常等待 I/O)
# 結合 iostat 定位具體設備
iostat -xmt 5
場景 4:系統調用與上下文切換異常
# 關注指標
in > 20000 → 中斷風暴,檢查網卡/磁碟控制器驅動
cs > 20000 → 過度切換,可能為:
- 進程過多(超過 CPU 核心數數倍)
- 同步鎖競爭激烈
- 頻繁系統呼叫(如頻繁 read/write 小塊資料)
進階用法與組合拳
記憶體詳細分析
vmstat -s
# 輸出事件計數器:
# total memory, used memory, active memory, inactive memory
# page faults, major faults, page reclaims
# swap ins, swap outs, page ins, page outs
# context switches, CPU time...
磁碟 I/O 詳細統計
vmstat -d
# 輸出每個磁碟裝置的讀寫統計:
# reads, reads merged, sectors read, ms reading
# writes, writes merged, sectors written, ms writing
# io in progress, ms doing io, weighted ms doing io
指定分區統計
vmstat -p /dev/sda1
# 輸出指定分區的讀寫統計
腳本化監控範例
#!/bin/bash
# 持續監控,異常時告警
vmstat 10 | awk '
$13 > 80 { print "CPU 高負載: us+sy=" $13+$14 "%" }
$16 > 20 { print "I/O 等待過高: wa=" $16 "%" }
$7 > 0 || $8 > 0 { print "Swap 活躍: si=" $7 " so=" $8 }
'
對比工具速查
| 工具 | 焦點 | 適用場景 |
vmstat | 系統級宏觀概覽 | 快速定位 CPU/記憶體/I/O 大方向瓶頸 |
iostat | 磁碟 I/O 詳細 | 定位具備磁碟、分區效能 |
mpstat | 每 CPU 核心統計 | 多核負載不均衡分析 |
pidstat | 進程級資源使用 | 定位具體進程資源佔用 |
sar | 歷史資料收集/報表 | 長期趨勢分析、容量規劃 |
總結
vmstat 是系統效能診斷的「聽診器」。掌握 r, b, si, so, bi, bo, wa, cs 等關鍵指標含義,配合 delay count 觀察趨勢,能在幾分鐘內完成系統健康度評估。記住核心口訣:r 看 CPU 排隊、si/so 看記憶體壓力、wa 看 I/O 等待、cs 看切換開銷。配合 iostat、pidstat、top 形成組合拳,即可應對絕大多數效能疑難雜症。