效能分析四大維度
| 維度 | 核心指標 | 代表工具 |
| CPU 使用率 | us/sy/ni/id/wa/hi/si/st | top, vmstat, mpstat, pidstat |
| 上下文切換 | cs (context switches) | vmstat, pidstat -w |
| 進程/執行緒行為 | CPU 親和性、遷移、鎖競爭 | top -H, pidstat, perf |
| 程式碼熱點 | 函數耗時、呼叫次數 | gprof, perf, valgrind |
1. top - 即時互動式監控
啟動參數
top -d 1 # 1秒刷新
top -p 1234,5678 # 監控指定 PID
top -u nginx # 監控指定用戶
top -b -n 1 # 批次模式輸出一次(適合腳本)
關鍵操作熱鍵
| 鍵 | 功能 |
| 1 | 顯示/隱藏各 CPU 核心使用率(核心功能) |
| H | 切換執行緒模式 |
| f | 進入欄位管理 |
| j | 在欄位管理中選擇 P (Last used CPU) |
| Space | 確認欄位選擇 |
| P | 按 CPU 使用率排序 |
| M | 按記憶體排序 |
| c | 顯示完整命令行 |
實戰:找出佔用特定 CPU 核心的進程
# 1. 啟動 top -d 1
# 2. 按 1 顯示所有核心
# 3. 按 f → j → Space 顯示 P 欄(Last used CPU)
# 4. 觀察 P 欄數值,對應核心編號
# 批次模式腳本抓取
top -b -n 1 | awk 'NR>7 {print $1,$9,$10,$12}' | sort -k2 -nr | head -20
2. vmstat - 系統級虛擬記憶體統計
vmstat 2 10 # 每2秒採樣,共10次
vmstat -t # 顯示時間戳
vmstat -s # 顯示統計摘要(記憶體、分頁、中斷、CPU)
關鍵欄位解讀
| 欄位 | 含義 | 異常判讀 |
| r | 可運行進程數(等待 CPU) | 持續 > CPU核心數 表示 CPU 壓力大 |
| b | 不可中斷睡眠進程(通常是 I/O 等待) | 持續 > 0 表示 I/O 瓶頸 |
| swpd | 已使用 swap 容量 (KB) | 持續增長表示記憶體不足 |
| free | 空閒記憶體 (KB) | 過低觸發 OOM 風險 |
| si/so | swap in/out 速率 (KB/s) | 持續非零表示頻繁換頁 |
| bi/bo | 磁塊裝置讀/寫 (KB/s) | 高數值表示磁碟 I/O 繁忙 |
| in | 中斷次數/秒 | 極高值可能為硬體/驅動問題 |
| cs | 上下文切換次數/秒 | > 10,000 可能有鎖競爭或執行緒過多 |
| us | 用戶態 CPU % | 應用程式計算密集 |
| sy | 系統態 CPU % | 系統呼叫、中斷處理密集 |
| id | 空閒 CPU % | 低值表示 CPU 忙碌 |
| wa | I/O 等待 CPU % | 高值表示存儲瓶頸 |
| st | 虛擬機偷取 CPU % | 雲環境關鍵指標 |
3. pidstat - 進程級精準監控
安裝
# Debian/Ubuntu
sudo apt-get install sysstat
# RHEL/CentOS
sudo yum install sysstat
# 啟用數據收集
sudo systemctl enable --now sysstat
核心用法
上下文切換欄位深度解讀
| 欄位 | 全稱 | 含義 | 異常判讀 |
| cswch/s | Voluntary Context Switches | 主動放棄 CPU(等待鎖、I/O、睡眠) | 高值 = 鎖競爭、同步等待、I/O 瓶頸 |
| nvcswch/s | Non-Voluntary Context Switches | 被動被搶佔(時間片用完、高優先級搶佔) | 高值 = CPU 爭用、優先級反轉、執行緒過多 |
實戰:診斷高上下文切換
1000 {print}'
# 3. 定位執行緒
pidstat -wt -p 1
# 4. 檢查鎖競爭(需 perf)
perf record -g -p -- sleep 30
perf report
4. gprof - 程式碼級性能剖析
適用場景
- C/C++/Fortran 程式編譯階段插桩
- 需重新編譯加入
-pg 標誌
- 適合 CPU 密集型計算熱點分析
完整流程
analysis.txt
# 4. 關鍵報告解讀
# Flat profile: 函數自佔時間排序
# Call graph: 呼叫關係樹與累積時間
報告關鍵欄位
| 欄位 | 含義 |
| % time | 該函數佔總運行時間百分比 |
| cumulative seconds | 累積時間 |
| self seconds | 函數本身耗時(不含子呼叫) |
| calls | 呼叫次數 |
| self ms/call | 平均單次耗時 |
| total ms/call | 含子呼叫平均耗時 |
5. powertop - Intel 功耗與 CPU 行為分析
sudo powertop
# Tab 切換:Overview / Idle stats / Frequency stats / Device stats / Tunables
# 關鍵觀察:
# - CPU 核心 C-state 佔比(深度睡眠比例)
# - Wakeups/秒(喚醒頻率,越低越省電)
# - Tunables 建議優化項(按 Enter 套用)
綜合診斷流程圖
系統變慢
│
├─► top -d 1 → 按 1 → 觀察各核心 us/sy/wa
│ │
│ ├─ us 高 → pidstat -p PID → 定位熱點函數 → gprof/perf 分析
│ ├─ sy 高 → 檢查系統呼叫 (strace) / 中斷 (vmstat in)
│ └─ wa 高 → iostat -x 1 / pidstat -d → 定位磁碟 I/O 進程
│
├─► vmstat 1 5 → 觀察 r, cs, si/so, bi/bo
│ │
│ ├─ r > 核心數 → CPU 飽和
│ ├─ cs > 10k → pidstat -w 定位進程 → 檢查鎖/執行緒設計
│ ├─ si/so 持續非零 → 記憶體不足 → free -h / 擴容或優化
│ └─ bi/bo 高 → 磁碟 I/O 瓶頸 → iotop / 優化索引/快取
│
└─► 綜合報告 → 優化代碼/架構/參數 → 壓測驗證 → 持續監控
工具選型速查表
| 需求 | 首選工具 | 備選工具 |
| 即時系統總覽 | top / htop | glances, btop |
| 歷史趨勢記錄 | sysstat (sar) | Prometheus+Grafana, Netdata |
| 進程級 CPU/記憶體/I/O | pidstat | top -p, ps, /proc/PID/stat |
| 上下文切換分析 | pidstat -w | vmstat, perf sched |
| 函數級熱點(需重編譯) | gprof | perf, valgrind/callgrind |
| 生產環境無損剖析 | perf | eBPF (bpftrace), async-profiler |
| 功耗/待機優化 | powertop | turbostat, intel_gpu_top |
總結
Linux 效能分析工具鏈成熟豐富,核心心法是由宏觀到微觀、由現象到本質:
1. top/vmstat 建立系統級基線
2. pidstat 定位異常進程與執行緒
3. pidstat -w 深入上下文切換根因
4. gprof/perf 穿透到程式碼熱點
5. 持續監控 + 壓測驗證 閉環優化
掌握這五大工具的核心參數與組合拳,即可解決 90% 以上的 CPU 效能疑難雜症。建議建立標準化診斷腳本(如 perf_check.sh),將專家經驗固化為自動化流程。