3. perf sched record:记录调度事件的基本用法与参数

perf sched record 是 perf sched 子命令体系的数据采集入口,负责从内核捕获调度类事件并写入 perf.data 文件。采集数据的质量直接决定后续延迟计算与迁移分析的准确性。本节从基本用法、常用参数、事件选择与采样频率四个维度展开,帮助你在不同场景下正确配置记录命令。

3.1 基本用法与数据流

最简单的记录命令只需指定目标程序,perf sched 会自动选择一组默认的调度事件(包括 sched:sched_switch、sched:sched_wakeup、sched:sched_migrate_task 等)进行全量捕获:

# 记录当前系统所有调度事件(默认 -a 模式)
perf sched record

# 记录指定命令的调度事件
perf sched record -- sleep 10

# 记录并指定输出文件名
perf sched record -o my_sched.data -- stress --cpu 4 --timeout 5

下图展示了 perf sched record 从内核事件源到数据文件的完整数据流:

perf sched record 数据流 perf sched record 数据采集流 内核调度事件 sched_switch/wakeup/migrate perf_event_open 环形缓冲区 perf 用户态 mmap 读取 perf.data 磁盘持久化 说明 默认事件集: sched:sched_switch sched:sched_wakeup
提示:默认情况下 perf sched record 会启用 -a(全系统)模式,采集所有 CPU 上的调度事件。如果只关心特定进程,建议使用 -p 参数减少数据量。

3.2 常用参数详解

perf sched record 继承了 perf record 的核心参数,同时针对调度场景做了优化。下表列出最常用的参数及其适用场景:

参数 含义 典型用法 注意事项
-a 全系统采集 perf sched record -a 数据量大,适合短时间问题定位
-C <cpu> 绑定特定 CPU perf sched record -C 0-3 减少干扰,聚焦关键 CPU
-g 记录调用栈 perf sched record -g -a 大幅增加数据量,谨慎使用
-p <pid> 按进程过滤 perf sched record -p 1234 可重复 -p 指定多个 PID
-o <file> 指定输出文件 perf sched record -o sched.data 避免覆盖默认 perf.data
-m <pages> 设置 mmap 缓冲区大小 perf sched record -m 64 -a 高事件率时防止丢失事件

3.3 事件选择与自定义事件集

虽然 perf sched record 会自动选择默认事件集,但在某些场景下你需要精确控制捕获的事件类型。使用 -e 参数可以显式指定事件列表:

# 只捕获调度切换和唤醒事件
perf sched record -e sched:sched_switch,sched:sched_wakeup -a

# 捕获迁移事件(用于 CPU 迁移分析)
perf sched record -e sched:sched_migrate_task -a

# 捕获完整调度事件集(含等待和阻塞)
perf sched record -e sched:sched_switch,sched:sched_wakeup,\
sched:sched_wakeup_new,sched:sched_migrate_task,\
sched:sched_process_exec -a

下表列出与调度延迟和 CPU 迁移分析最相关的内核 tracepoint 事件:

事件名称 触发时机 延迟分析用途
sched:sched_switch 进程切换时 计算调度延迟、运行时间
sched:sched_wakeup 进程被唤醒时 计算 wakeup 到 switch 的延迟
sched:sched_wakeup_new 新进程首次唤醒 分析 fork+exec 调度延迟
sched:sched_migrate_task 进程跨 CPU 迁移 分析迁移原因与开销
sched:sched_process_exec 进程执行新程序 关联 exec 与调度行为
调度事件时间线关系 调度事件时间线关系 wakeup switch_in switch_out migrate 调度延迟 运行时间 延迟计算关键公式 调度延迟 = sched_switch 时间戳 - sched_wakeup 时间戳 迁移开销 = 前后两次 sched_switch 所在 CPU 不同时的间隔

3.4 采样频率与事件丢失

调度事件属于高频事件,尤其在多核系统上,每秒可能产生数十万甚至上百万个事件。如果采样频率设置不当,会导致事件丢失,进而影响延迟计算的准确性。

perf sched record 默认使用 无频率限制的全量捕获,即每个调度事件都会被记录。这与 perf record 的 -F(采样频率)参数不同——调度分析需要完整的事件序列才能计算延迟,因此通常不建议使用 -F 限制频率。

注意:如果看到以下警告,说明事件丢失严重:
WARNING: Lost events (X samples, Y%)
解决方案:增大 mmap 缓冲区(-m 128 或 -m 256),或缩小采集范围(使用 -C 或 -p)。

下表总结了不同场景下的参数推荐配置:

场景 推荐参数 预期数据量(10秒)
全系统概览 -a -m 64 50~200 MB
单进程分析 -p <pid> -m 16 1~10 MB
特定 CPU 迁移 -C 0-3 -e sched:sched_migrate_task 0.1~1 MB
带调用栈的调度 -a -g -m 128 200~800 MB
长时间监控 -a -m 256 -o large.data 按分钟计 GB 级

3.5 实战示例:组合参数使用

以下示例展示如何组合参数完成一次典型的调度延迟采集:

# 场景:分析 CPU 0-3 上 PID 为 1234 的进程调度延迟,带调用栈
perf sched record \
  -C 0-3 \
  -p 1234 \
  -g \
  -m 64 \
  -o sched_analysis.data \
  -- sleep 30

# 验证事件是否丢失
perf report -i sched_analysis.data --stats | grep -i lost

# 查看记录的事件总数
perf report -i sched_analysis.data --stats | head -20
关键原则:调度延迟分析要求事件不丢失、时间戳准确。在开始正式分析前,务必检查 perf.data 中是否有 lost events。如果丢失率超过 1%,应增大 -m 参数或缩小采集范围。