唤醒抢占门槛
sched_wakeup_granularity_ns 是唤醒的普通任务抢占当前任务所需的最小虚拟时间差,默认 1ms 量级。新任务被唤醒时,只有它的虚拟运行时间比当前任务领先超过这个门槛,内核才立刻抢占;否则让当前任务再跑一会儿。调小让唤醒任务更快上台,调大减少抢占与切换抖动。它管抢占门槛,与管单片下限的 sched_min_granularity_ns 职责不同。
基本信息
| 参数名 | kernel.sched_wakeup_granularity_ns |
|---|---|
| 默认值 | 1000000 ns(1ms)量级 |
| 方向 | 调小抢占更积极,调大切换更少 |
| 职责边界 | 只管唤醒抢占门槛,不管时间片长度 |
| 版本差异 | 6.6 及以上 EEVDF 内核对调度参数体系有调整 |
典型使用场景
- 事件循环、消息投递等唤醒延迟敏感服务评估抢占及时性
- 吞吐型负载减少不必要的抢占与缓存失效
- 排查「响应慢但 CPU 不忙」:确认唤醒后是否被压着不切换
- 与最小粒度参数一起做整体调度评估
- 调参前后建立延迟基线对比
查看与对比
查看与对比
sysctl kernel.sched_wakeup_granularity_ns
sysctl -w kernel.sched_wakeup_granularity_ns=500000 # 调到 0.5ms 做对比
mpstat -P ALL 1 3 # 核间占用分布
vmstat 1 5 | tail -5 # cs 与 r 的变化
pidstat -w 1 3 # 自愿与非自愿上下文切换
uname -r # 6.6 以上先确认参数是否存在三个调度参数的分工
| 参数 | 管什么 | 影响 |
|---|---|---|
| sched_wakeup_granularity_ns | 唤醒任务的抢占门槛 | 调小响应更快,调大切换更少 |
| sched_min_granularity_ns | 单任务时间片下限 | 调小切换更频繁、更公平 |
| sched_latency_ns | 目标调度周期 | 决定一轮调度覆盖的时间 |
调小会同时增加抢占次数与缓存失效,吞吐型负载的指标可能不升反降;两类负载要分别验证。
三个 sched 参数分别管抢占门槛、单片下限与调度周期,名字相近混用会得出错误结论。
判断是否需要调整,可先看 pidstat -w 的非自愿上下文切换次数:唤醒抢占频繁时这一列会明显升高。
验证方法
- 用 pidstat -w 记录调整前后的非自愿切换与等待时间
- 用应用自身的延迟分位(P99、P999)做端到端验证,而不是只看 CPU 指标
- 改动只在临时生效,确认有效后再写入持久化配置