在研究从 RHEL6 到 RHEL7 的内核行为时,我们遇到了RHEL6内核参数说明:
> kernel.sched_min_grinderity_ns
sched_min_capsularity_ns 是调度程序周期的初始值。调度程序周期是允许所有可运行任务至少运行一次的时间段。虽然 CFS 没有时间片的概念,但您可以将时间段视为初始时间块,然后将其均匀地划分为时间片,每个时间片对应一个可运行进程。请注意,此可调参数仅指定初始值。当太多任务可运行时,调度程序将增加周期以避免运行时间缩短太多。
/usr/share/doc/kernel-doc-2.6.32/Documentation/scheduler/sched-design-CFS.txt
>kernel.sched_latency_ns
它为 CPU 密集型任务配置目标抢占延迟。
关于参数的描述kernel.sched_min_granularity_ns
让我们感到困惑。我们对该参数的理解是,它是每个可运行任务在CPU上运行的最短时间(即为每个可运行任务提供的时间片)。对于kernel.sched_latency_ns
,它是所有可运行任务至少运行一次的时间段。
答案1
同意。 RHEL6 文档与其引用的文档不一致。忽略它。
https://elixir.bootlin.com/linux/v2.6.32/source/Documentation/scheduler/sched-design-CFS.txt#L95
因此,CFS 调度程序不像以前的调度程序那样具有“时间片”的概念,也没有任何启发式方法。只有一个中央可调参数(您必须打开 CONFIG_SCHED_DEBUG):
/proc/sys/kernel/sched_min_granularity_ns
它可用于将调度程序从“桌面”(即低延迟)工作负载调整为“服务器”(即良好的批处理)工作负载。它默认为适合桌面工作负载的设置。
在同一版本中,该值的默认值为 1ms,这对于时间片来说是最小值(对应于旧式 CONFIG_HZ=1000)。
https://elixir.bootlin.com/linux/v2.6.32/source/kernel/sched_fair.c#L40
对于“应允许所有可运行任务至少运行一次的一段时间”的合理默认值来说,1ms 太小了好几倍。
/*
* Targeted preemption latency for CPU-bound tasks:
* (default: 5ms * (1 + ilog(ncpus)), units: nanoseconds)
*
* NOTE: this latency value is not the same as the concept of
* 'timeslice length' - timeslices in CFS are of variable length
* and have no persistent notion like in traditional, time-slice
* based scheduling concepts.
*
* (to see the precise effective timeslice length of your workload,
* run vmstat and monitor the context-switches (cs) field)
*/
unsigned int sysctl_sched_latency = 5000000ULL;
/*
* Minimal preemption granularity for CPU-bound tasks:
* (default: 1 msec * (1 + ilog(ncpus)), units: nanoseconds)
*/
unsigned int sysctl_sched_min_granularity = 1000000ULL;
答案2
您链接到的文档包含这些定义:
内核.sched_latency_ns
sched_latency_ns 是调度程序周期的初始值。调度程序周期是允许所有可运行任务至少运行一次的时间段。虽然 CFS 没有时间片的概念,但您可以将时间段视为初始时间块,然后将其均匀地划分为时间片,每个时间片对应一个可运行进程。请注意,此可调参数仅指定初始值。当太多任务可运行时,调度程序将使用 kernel.sched_min_grinderity_ns 代替。
/usr/share/doc/kernel-doc-2.6.32/Documentation/scheduler/sched-design-CFS.txtkernel.sched_min_grinderity_ns
sched_min_capsularity_ns 指定单个任务将运行的目标最小调度程序周期。该可调参数仅在运行负载较高时使用。与 sched_latency_ns 不同,此可调参数指定为每个任务分配的目标运行时间,而不是所有任务应运行一次的时间。
所以网页已经修复了——上面写着“Updated 2018-08-30T21:11:42+00:00”;即,大约四天前;在您发布问题两周后。