off-CPU 剖析
更新时间:2026-10-01。CPU 没跑满但延迟高,说明时间花在“不在 CPU 上”,必须换视角。
一、什么是 off-CPU
线程因等 IO、锁/futex、条件变量、内存回收等主动睡眠,或被抢占而离开 CPU。这段时间 on-CPU 采样抓不到,火焰图是空的,但它是延迟主体。
二、如何测量
利用 sched:sched_switch(及 sched_waking/sched_wakeup)tracepoint,记录线程离开 CPU 的栈和时间、被唤醒时刻,得到“等待多久 + 在哪等 + 谁唤醒”,折叠成 off-CPU 火焰图,宽度=等待时间。

三、常见坑
- 低 CPU 场景还盯着 on-CPU 热点。
- 只统计次数不看等待时长。
- 不查 waker,无法判断谁该负责。
小结
off-CPU 剖析用调度 tracepoint 量化“在哪等、等多久、谁唤醒”,是低 CPU 高延迟问题的正解。下一篇 调度延迟与 runqueue。
总结
当 CPU 没跑满、程序却慢,说明时间花在“不在 CPU 上”——线程因阻塞 IO、锁/futex、条件变量、内存回收而主动睡眠或被抢占,这段 on-CPU 采样完全抓不到、火焰图是空的,却是延迟主体;要用 sched:sched_switch 配合 sched_waking tracepoint,记录离开 CPU 的栈与时刻、被谁唤醒,统计等待时长而非占用、折叠成 off-CPU 火焰图,低 CPU 高延迟时必须切到这个视角。