1. perf sched 概述

perf sched 是 Linux perf 工具集中专用于调度子系统性能分析的子命令。它通过跟踪内核调度器关键事件,帮助开发者量化调度延迟、分析 CPU 迁移行为、定位负载均衡瓶颈。与 perf stat、perf record 等通用子命令不同,perf sched 聚焦于调度上下文切换、等待时间、运行队列延迟等调度域特有指标,是诊断交互式卡顿、实时性抖动、CPU 利用率不均等问题的核心工具。

适用场景:桌面环境 UI 响应延迟、实时系统 deadline 错过、虚拟化 vCPU 调度抖动、大规模数据中心负载均衡不均。

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(调度次数)帮助判断是否频繁切换。
调度延迟时间线 任务唤醒 入队运行队列 上下文切换 wakeup latency schedule latency 总调度延迟 = wakeup latency + schedule latency perf sched latency 统计每个任务的 min/avg/max 延迟

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 之间频繁跳转、缓存亲和性极差的任务。

性能陷阱:迁移次数过多(例如每秒数百次)通常意味着负载均衡策略过于激进,或任务绑定(CPU affinity)配置不当。对于延迟敏感型任务,建议使用 taskset 或 cpuset 固定 CPU,减少迁移。
CPU 迁移事件示意图 CPU 0 运行队列 任务 A 任务 B CPU 1 运行队列 任务 C 任务 D 负载均衡触发迁移 迁移原因:CPU 0 负载过高(2 个任务),CPU 1 负载较低(2 个任务但空闲更多) perf sched 记录:源 CPU、目标 CPU、任务 PID、迁移时间戳 迁移代价:L1/L2 缓存失效、TLB 刷新、调度器额外开销

1.4 perf sched 的典型工作流

使用 perf sched 进行调度分析通常遵循以下步骤:

  1. 数据采集:perf sched record 启动调度事件跟踪,默认记录所有调度相关 tracepoint。
  2. 延迟分析:perf sched latency 输出每个任务的调度延迟统计。
  3. 迁移分析:perf sched migrations 列出任务迁移次数和迁移路径。
  4. 流水线可视化:perf sched timehist 或 perf sched map 展示任务在 CPU 上的时间线。
快速入门命令:
# 采集 5 秒调度数据
perf sched record -- sleep 5

# 查看调度延迟统计
perf sched latency

# 查看 CPU 迁移统计
perf sched migrations

# 查看任务时间线
perf sched timehist