调度周期是什么
sched_latency_ns 是 CFS 的目标调度周期,默认 24ms 量级:内核希望在这段时间内让每个可运行任务至少被调度一次。时间片按「周期 ÷ 可运行任务数」计算,但受 sched_min_granularity_ns 下限约束;当任务数乘以最小粒度超过周期时,周期会被自动拉长,于是任务越多每个任务等得越久。
基本信息
| 参数名 | kernel.sched_latency_ns |
|---|---|
| 默认值 | 24000000 ns(24ms)量级 |
| 单位 | 纳秒 |
| 关联参数 | sched_min_granularity_ns 限制单任务时间片下限 |
| 版本差异 | 6.6 起 EEVDF 取代 CFS,相关文件可能已移除 |
典型使用场景
- 交互延迟与吞吐之间的取舍评估
- 计算实际时间片,解释「线程一多每个都变慢」的原因
- 批处理机器上压榨吞吐,减少无谓切换
- 延迟敏感服务建立基线,判断调度是否已成为瓶颈
- 区分 nice/chrt 的作用范围:本参数只管普通任务的相对份额
查看与调整
查看与调整
sysctl kernel.sched_latency_ns kernel.sched_min_granularity_ns
sysctl -w kernel.sched_latency_ns=12000000 # 周期减半:交互更好,吞吐可能下降
cat /proc/sched_debug | head -20 # 调度器实际生效参数与运行队列
vmstat 1 5 | tail -5 # 观察 cs 与 r 列变化
pidstat -u 1 3 # 各进程 CPU 占用,配合判断时间片分配
uname -r # 6.6 以上需核对参数是否仍存在周期粒度与实际时间片
| 项目 | 对应关系 | 说明 |
|---|---|---|
| 目标周期 | sched_latency_ns | 希望一轮调度覆盖所有可运行任务的时间 |
| 时间片下限 | sched_min_granularity_ns | 单片不得短于此值,避免切换开销失控 |
| 任务数增加 | 周期被自动拉长 | 按「任务数 × 粒度」计算实际周期 |
| 任务数较少 | 时间片更大 | 周期不被拉长,少数任务可连跑更久 |
可运行任务数超过「周期除以最小粒度」后周期被拉长,交互性和吞吐同时变化,这是很多「机器一忙就整体变慢」现象的直接来源。
调小周期提升交互响应但降低批处理吞吐,两个方向都要量化;只盯一项指标容易把问题搬到另一侧。