5 分钟上手 perf
本页承诺:5 分钟内让你跑通 perf 的完整闭环——采样、看热点、看统计。至于原理(PMU、采样、环形缓冲)放在文末链接,先会用。
阅读时间约 4 分钟 + 动手 3 条命令。完整版见 perf 使用教程。
第 1 步:装好 perf
bash
# CentOS/RHEL
yum install -y perf
# Debian/Ubuntu
apt install -y linux-tools-common linux-tools-$(uname -r)
perf --version # 能输出版本号 = 装好了权限报错(
perf_event_paranoid)时:临时sudo sysctl kernel.perf_event_paranoid=-1,正式环境按需放开。
第 2 步:造一个"CPU 高"的靶子
用本仓库自带演示程序(场景 1 是用户态热循环,最适合练手):
bash
cd <本仓库路径>/demos/cpu-demo
make # 默认 -O0 -g,保留符号,perf 才能看到函数名
./cpu_demo # 选场景 1(用户态 CPU 高),让它一直跑另开一个终端做第 3 步。
第 3 步:三连跑通
① 采样并看热点(最核心)
bash
sudo perf record -F 999 -g -p <CPU高进程的PID> -- sleep 10
sudo perf report- 回车展开
Overhead最高的函数,能看到是谁调了它(调用链); - 用户态热点(如
calc_cpu_usage的累加循环)来自可执行文件,内核态热点来自[kernel.kallsyms]。
② 看"CPU 在有效干活还是空转"(一条命令)
bash
sudo perf stat -e cycles,instructions,cache-misses,context-switches ./cpu_demo输出里重点看两个比值:
| 比值 | 怎么算 | 健康 | 含义 |
|---|---|---|---|
| IPC | instructions ÷ cycles | > 1.0 | 每周期指令数,低 → CPU 在等内存/流水线停滞 |
| 缓存命中率 | 1 − cache-misses ÷ cache-references | miss < 3% | 命中率低 → 数据布局/伪共享问题 |
③ 实时看"现在哪个函数最热"(不用落盘)
bash
sudo perf top按 CPU 占比从高到低实时滚动,适合"先瞄一眼"。
常见坑(3 秒自查)
| 现象 | 原因 | 解决 |
|---|---|---|
Permission denied / Operation not permitted | perf_event_paranoid 限制 | 见第 1 步备注,或容器里加 CAP_PERFMON |
| 热点只有地址没有函数名 | 二进制没符号 | 编译加 -g;生产 strip 过的装 debuginfo 包 |
| 栈只有一层函数 | 没 -g 记录调用栈 | 加 -g,或 --call-graph dwarf |
| 热循环消失了 | -O2 把循环优化没了 | make 用 -O0 -g;这是本仓库的教学点 |
深度入口
- perf 完整教程—— 全部参数、火焰图、阅读要点
- perf 原理—— perf_event_open / PMU 采样 / mmap 环形缓冲区 / libperf 编程
- perf 高级用法—— 硬件计数器、汇编级分析、伪共享、锁竞争、调度器分析
- 5 分钟上手系列
一句话总结:perf 三步闭环 = perf record -F 999 -g 采样 → perf report 看热点调用链 → perf stat 看 IPC/缓存命中率,5 分钟即可判断"CPU 到底在忙什么"。