perf 是 linux 内核自带的高性能分析工具,可精准采集 cpu 事件、区分 user/kernel 态、定位热点函数与硬件瓶颈,并通过火焰图直观展示调用栈耗时分布。

perf 是 Linux 内核自带的性能分析利器,无需额外安装(只要内核启用了 CONFIG_PERF_EVENTS=y),能直接采集 CPU 级别事件(如指令周期、缓存未命中、分支预测失败等),是定位 CPU 瓶颈最精准、开销最小的工具之一。
快速识别热点函数和调用栈
当应用响应变慢或 CPU 使用率持续偏高时,先用 perf top 实时观察占用最高的函数:
- 运行
perf top -p <pid></pid>查看指定进程的实时热点(按 % 列排序) - 加
-g参数(如perf top -g -p <pid></pid>)可显示调用图,看到“谁调用了谁” - 若想避免干扰,可用
perf record -g -p <pid> sleep 10</pid>录制 10 秒,再用perf report离线分析
注意:确保二进制有调试符号(编译时加 -g),否则函数名可能显示为 [unknown] 或地址。
区分用户态与内核态消耗
CPU 时间分属 user / kernel 两层,perf 可清晰分离:
-
perf record -e cycles:u -g -- sleep 5只采样用户态周期,排除内核干扰 -
perf record -e cycles:k -g -- sleep 5专注内核态,适合排查系统调用、中断、锁竞争等问题 - 对比两者报告中耗时占比,能快速判断瓶颈在应用逻辑(user)还是系统交互(kernel)
例如:若 read() 或 futex() 在 kernel 报告中占比突增,可能指向 I/O 阻塞或线程争用。
定位底层硬件级瓶颈
仅看函数耗时不足够,还需结合微架构事件判断根因:
- 运行
perf record -e cycles,instructions,cache-references,cache-misses,bus-cycles -g -- ./your_app -
perf report后,用Shift+P按 cache-misses 排序,找缓存不友好代码段 - 计算 IPC(Instructions Per Cycle):
instructions / cycles。IPC
例如:某循环中 cache-misses 占比超 20%,且 IPC 仅 0.4,大概率存在频繁随机访存或数据集超出 L3 缓存。
生成火焰图直观呈现调用关系
文本报告对深层调用链不够友好,配合 FlameGraph 工具可一目了然:
- 录制带调用栈:
perf record -F 99 -g -p <pid> -- sleep 30</pid> - 导出折叠格式:
perf script | ~/FlameGraph/stackcollapse-perf.pl > out.perf-folded - 生成 SVG:
~/FlameGraph/flamegraph.pl out.perf-folded > cpu-flame.svg
火焰图宽度代表采样次数,高度代表调用深度。宽而高的“火柱”就是优化优先级最高的路径;底部扁平但宽的区域,说明大量时间花在叶函数(如 malloc、memcpy),值得针对性优化。
perf 不依赖外部库、不修改程序、精度高、覆盖全,掌握几个核心命令组合,就能高效揪出 CPU 瓶颈的真正源头。










