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

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

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

我可以用反应较差的系统来换取效率更高的系统。

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

答案1

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

Linux避免在没有理由的情况下在 CPU 上生成任何抢占定时器中断。看CONFIG_NO_HZ_FULL。要使用此功能,必须在构建内核时启用它,必须使用启动选项启用它。

默认情况下,没有 CPU 是自适应蜱 CPU。 “nohz_full=”启动参数指定adaptive-ticks 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.17nohz_full从CPU中删除残留的 1 Hz 计时器滴答声。我认为对吞吐量的影响相当小:-),但我一直在尝试跟踪NO_HZ_FULL当 CPU 上有多个可运行进程时的好处状态 -

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

这有点令人困惑,因为抢占已经在 v2.6.25-rc1 中开始使用单独的、更精确的刻度线,commit 8f4d37ec073c,“sched:高分辨率抢占勾选”。通过对同一篇 LWN.net 文章的评论发现:https://lwn.net/Articles/549754/)。

相关内容