RHEL6/RHEL7 中参数“kernel.sched_min_capsularity_ns”的含义

RHEL6/RHEL7 中参数“kernel.sched_min_capsularity_ns”的含义

在研究从 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.txt

  • kernel.sched_min_grinderity_ns
    sched_min_capsularity_ns 指定单个任务将运行的目标最小调度程序周期。该可调参数仅在运行负载较高时使用。与 sched_latency_ns 不同,此可调参数指定为每个任务分配的目标运行时间,而不是所有任务应运行一次的时间。

所以网页已经修复了——上面写着“Upd​​ated 2018-08-30T21:11:42+00:00”;即,大约四天前;在您发布问题两周后。

相关内容