如何更改 Linux 上下文切换频率?

Nat*_*n B 19 linux process linux-kernel

如何更改 Linux(linaro、ubuntu、debian)上下文切换频率?

我可以用一个响应较慢的系统来换取一个更高效的系统。

EDIT1:我有一个主进程,我想尽可能快地运行(每秒最大时钟周期),所以我想降低上下文切换频率(=增加时间片)。问题是怎么做,会不会有显着的效果。我可以计算上下文切换的成本吗?意思是,如果我将时间片增加两个,我可以估计我关心的主进程的性能增益是多少?

sou*_*edi 18

如果您的任务是在特定 CPU 上请求时间的唯一进程,则任务之间将没有上下文切换 :-)。但是 CPU 可能仍会被中断,导致上下文切换到内核并返回。一个可能的原因是抢占计时器,检查是否有另一个任务要在这个 CPU 上运行......

Linux的可避免产生对CPU的任何占先定时器中断时不会有任何理由这样做。见CONFIG_NO_HZ_FULL。要使用此功能,必须在构建内核时启用它,并且必须使用引导选项启用它。

默认情况下,没有 CPU 是自适应滴答 CPU。“nohz_full=”引导参数指定了自适应滴答 CPU。例如,“nohz_full=1,6-8”表示 CPU 1、6、7 和 8 是自适应滴答 CPU。请注意,禁止将所有 CPU 标记为自适应滴答 CPU [...]

LWN.net 表示,“根据 Ingo Molnar 的说法,自适应滴答 CPU 将节省多达 1% 的 CPU 时间”。内核文档说这有六种不同的成本,还有一个“已知问题”列表。

这种增益相对较小,特别是与降低多个任务之间上下文切换频率的潜在吞吐量增益相比,如以下答案中所述:如何更改 Linux CPU 调度程序使用的时间片长度?

小字:这些测量早于 Spectre、Meltdown、KPTI 和 x86 ASID 支持:-(。我想它们也适用于较旧的硬件。请咨询内核专家或运行您自己的测量,了解上下文切换的成本如何在您的特定内核版本和硬件上更改... PTI 主要应该通过 ASID 来缓解,除了非常频繁地调用内核的软件,主要示例是数据库。但我对数字不太了解.

Molnar 在原始 RFC 补丁中的希望是,随着时间的推移,它“可能会被大多数 Linux 发行版启用”。我注意到 Fedora 28 提供了一个内置NO_HZ_FULL支持的默认内核。然而,Debian 9 没有。


最近,Linux v4.17从nohz_fullCPU 中删除了剩余的 1 Hz 计时器滴答声。我想对吞吐量的影响很小:-),但是NO_HZ_FULL当 CPU 上有多个可运行的进程时,我一直试图跟踪收益的状态-

一旦我们达到 0 Hz,我们也可以 [then] 从 nr_running>=2 中删除周期性滴答假设,基本上只按照 sched_latency 约束要求我们执行的频率中断繁忙的任务 - 每 4-40 毫秒一次,具体取决于 nr_running .

这有点令人困惑,因为在 v2.6.25-rc1, commit 8f4d37ec073c, "sched: high-res preemption tick" 中,抢占已经开始使用单独的、更精确的回叫。通过对同一 LWN.net 文章的此评论找到:https : //lwn.net/Articles/549754/)。