perf 是 Linux 内核自带的轻量级采样分析工具,通过硬件计数器或定时中断统计函数 CPU 占比以定位热点;需配置 perf_event_paranoid 和 kptr_restrict 权限,安装对应内核工具包及调试符号;三步法为 perf top 实时观察、perf record 录制调用栈、perf report 分析瓶颈;可生成火焰图直观展示调用关系;优化后用 perf stat 对比 cycles、instructions、IPC 等指标验证效果。

perf 是 Linux 内核自带的轻量级采样分析工具,适合在不修改代码、不重启服务的前提下快速定位 CPU 热点函数。它通过硬件计数器或定时中断采样,统计各函数在 CPU 上的执行时间占比,从而识别性能瓶颈。
确认权限与环境准备
perf 默认需要较高权限才能访问内核事件和符号信息:
- 运行 sudo sysctl -w kernel.perf_event_paranoid=-1 放开采样限制(临时生效);如需永久生效,把 kernel.perf_event_paranoid=-1 加入 /etc/sysctl.conf 并执行 sudo sysctl -p
- 若要查看内核函数名(如 __mutex_lock),还需运行 sudo sysctl -w kernel.kptr_restrict=0
- 安装对应内核版本的工具包:Ubuntu/Debian 下执行 sudo apt install linux-tools-$(uname -r) linux-tools-generic;CentOS/RHEL 用 sudo yum install perf
- 建议安装调试符号包(如 libc6-dbg),否则 perf report 中可能显示十六进制地址而非函数名
三步定位 CPU 热点函数
无需预设假设,直接从实时观察入手:
- 实时看热点:运行 sudo perf top -p <PID>,界面会动态刷新占用 CPU 最高的函数(按 Overhead 排序),按 q 退出
- 录制调用栈:用 timeout 10 sudo perf record -g -F 99 -p <PID> 采集 10 秒数据(-g 启用调用图,-F 99 控制采样频率避免干扰)
- 交互式分析:运行 sudo perf report --stdio 查看文本报告,重点关注 Overhead 列——数值越高,说明该函数越可能是瓶颈;箭头缩进表示调用层级
生成火焰图直观展示调用关系
perf report 是树状结构,而火焰图能横向对比所有路径的耗时分布:
- 先用 sudo perf script > perf.script 导出原始采样数据
- 下载 FlameGraph 工具集,执行:
./stackcollapse-perf.pl perf.script | ./flamegraph.pl > flame.svg - 用浏览器打开 flame.svg:每个矩形宽度代表该函数(及其子调用)的相对耗时,顶部宽条即最热路径;颜色无业务含义,仅作区分
验证优化是否有效
改完代码或配置后,不能只看“感觉变快”,要用数据对比:
- 运行 sudo perf stat -p <PID> 获取基础指标,重点关注:
• cycles(CPU 周期数)是否下降
• instructions(执行指令数)是否减少
• insn per cycle (IPC) 是否提升(越高说明 CPU 利用率越好) - 再次执行 perf record -g -p <PID> 和 perf report,比对关键函数的 Overhead 百分比是否明显降低



















