我以为我理解CFS,但是......
计划延迟是每个可运行进程期望获得处理器份额的时间。在Linux内核代码中它给出了:
(默认值:6ms * (1 + ilog(ncpus)),单位:纳秒)
对于 1 个 cpu 的机器来说,需要 6ms,而对于 4 核的机器来说,需要 18ms。我在 Rpi Zero 一核和 Rpi 4 四核上检查了这一点,情况似乎确实如此。然而,具有四核的 Pi 4 是比零更强大的机器,您肯定会期望调度延迟更小而不是大三倍?查看这两种情况下的 sched_min_capsularity,它们都处理 8 个任务,然后回退到 0.75 毫秒和 2.25 毫秒的固定时间片。我显然对此感到困惑......
答案1
您肯定会期望计划延迟更小而不是大三倍
这就是为什么它被“纠正”为 _NONE、_LOG 的原因。或_LINEAR。
当您将 SMP 的概念视为分裂,而不是添加CPU。这样您就不会获得整体性能,但仍然具有更好的响应能力。
这个短函数(“句点”)同时使用最小粒度和潜伏。我重新格式化了一下。我不认为你必须了解任何有关 C 语言的知识才能理解 - 甚至还有一个不太可能暗示:
static u64 __sched_period(unsigned long nr_running)
{
if (unlikely(nr_running > sched_nr_latency))
return nr_running * sysctl_sched_min_granularity;
else
return sysctl_sched_latency;
}
最后,更多的是关于这个词而不是这个东西:维基百科,CFS:
...这原子单位通过它分配单个进程的 CPU 份额(从而使以前的时间片概念)
那多余的词仍在kernel/sched/fair.c
:
* (to see the precise effective timeslice length of your workload,
* run vmstat and monitor the context-switches (cs) field)
价值6毫秒,0.75毫秒(=1/8) 和24毫秒(= _LOG 已针对 ncpus=8 进行更正)能恕我直言,将其解释为周期,即时间片。如果将其转换为赫兹,它会与Kconfig.hz
100HZ(服务器)到 1000HZ(高响应性)的范围相匹配。
1/.00075 s
1333.3 Hz
一秒钟内可以容纳超过一千个最小粒度“切片”。
1/.006 s
166.6 Hz
166 个未校正的延迟“切片”位于 100HZ“服务器”和 250HZ“妥协”之间。
1/.024 s
41.6 Hz
通过对 8 个核心进行日志校正,每个核心都可以将上下文切换减少 4 倍,但“有效延迟”仍然很低。
与理发店相比,您要保证新顾客的等待时间不会超过 10 分钟。这意味着你必须抢占每 10 分钟就会有一位坐在座位上的当前顾客。至少在打招呼的时间里是这样。
一家有四个座位和理发师的商店可以减少这 10 分钟的时间。四名理发师各在一个柜子里工作,他们只需每40分钟停下来看看,新进来的顾客平均只需要像以前一样等待10分钟。
这将是延迟的完整“线性”校正:乘以N。
但在最坏的情况下,所有四个人都会同时检查新客户 - 因为他们同时开始。如果顾客在此之后一分钟进入,他可能需要等待 39 分钟才能得到服务。
所以作为妥协,你不是乘以 N,而是按对数(N)。
1 + ilog(N)
这给出了 1+ilog(4) = 1+2,因此 4 名理发师可以将他们的理发时间从 10 分钟延长到 30 分钟(而不是 40 分钟)。它们共同实现了 10 分钟的延迟。
四倍到 16,并且只延长到 50 分钟。 “校正”是对数的并且有这个+ 1
。