perf 命令详解
更新时间:2026-08-28。本文是「一个命令一个文档」系列,聚焦
perf——性能观测与调试命令族(见性能观测命令族)。它是本站性能剖析主线(tools/)的核心工具。
perf 是 Linux 内核自带的性能剖析器,基于 perf_events 子系统,能利用 CPU 的硬件性能计数器(performance counter,CPU 内部专门统计指令、缓存、分支等的寄存器)采样。它回答的问题是:"我的程序时间到底花在哪了?"
一、perf top:实时看热点
perf top # 实时显示占用 CPU 最高的函数/符号
perf top -g # 带调用栈像 top 看进程 一样,
perf top实时看"哪个函数最耗 CPU"。-g展开调用栈,能看出热点函数是谁调用的。这是性能排查的第一反应——先确认热点在用户态还是内核态、在哪个库。
二、perf record / report:采样存档
perf record -g -F 99 -p 1234 sleep 30 # 对 PID 1234 以 99Hz 采样 30 秒
perf record -g ./myapp # 直接跑程序并采样
perf report # 交互式看报告
perf report -n --stdio # 文本形式输出
-F 99是采样频率(99 而非 100,避免和某些周期性任务共振),-g记录调用栈,-p指定进程。采样会有开销,生产环境短采即可。perf report默认按函数聚合 CPU 占比,一眼看出热点。注意要看到符号(函数名)需要程序带符号表(见本站demos/cpu-demo用-O0 -g编译的用意)。
三、生成火焰图
perf record -F 99 -ag -- sleep 30 # 系统级全采样
perf script | stackcollapse-perf.pl | flamegraph.pl > out.svg火焰图(flamegraph)把调用栈拍平成一张图,横轴是采样占比、纵轴是调用深度,最宽的"火苗"就是最热的热点。它是定位性能瓶颈最直观的方式,本站有专门的 perf 火焰图怎么生成 速查。没有符号时火焰图只剩一堆十六进制地址,所以编译务必带
-g、别 strip。
四、硬件事件:不止 CPU 时间
perf stat -d ./myapp # 统计多种硬件事件
perf stat -e cache-misses,branch-misses ./myapp
perf stat跑完给出一组计数器:cache-misses(缓存未命中,高说明访存模式差)、branch-misses(分支预测失败,惩罚大)、instructions(指令数)、IPC(每周期指令数,衡量效率)。本站 CPU 微架构 详细讲了这些事件背后的流水线/缓存/分支预测原理——cache-misses高往往指向伪共享或访存不连续,不是简单"换个算法"就能解的。
五、perf vs 其他工具
| 工具 | 视角 |
|---|---|
perf | 微观:函数级热点、硬件事件 |
| top/pidstat | 宏观:进程/线程级 CPU 占用 |
| strace | 系统调用级:卡在哪种 syscall(见 strace) |
vmstat/iostat | 系统资源级:内存/IO 整体 |
排查顺序通常是:先用 top 确认"是不是 CPU 忙"、再
perf看"忙在哪个函数"、若怀疑卡在 IO 或锁就用 strace 看系统调用。各工具在不同抽象层,perf负责把时间摊到代码行。
六、实战:找到吃 CPU 的循环
# 1. 先确认是 CPU 问题
top -d 1 # %CPU 高、单核跑满
# 2. 采样该系统/进程
perf record -g -F 99 -p $(pgrep myapp) sleep 10
# 3. 看报告,找最宽的函数
perf report -n --stdio | head -30
# 4. 出火焰图直观确认
perf script | stackcollapse-perf.pl | flamegraph.pl > cpu.svg若火焰图里某个 calc() 占了大半宽度,那就是优化切入点——配合 CPU 微架构原理 判断是算法问题还是缓存/分支问题。
一句话总结
perf = 内核级性能剖析器:perf top 实时看热点函数、record -g -F 99 采样存档、report 看聚合、perf script→火焰图直观定位最宽火苗;stat -e cache-misses/branch-misses 看硬件事件(背后是 CPU 微架构 的缓存/分支预测);需程序带符号表(-g 编译)才能见函数名。先 top 确认 CPU 忙,再用 perf 摊到代码行。