调度粒度是什么
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) | 切换减少,批处理吞吐更好 | 长尾延迟变大,交互任务可能感到卡顿 |
| 保持默认 | 内核按硬件与负载整定的折中值 | 极端场景下不是最优解 |
实际时间片是「周期除以可运行任务数」,但不得低于最小粒度;因此任务很少时粒度不生效,任务很多时周期被自动拉长。
这组参数影响机器上所有普通任务,属于全局调优;先建立延迟与吞吐基线,调整后对比,避免凭手感固化到生产配置。