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


17

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

我可以权衡使用响应速度较慢的系统来获得更高效的系统。

EDIT1:我有一个主要进程,我想尽可能快地运行(每秒最大时钟周期),因此我想降低上下文切换频率(=增加时间片)。问题是如何做到这一点,并且会产生重大影响。我可以计算上下文切换的成本吗?意思是,我可以估计是否将时间片增加两倍,对于我关心的主要流程,我的性能提升将是多少?


1
我希望此设置的影响最小,并且仅当您运行的进程多于CPU内核时才有意义。如果没有其他任务在等待特定的CPU,则根本不需要设置短时任务切换计时器,因为可以使另一个任务运行的任何事物都将是系统调用或硬件中断,这两者都可以将使CPU返回内核。
西蒙·里希特

很抱歉在这里呆呆,但是有人可以在这个问题的背景下解释“上下文切换频率”的含义吗?
user1717828

@sourcejedi参见我的EDIT1-降低上下文切换频率时,是否可以估算吞吐量提高的百分比?
Nadav B '18

@NadavB我已经相应地编辑了我的答案。优化时最好进行特定的测量。但是,您不必将其视为黑匣子,例如,如果您的CPU良好,则可以使用perf来测量高速缓存未命中。AIUI,各种类型的CPU高速缓存未命中(包括TLB未命中)是上下文切换最重要的单个成本。
sourcejedi

Answers:


17

如果您的任务是在特定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支持之前:-(。而且我想它们也适用于较旧的硬件。请咨询内核专家或运行您自己的测量值,了解上下文切换的成本如何更改了您特定的内核版本和硬件... ASID可以缓解PTI,除了非常频繁地调用内核的软件外,主要的例子是数据库。但是我对数字并不太了解。

Molnar对原始RFC补丁的希望是,随着时间的流逝,“大多数Linux发行版可能会启用它”。我注意到Fedora 28提供了带有NO_HZ_FULL支持的默认内核。但是,Debian 9没有。


最近,Linux v4.17 nohz_fullCPU 去除了剩余的1 Hz计时器滴答。我认为对吞吐量的影响很小:-),但是NO_HZ_FULL当CPU上有多个可运行的进程时,我一直在尝试遵循收益的状态-

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

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


那kernel.sched_rr_timeslice_ms呢?
Nadav B '18

1
@NadavB,如果您正在使用实时s​​ched_rr任务,请这样说。这是一个专业的话题。如果您不是,则否:-)。
sourcejedi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.