1. CFS 的"调度延迟"(sched_latency)与"最小粒度"(sched_min_granularity)的工程取舍
解释 CFS 调度器中 sched_latency(调度延迟)与 sched_min_granularity(最小粒度)这两个参数的含义,以及在实际系统中如何对它们进行工程取舍?
- 理解 sched_latency 决定一个队列中所有任务都至少被调度一次的时间目标
- 理解 sched_min_granularity 防止进程被过度频繁切换引入的开销
- 掌握两者在任务数量变化时的动态关系与目标延迟计算
在 CFS 中,sched_latency 是一个理想时间窗口,表示在理想情况下所有可运行任务都各获得一次运行的时间长度,也是调度器"目标延迟"。默认值通常为 6ms(Linux 上 sysctl_sched_latency)。sched_min_granularity 是单个任务一次运行的最小时间片,默认通常为 0.75ms,防止任务切换过频导致调度开销过大。当可运行任务数量增加时,目标延迟会按任务数分摊:每个任务获得的时间片 = sched_latency / nr_running。但当 nr_running * sched_min_granularity 超过 sched_latency 时,每个任务的时间片会被限制在 sched_min_granularity,此时实际调度周期会超过 sched_latency。工程上,若增大 sched_latency 会减少切换开销、提高吞吐,但降低交互任务的响应性;若减小则响应更快但消耗更多 CPU 在切换上。因此需要根据负载特征权衡:延迟敏感负载倾向小延迟,吞吐型负载倾向大延迟。
这组参数本质是"公平性"与"切换开销"之间的折中。CFS 用 vruntime 实现公平,但每次切换都有成本,因此必须用最小粒度约束切换频率,用目标延迟定义公平吞吐的粒度。理解它们的关系(period = max(sched_latency, nr_running * sched_min_granularity))是排查调度响应问题的基础。