1. perf sched 概述
perf sched 是 Linux perf 工具集中专用于调度子系统性能分析的子命令。它通过跟踪内核调度器关键事件,帮助开发者量化调度延迟、分析 CPU 迁移行为、定位负载均衡瓶颈。与 perf stat、perf record 等通用子命令不同,perf sched 聚焦于调度上下文切换、等待时间、运行队列延迟等调度域特有指标,是诊断交互式卡顿、实时性抖动、CPU 利用率不均等问题的核心工具。
1.1 perf sched 与其它子命令的定位差异
perf 工具集包含多个子命令,各自针对不同的性能域。下表从事件源、数据抽象层次、典型输出三个维度对比 perf sched 与 perf stat、perf record、perf top 的区别:
| 子命令 | 事件源 | 数据抽象层次 | 典型输出 |
|---|---|---|---|
| perf stat | 硬件 PMU 计数器 + 软件事件 | 计数聚合(总数/平均) | CPI、缓存命中率、指令数 |
| perf record | 任意 tracepoint / PMU | 原始事件流(时间戳+数据) | perf.data 文件,需后处理 |
| perf top | 采样周期中断 | 热点函数占比 | 实时火焰图、函数排名 |
| perf sched | 调度器 tracepoint | 调度延迟 / 迁移 / 等待时间 | sched latency、migrations、pipeline |
perf sched 的核心优势在于:它直接解析 sched:sched_switch、sched:sched_wakeup、sched:sched_migrate_task 等调度 tracepoint,自动计算调度延迟、运行时间、CPU 迁移次数,并以人类可读的表格和流水线图呈现。
1.2 调度延迟的基本概念
调度延迟(Scheduling Latency)是指一个任务从可运行状态到实际获得 CPU 执行之间的时间差。perf sched 将其拆解为两个关键阶段:
- wakeup latency:从任务被唤醒(如 I/O 完成、信号到达)到调度器将其放入运行队列的时间。
- schedule latency:从任务进入运行队列到调度器真正切换上下文、任务开始执行的时间。
总调度延迟 = wakeup latency + schedule latency。perf sched latency 命令会统计每个任务的延迟分布,包括最小值、平均值、最大值和标准差。
avg(平均延迟)反映整体调度效率;max(最大延迟)反映最坏情况,对实时系统至关重要;count(调度次数)帮助判断是否频繁切换。
1.3 CPU 迁移事件的基本概念
CPU 迁移(CPU Migration)是指一个任务从当前 CPU 的运行队列被移动到另一个 CPU 的运行队列。迁移事件由内核负载均衡器(load_balance)或调度域(sched_domain)的周期性/空闲触发机制发起。perf sched 通过 sched:sched_migrate_task tracepoint 记录每次迁移的源 CPU、目标 CPU、任务 PID 和迁移原因。
迁移事件对性能的影响具有两面性:
- 正面:均衡 CPU 负载,避免部分 CPU 过载而其他 CPU 空闲,提升整体吞吐量。
- 负面:迁移导致 L1/L2 缓存失效、TLB 刷新,增加内存访问延迟;频繁迁移还会增加调度器开销。
perf sched 的 migrations 子命令可以统计每个任务的迁移次数,帮助识别“流浪”任务——那些在 CPU 之间频繁跳转、缓存亲和性极差的任务。
taskset 或 cpuset 固定 CPU,减少迁移。
1.4 perf sched 的典型工作流
使用 perf sched 进行调度分析通常遵循以下步骤:
- 数据采集:
perf sched record启动调度事件跟踪,默认记录所有调度相关 tracepoint。 - 延迟分析:
perf sched latency输出每个任务的调度延迟统计。 - 迁移分析:
perf sched migrations列出任务迁移次数和迁移路径。 - 流水线可视化:
perf sched timehist或perf sched map展示任务在 CPU 上的时间线。
# 采集 5 秒调度数据
perf sched record -- sleep 5
# 查看调度延迟统计
perf sched latency
# 查看 CPU 迁移统计
perf sched migrations
# 查看任务时间线
perf sched timehist