首页/系统/Linux 内核与性能调优速查/sched_latency_ns 调度周期
CPU 与调度60 条

sched_latency_ns 调度周期

CFS 的目标调度周期(默认 24ms 量级):周期内每个可运行任务至少获得一次调度;任务数决定实际时间片。

调度周期是什么

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单片不得短于此值,避免切换开销失控
任务数增加周期被自动拉长按「任务数 × 粒度」计算实际周期
任务数较少时间片更大周期不被拉长,少数任务可连跑更久
可运行任务数超过「周期除以最小粒度」后周期被拉长,交互性和吞吐同时变化,这是很多「机器一忙就整体变慢」现象的直接来源。
调小周期提升交互响应但降低批处理吞吐,两个方向都要量化;只盯一项指标容易把问题搬到另一侧。

易错点

  • 把周期当固定时间片:实际时间片由周期与可运行任务数共同决定,且不低于最小粒度
  • 只调周期不调粒度:粒度下限会把小周期带来的收益吃掉
  • 在 6.6 及以后内核找不存在的参数文件:操作前先列出 /proc/sys/kernel 核对
  • 没有对照就固化参数:调度收益依赖负载形态,必须做调整前后的 A/B 对比
  • 指望在容器里改本参数:容器共享宿主调度器,容器内改动无法改变整机的调度周期

数据来源与参考

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