perf 是 Linux 內核自帶的性能分析神器,基於硬件性能計數器(PMU)與軟件事件,能以極低開銷對生產系統進行無侵入式剖析。本文從采樣原理、核心命令、實戰案例、火焰圖生成、結果解讀五個維度,構建完整的 perf 性能分析知識體系。
# 針對進程 PID 采集調用棧,頻率 99Hz,持續 30 秒,輸出 perf.data perf record -F 99 -p $(pidof java) -g -- sleep 30 # 參數解析 -F 99 # 采樣頻率 99Hz -p PID # 目標進程 ID -g # 記錄調用棧 (call graph) -- sleep 30 # 采集持續時間 -o perf.data # 輸出文件 (默認)
perf script > out.perf
#includevoid function_a() { for (int c = 1; c < 20000; c++) { /* busy loop */ } } void function_b() { for (int c = 1; c < 40000; c++) { /* busy loop */ } } int main() { for (;;) { function_a(); printf("call function a\n"); function_b(); printf("call function b\n"); } }
gcc -g -o test test.c # -g 保留調試符號,關鍵! ./test > /dev/null & # 後台運行 PERF_PID=$! perf record -F 99 -p $PERF_PID -g -- sleep 30 perf script > out.perf
git clone https://github.com/brendangregg/FlameGraph.git cd FlameGraph # 確保 Perl 環境可用
場景 命令/技巧 說明 Java 混合模式 (JIT + 解釋) perf record -F 99 -p $PID -g --call-graph dwarf -- sleep 30--call-graph dwarf使用 DWARF 解析 Java 棧,需perf-map-agent生成 /tmp/perf-$PID.map離線分析 perf archive打包 perf.data + 符號表 → 他機分析生產環境采集,開發環境分析 內存分配熱點 perf record -e mem:alloc -p $PID -g基於內存分配事件采樣 緩存未命中 perf stat -e cache-misses,cache-references -p $PID硬件計數器統計 系統調用分析 perf trace -p $PID類 strace 但基於 perf 事件 六、 Java 專項:perf-map-agent 實現 Java 符號解析
# 1. 克隆並構建 git clone https://github.com/jvm-profiling-tools/perf-map-agent.git cd perf-map-agent mvn package # 2. 附加到運行中的 Java 進程 (需 JDK attach 機制) java -cp perf-map-agent.jar:$JA_HOME/lib/tools.jar com.github.jvmprofiling.perfmap.PerfMapDumper $PID # 3. 生成 /tmp/perf-$PID.map 文件,包含 JIT 編譯代碼地址 → 方法名映射 # 4. 重新 perf record --call-graph dwarf 即可看到 Java 方法名七、 避坑指南
- 缺少調試符號:C/C++/Go 必須
-g編譯;Java 需perf-map-agent;Strip 過的二進制無法解析- 權限不足:
perf record需 root 或/proc/sys/kernel/perf_event_paranoid < 2- 采樣頻率過高:>1000Hz 會顯著影響被測進程性能,生產環境堅持 99Hz
- 火焰圖顯示 "Unknown":符號表缺失,檢查
-g編譯、Java map 文件生成- 容器環境:宿主機運行 perf 可見容器進程,需
--pid=host或在容器內運行 (需 SYS_ADMIN 權限)perf 以「無侵入、全系統、生產級」三大特性,成為 Linux 性能分析的基石工具。掌握
record → script → flamegraph標準流程,配合--call-graph dwarf解鎖 Java 混合棧,能將「CPU 飆高」從模糊恐慌轉化為精準的代碼級定位與優化。