用途
Linux perf 技能用于指导智能体完成基于 perf 的 CPU 性能剖析工作,包括采样、硬件计数器测量、热点识别,并支持与火焰图生成相结合。适用于回答“哪个函数占用 CPU 最多”“如何测量缓存未命中 / IPC”“如何用 perf 查找热点”“如何从 perf 数据生成火焰图”以及排查 perf 显示 [unknown] 或 [kernel] 帧等问题。
主要能力
该技能覆盖 perf 的多个核心子命令:perf stat 提供快速硬件计数器统计;perf record 进行采样;perf report 进行交互式分析;perf annotate 展示带命中百分比的汇编热点指令;perf top 提供实时函数级剖析;并可将 perf script 输出接入 Brendan Gregg 的 FlameGraph 工具生成 SVG 火焰图。
使用方式
技能给出了逐步工作流。首先安装与权限配置:Debian/Ubuntu 使用 sudo apt install linux-perf,Fedora/RHEL 使用 sudo dnf install perf;通过 /proc/sys/kernel/perf_event_paranoid 检查权限,可临时用 sudo sysctl -w kernel.perf_event_paranoid=1 降低限制,或写入 /etc/sysctl.d/99-perf.conf 持久化。编译目标时建议使用 gcc -g -O2 -fno-omit-frame-pointer 以获得可用的帧数据。
采集阶段可使用:
perf stat ./prog
perf stat -e cache-misses,cache-references,instructions,cycles,branch-misses ./prog
perf stat -r 5 ./prog
perf stat -p 12345 sleep 10
perf record -g ./prog
perf record -F 999 -g ./prog
perf record -e cache-misses -g ./prog
perf record -F 999 -g -p 12345 sleep 30
perf record -e sched:sched_switch -ag sleep 10
perf record -F 999 --call-graph=dwarf ./prog
perf record -o myapp.perf.data -g ./prog
分析阶段可使用:
perf report
perf report -i myapp.perf.data
perf report --no-children
perf report --sort comm,dso,sym
perf report --stdio
perf annotate sym_name
perf annotate -i perf.data --symbol=hot_function --stdio
sudo perf top -g
sudo perf top -p 12345
在 TUI 中可按 Enter 展开符号、a 注释、s 查看源码、d 按 DSO 过滤、t 按线程过滤、? 查看帮助。
火焰图生成流程:
perf script > out.perf
git clone https://github.com/brendangregg/FlameGraph
./FlameGraph/stackcollapse-perf.pl out.perf > out.folded
./FlameGraph/flamegraph.pl out.folded > flamegraph.svg
适用场景
技能给出 perf stat 输出解读参考:IPC(每周期指令数)小于 1.0 表示内存受限或流水线停顿;缓存未命中率大于 5% 表示显著缓存压力;分支未命中率大于 5% 表示分支预测器吃力。perf annotate 中对 mov 或 vmovdqa 的高命中数提示该加载处存在缓存未命中。
限制与常见问题
使用中可能遇到权限拒绝(perf_event_paranoid 过高,需降低或 sudo)、[unknown] 帧(缺少帧指针或调试信息,需重新编译或使用 --call-graph=dwarf)、到处显示 [kernel](内核符号不可见,需 sudo perf record 并安装对应 dbgsym)、无 kallsyms(内核符号不可用)、短程序报告为空(程序退出过快,可用 -F 9999 或延长工作负载)、DWARF 展开缓慢(可用 --call-graph dwarf,512 限制)。常用事件包括硬件事件 cycles、instructions、cache-references、cache-misses、branch-instructions、branch-misses、stalled-cycles-frontend、stalled-cycles-backend,软件事件 context-switches、cpu-migrations、page-faults,以及跟踪点 sched:sched_switch、syscalls:sys_enter_read(需要 root)。可通过 perf list 列出全部可用事件。相关技能包括火焰图生成与阅读、valgrind 缓存模拟与内存剖析,以及使用 gcc 或 clang 基于 perf 数据进行 PGO(AutoFDO)。