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 的调度延迟。
perf 事件分类层次 perf 事件 硬件事件 软件事件 跟踪点 动态探针 cpu-cycles, cache-misses context-switches sched:sched_switch probe:schedule 调度延迟分析主要使用跟踪点类别中的 sched:* 事件

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 放宽限制(安全风险自担)。
perf record/script 工作流 目标程序 / 系统 perf record -e sched:sched_switch -a 按事件或频率采集样本 perf.data (二进制) perf report 交互式热点报告 perf script 导出为可读文本 交互式浏览函数占比 文本文件,可脚本分析

3.5 本章小结

perf 的安装因发行版而异,但核心工具集一致。perf list 是事件探索的入口,perf stat 适合快速计数统计,perf record + perf script 构成深度分析的基础工作流。对于进程调度延迟分析,重点关注 sched:sched_switch 和 sched:sched_wakeup 事件,它们记录了进程切换和唤醒的精确时间点,是后续计算调度延迟的原始数据来源。