Linux 3.10 CFS 有“时间片”吗?

1 scheduling linux-kernel

Linux 3.10 CFS 有“时间片”吗?

我很困惑,因为sched-design-CFS.txt明确指出:

CFS 使用纳秒级粒度计算,不依赖于任何 jiffies 或其他 HZ 细节。因此,CFS 调度程序没有前一个调度程序那样的“时间片”概念,也没有任何启发式方法。只有一个中央可调参数(您必须打开 CONFIG_SCHED_DEBUG):

/proc/sys/kernel/sched_min_granularity_ns

它可用于将调度程序从“桌面”(即低延迟)调整为“服务器”(即良好的批处理)工作负载。

但是随后多任务调度程序调优指南提出了两种不同的计算“时间片”的公式。(取决于可运行任务的数量。)例如这个OpenSUSE 指南。

我只在隔离的 CPU 上运行 SCHED_FIFO 线程。

小智 5

CFS 没有“像以前的调度程序那样”的时间片。

在CFS一个时间片是基本上连续的开关许可CPU执行时间相同的线程之间的持续时间。这为您提供了两种选择:

  • 您的所有线程都有足够的时间至少min_granularity_ns在一个latency_ns. 那么,你的timeslice = scheduling period * (task's weight/total weight of tasks in the run queue)

  • 有太多线程无法放入latency_ns,因此您的时间片会变大以容纳更多想要根据 运行的线程timeslice = number_of_running_tasks * sched_min_granularity_ns

这就是为什么CFS代表完全公平的调度程序,因为它不排除优先级较低的线程,而是不加选择地为每个人延长时间片。