首页/系统/Linux 内核与性能调优速查/sched_min_granularity_ns 最小调度粒度
CPU 与调度60 条

sched_min_granularity_ns 最小调度粒度

CFS 下单个任务被抢占前的最短运行时间(默认 3ms 量级),限制时间片下限,避免频繁唤醒场景的切换开销失控。

调度粒度是什么

sched_min_granularity_ns 是 CFS(完全公平调度器)下单任务被抢占前至少要跑的时间,默认 3ms 量级。它与 sched_latency_ns(目标调度周期,默认 24ms 量级)配合:周期内每个可运行任务都要轮到一次,但单片不得低于这个下限。可运行任务变多时内核不再压缩时间片,而是按「任务数 × 粒度」把实际周期自动拉长,用切换开销换吞吐。

基本信息

参数名kernel.sched_min_granularity_ns
默认值3000000 ns(3ms)量级,随内核与硬件整定
单位纳秒
配套参数sched_latency_ns 决定目标周期,sched_wakeup_granularity_ns 决定唤醒抢占门槛
版本差异6.6 起 CFS 由 EEVDF 取代,该文件可能不存在或语义变化

典型使用场景

  • 交互型负载延迟抖动:调小粒度让被唤醒任务更快上台,改善响应
  • 高吞吐批处理:适当调大粒度减少上下文切换,抬高有效算力占比
  • 线程数远超核数的服务:先算「任务数 × 粒度」,看周期被拉长了多少
  • 排查切换风暴:结合 vmstat 的 cs 列与 pidstat -w 定位抬升来源
  • 实时性前置评估:确认普通任务的调度延迟是否已成瓶颈

查看与对比

查看与对比
sysctl kernel.sched_min_granularity_ns          # 查看当前值
sysctl -w kernel.sched_min_granularity_ns=1000000   # 临时调到 1ms 做对比
cat /proc/sched_debug | head -30                 # 看调度器实际参数与运行队列
vmstat 1 5                                       # 观察 cs 与 r 列的变化
pidstat -w 1 3                                   # 按进程看自愿/非自愿切换
uname -r                                         # 6.6 以上请改看 sched_base_slice_ns

调大调小的影响

方向收益代价
调小(如 1ms)抢占更及时,交互与唤醒延迟更低切换变多、缓存命中下降,吞吐可能下滑
调大(如 10ms)切换减少,批处理吞吐更好长尾延迟变大,交互任务可能感到卡顿
保持默认内核按硬件与负载整定的折中值极端场景下不是最优解
实际时间片是「周期除以可运行任务数」,但不得低于最小粒度;因此任务很少时粒度不生效,任务很多时周期被自动拉长。
这组参数影响机器上所有普通任务,属于全局调优;先建立延迟与吞吐基线,调整后对比,避免凭手感固化到生产配置。

易错点

  • 只调粒度不改周期:两者是一组参数,单独调可能被周期上限吃掉收益
  • 无基线就上生产调参:既无法证明改善,出问题也难判断回退哪个值
  • 在 6.6 及以后内核照抄 CFS 时代参数名:文件可能不存在,写入直接报 No such file
  • 把粒度当时间片直接设成期望值:实际时间片还由周期与可运行任务数共同决定
  • 忽略连带影响:粒度调小后中断与软中断处理也可能被更频繁打断,延迟分布更碎

数据来源与参考

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