?perf 命令詳解?
perf
?是 Linux 系統中最強大的 ?性能分析工具?,基于內核的?perf_events
?子系統實現,支持硬件性能計數器(PMC)、軟件事件跟蹤等功能,用于定位 CPU、內存、I/O 等性能瓶頸。以下是其核心用法與實戰指南:
一、安裝與基礎配置?
-
?安裝
# Debian/Ubuntu
sudo apt install linux-tools-common linux-tools-$(uname -r)# CentOS/RHEL
sudo yum install perf# 驗證安裝
perf --version
?? ? 2.?內核符號支持?
- 安裝調試符號包(如?
linux-image-$(uname -r)-dbgsym
),以便?perf
?解析內核函數名。 - 臨時允許非特權用戶使用性能監控(可選):
sudo sysctl kernel.perf_event_paranoid=-1
二、核心功能與子命令?
子命令 | 功能描述 |
---|---|
perf stat | 統計程序運行的硬件事件(如緩存命中率) |
perf record | 記錄性能數據(生成?.data ?文件) |
perf report | 分析?record ?生成的數據 |
perf top | 實時監控系統或進程的性能熱點 |
perf trace | 跟蹤系統調用(類似?strace ) |
perf probe | 動態添加內核或用戶空間探針 |
三、常用場景與實戰示例?
?1. 統計程序性能事件
# 統計命令執行期間的 CPU 周期、緩存命中等
perf stat -e cycles,cache-misses,branch-misses ./my_program
輸出示例:
Performance counter stats for './my_program':2,356,789 cycles # 3.801 GHz45,678 cache-misses # 2.123 % of all cache refs12,345 branch-misses # 0.56% of all branches0.001234567 seconds time elapsed
?2. 采樣 CPU 熱點函數
# 記錄進程的 CPU 使用(采樣頻率 99Hz)
perf record -F 99 -g -- ./my_program # -g 記錄調用棧
perf report --stdio # 文本報告
perf report --gui=gtk # 圖形化分析(需安裝 gtk 支持)
輸出解讀?:
- ?Overhead?:函數占用的 CPU 時間比例。
- ?Command?:進程名。
- ?Shared Object?:所屬動態庫或可執行文件。
?3. 生成火焰圖(Flame Graph)
# 1. 記錄性能數據
perf record -F 99 -g -- ./my_program
# 2. 生成折疊堆棧
perf script > out.perf
stackcollapse-perf.pl out.perf > out.folded
# 3. 生成火焰圖
flamegraph.pl out.folded > flamegraph.svg
火焰圖直觀展示函數調用棧的 CPU 占用分布,橫向寬度表示耗時比例。
?4. 跟蹤系統調用
# 類似 strace,但性能更高(記錄所有線程)
perf trace -e 'syscalls:sys_enter_*' ./my_program
過濾特定系統調用:
perf trace -e 'syscalls:sys_enter_open,syscalls:sys_enter_read'
?5. 動態添加探針
# 在內核函數 add_to_page_cache_lru 添加探針
perf probe --add add_to_page_cache_lru
# 跟蹤探針事件
perf record -e probe:add_to_page_cache_lru -a
四、高級功能?
-
?硬件性能計數器?
使用?perf list
?查看支持的事件(如?instructions
、branch-misses
):
perf stat -e instructions,L1-dcache-load-misses ./my_program
?? ? 2.?用戶空間靜態探針?
在代碼中插入靜態探針(需編譯時支持):
#include <sys/sdt.h>
int main() {DTRACE_PROBE("myapp", "operation_start"); // 探針點// ...
}
跟蹤探針:
perf buildid-cache --add ./my_program # 注冊程序
perf probe --exec=./my_program --add 'myapp:operation_start'
perf record -e 'probe_myapp:*' ./my_program
五、注意事項?
- ?權限要求?
- 部分功能(如硬件計數器)需要?
root
?權限或?CAP_PERFMON
?能力。
- 部分功能(如硬件計數器)需要?
- ?性能開銷?
perf record
?高頻采樣可能導致目標程序變慢,生產環境慎用。
- ?符號解析?
- 若函數名顯示為十六進制地址,需安裝調試符號(如?
-dbgsym
?包)。
- 若函數名顯示為十六進制地址,需安裝調試符號(如?
?六、與其他工具對比?
工具 | 特點 | 適用場景 |
---|---|---|
perf | 內核級支持,硬件級性能分析 | CPU/內存瓶頸、調用鏈分析 |
strace | 系統調用跟蹤 | 文件/網絡操作調試 |
gdb | 源碼級調試 | 程序崩潰、邏輯錯誤 |
掌握?perf
?可快速定位性能問題,尤其在高并發、低延遲場景中作用顯著。結合火焰圖和動態探針,能實現從宏觀到微觀的全方位分析。