AMD 工程师 K Prateek Nayak 最近发现,Linux 内核中一个已有 20 年历史的芯片组变通方法仍应用于现代 AMD 系统中,而其在某些情况下会损害现代 Zen 硬件的性能。并提出了一个相关的补丁,旨在将这种变通方法限制在旧系统上,从而帮助提高现代系统的性能。
根据介绍,自从 2002 年将 ACPI 支持添加到 Linux 内核以来,就一直有一个“dummy wait op”来处理一些芯片组的 STPCLK# 没有被及时处理的问题。这个 dummy I/O read 会延迟进一步的指令处理,直到 CPU 完全停止。“至少在一些带有 VIA 芯片组的 AMD Athlon era systems 中,这是一个问题……但对于大约过去二十年的新芯片组来说,这不是问题”。
K Prateek Nayak 指出:
在 AMD Zen3 系统上使用 IBS 对某些工作负载进行采样表明,大量时间花费在 dummy op 中,这被错误地视为 C-State residency。较大的 C-State residency 值可以使 cpuidle governor 在随后的空闲实例期间推荐一个 deeper C-State,从而开始恶性循环,导致在繁忙和空闲阶段之间快速切换的工作负载的性能下降。
其中一个工作负载是 tbench,在某些运行期间可以观察到大量的性能下降。
因此至少对于 Tbench 而言,Linux 内核中这种长期、无条件的变通方法一直在损害 AMD Ryzen / Threadripper / EPYC 在特定工作负载中的性能:
不过其并未影响现代 Intel 系统,因为较新的 Intel 平台使用了基于 MWAIT 的 intel_idle 驱动程序代码路径来进行替代。
值得一提的是,Intel Linux 工程师 Dave Hansen 在 K Prateek Nayak 的补丁上进行进一步的简化。该补丁将不会应用这种“dummy wait”的解决方法,因此 AMD 系统将放弃这个会降低现代系统性能的操作。目前,这一补丁已作为 x86/urgent 修复的一部分被合并到 Linux 6.0 中。