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 会启用 -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 与调度行为 |
3.4 采样频率与事件丢失
调度事件属于高频事件,尤其在多核系统上,每秒可能产生数十万甚至上百万个事件。如果采样频率设置不当,会导致事件丢失,进而影响延迟计算的准确性。
perf sched record 默认使用 无频率限制的全量捕获,即每个调度事件都会被记录。这与 perf record 的 -F(采样频率)参数不同——调度分析需要完整的事件序列才能计算延迟,因此通常不建议使用 -F 限制频率。
注意:如果看到以下警告,说明事件丢失严重:
解决方案:增大 mmap 缓冲区(
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 参数或缩小采集范围。