首页/系统/Linux 内核与性能调优速查/sched_wakeup_granularity_ns 唤醒抢占粒度
CPU 与调度60 条

sched_wakeup_granularity_ns 唤醒抢占粒度

唤醒的普通任务抢占当前任务所需的最小虚拟时间差(默认 1ms 量级);调小让唤醒任务更快上台,调大减少抢占抖动。

唤醒抢占门槛

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 指标
  • 改动只在临时生效,确认有效后再写入持久化配置

易错点

  • 把抢占门槛当时间片:调它不改变单片长度,改错参数自然看不到预期效果
  • 一味调小追求响应:抢占变勤带来缓存失效与切换开销,吞吐可能下降
  • 忽略负载类型差异:同机延迟型与吞吐型业务的诉求相反,一个参数很难同时满足
  • 在 6.6 及以上内核找不到文件:应先核对版本与参数名,别急着怀疑权限
  • 没有量化工具只凭手感:应用延迟分位或 cyclictest 数据来验证收益

数据来源与参考

  • Linux 内核 Documentation/scheduler/sched-design-CFS.rst
  • Linux 内核源码 kernel/sched/fair.c
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌