3. perf工具安装与基础使用
perf 是 Linux 内核官方提供的性能分析工具集,基于内核的 perf_event 子系统实现。它能够利用硬件性能计数器和内核跟踪点,以极低的开销采集 CPU 周期、缓存命中率、上下文切换、调度延迟等关键指标。本章从安装开始,逐步讲解 perf 的三大基础操作:事件查看、统计采样与记录回放。
3.1 perf 的安装方法
perf 工具通常随内核源码一同发布,但需要单独安装用户态工具包。不同发行版的安装命令如下:
| 发行版 | 安装命令 | 说明 |
|---|---|---|
| Ubuntu / Debian | sudo apt install linux-tools-common linux-tools-$(uname -r) |
自动匹配当前内核版本 |
| RHEL / CentOS 8+ | sudo dnf install perf |
直接安装 perf 包 |
| Fedora | sudo dnf install perf |
与 RHEL 系相同 |
| openSUSE | sudo zypper install perf |
— |
| Arch Linux | sudo pacman -S perf |
— |
| 源码编译 | cd tools/perf && make && sudo make install |
需内核源码树 |
验证安装:执行
perf --version 查看版本号。如果提示 WARNING: perf not found for kernel ...,说明内核头文件未安装,需补充 linux-headers-$(uname -r) 包。
3.2 perf list 查看事件
perf 支持数百种事件,涵盖硬件事件、软件事件、内核跟踪点和动态探针。使用 perf list 可以列出当前系统支持的所有事件类别。
# 列出所有事件(输出较长,建议配合 grep 过滤)
perf list
# 仅查看硬件事件
perf list hw
# 仅查看软件事件
perf list sw
# 仅查看内核跟踪点(调度相关)
perf list sched:
# 仅查看动态探针(需要 root 权限)
perf list probe:
下表列出了与进程调度延迟分析最相关的几类事件:
| 事件类别 | 示例事件 | 用途 |
|---|---|---|
| 硬件事件 | cpu-cycles, instructions, cache-misses |
CPU 周期、指令数、缓存失效 |
| 软件事件 | context-switches, cpu-migrations, page-faults |
上下文切换、CPU 迁移、缺页 |
| 跟踪点 | sched:sched_switch, sched:sched_wakeup, sched:sched_wakeup_new |
调度延迟、唤醒延迟、新进程创建 |
| 动态探针 | probe:schedule, probe:try_to_wake_up |
内核函数级插桩 |
调度延迟分析核心事件:
sched:sched_switch 记录每次 CPU 切换进程的时刻和原因;sched:sched_wakeup 记录进程被唤醒的时刻。两者结合可以精确计算进程从唤醒到获得 CPU 的调度延迟。
3.3 perf stat 基本统计
perf stat 用于对目标程序进行一次性计数统计,汇总关键性能指标。它不记录时间序列数据,而是给出整个运行周期的累计值,适合快速评估程序性能特征。
# 统计 ls 命令的硬件和软件事件
perf stat ls
# 统计指定进程 PID 的运行指标(采样 5 秒)
perf stat -p 12345 sleep 5
# 统计多个事件,并输出到文件
perf stat -e cycles,instructions,cache-misses,context-switches ./myapp
典型输出解读:
Performance counter stats for 'ls':
1.234.567 cycles # 3.45 GHz
987.654 instructions # 0.80 insn per cycle
12.345 cache-misses # 5.2% of all cache refs
123 context-switches # 0.123 K/sec
45 cpu-migrations # 0.045 K/sec
67 page-faults # 0.067 K/sec
0.357891234 seconds time elapsed
调度相关指标:
context-switches 表示进程主动或被动让出 CPU 的次数;cpu-migrations 表示进程在不同 CPU 核心之间迁移的次数。高迁移率可能暗示 NUMA 亲和性问题或负载均衡开销。
3.4 perf record / perf script 基础流程
perf record 是采样型工具,按指定频率或事件触发记录样本;perf script 将记录的二进制数据转换为可读文本。这是 perf 最强大的工作流,适用于深度分析调度延迟、热点函数和调用链。
3.4.1 基本采样流程
# 步骤1:以 99 Hz 频率采样 CPU 周期,持续 10 秒
perf record -F 99 -a -- sleep 10
# 步骤2:查看采样报告(交互式)
perf report
# 步骤3:将原始采样数据导出为文本
perf script > out.perf
3.4.2 调度事件采样
# 记录所有 sched:sched_switch 事件(需要 root)
sudo perf record -e sched:sched_switch -a -- sleep 5
# 记录 sched_wakeup 和 sched_switch,用于计算调度延迟
sudo perf record -e sched:sched_wakeup,sched:sched_switch -a -- sleep 5
# 导出为可读文本
sudo perf script > sched_trace.txt
3.4.3 输出格式解读
perf script 输出的每一行代表一个事件记录,包含时间戳、进程名、PID、CPU 编号和事件特定字段。以 sched:sched_switch 为例:
swapper 0 [000] 12345.678901: sched:sched_switch: prev_comm=myapp prev_pid=1234 prev_prio=120 prev_state=R ==> next_comm=swapper/0 next_pid=0 next_prio=120
字段含义:
- swapper 0 [000] — 当前运行进程(切换前)为 swapper,PID 0,CPU 0
- 12345.678901 — 事件发生的时间戳(秒.微秒)
- prev_comm / prev_pid — 被切换出去的进程名和 PID
- prev_state — 被切换出去时的状态(R=可运行,S=睡眠,D=不可中断)
- next_comm / next_pid — 被切换进来的进程名和 PID
权限注意:跟踪点事件(
sched:*)和硬件事件通常需要 root 权限或 CAP_PERFMON 能力。非 root 用户可以通过 sudo 执行,或使用 echo -1 > /proc/sys/kernel/perf_event_paranoid 放宽限制(安全风险自担)。
3.5 本章小结
perf 的安装因发行版而异,但核心工具集一致。perf list 是事件探索的入口,perf stat 适合快速计数统计,perf record + perf script 构成深度分析的基础工作流。对于进程调度延迟分析,重点关注 sched:sched_switch 和 sched:sched_wakeup 事件,它们记录了进程切换和唤醒的精确时间点,是后续计算调度延迟的原始数据来源。