在研究从RHEL6到RHEL7的内核行为时,我们遇到了关于RHEL6 6核参数的一个解释:
kernel.sched_min_granularity_ns sched_min_granularity_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来说,这是所有可运行任务(S)至少运行一次的时期。
我们从许多其他文章中获得了我们的理解,比如这一个和就是那个。有些链接可能引用不同的内核版本,但是参数的一般描述不应该被颠倒。
发布于 2018-09-02 14:02:56
同意。RHEL6文档与它引用的文档不一致。别理它。
https://elixir.bootlin.com/linux/v2.6.32/source/Documentation/scheduler/sched-design-CFS.txt#L95
因此,CFS调度程序不像以前的调度程序那样有“时间间隔”的概念,也没有任何启发式。只有一个中心可调(您必须打开CONFIG_SCHED_DEBUG):/proc/sys/核/sched_min_ workloads,它可用于将调度程序从“桌面”(即低延迟)调到“服务器”(即良好批处理)工作负载。它默认为适合桌面工作负载的设置。
相同版本中的默认值是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;发布于 2018-09-03 03:47:28
你链接到的文件包含以下定义:
所以这个网页已经被修复了--上面写着“2018-08-30T21:11:42+00:00”,也就是说,大约四天前,在你发布问题两周后。
https://unix.stackexchange.com/questions/462895
复制相似问题