上周发布了一个ACPI处理器空闲代码的补丁,以避免现代AMD Zen系统上的旧芯片组工作方法。自从ACPI支持在2002年被添加到Linux内核以来,一直有一个"假等待操作"来处理一些芯片组的STPCLK#没有被及时处理的问题。这个假的I/O读数会延迟进一步的指令处理,直到CPU完全停止。这是一些使用威盛芯片组的AMD Athlon时代系统的问题。但在过去20年里,新的芯片组没有这个问题。
在过去20年里,一个针对现在的古老芯片组的Linux内核解决方法仍然被不必要地应用于现代AMD系统,这反过来又会损害特定工作负载的性能。K Prateek Nayak发现,即使是现代的AMD系统,也仍然在应用这种变通方法。
在AMD Zen3系统上用IBS对某些工作负载进行采样显示,大量的时间花在假操作上,这被错误地算作C-State驻留。一个大的C-State驻留值可以促使处理器在随后的空闲实例中推荐一个更深的C-State,开始一个恶性循环,导致在繁忙和空闲阶段之间快速切换的工作负载性能下降。
一个这样的工作负载是Tbench,在某些运行中可以观察到大规模的性能下降。至少对于Tbench来说,Linux内核中的这种长期的、无条件的工作方法一直在损害AMD Ryzen / Threadripper / EPYC在特定工作负载中的性能。这个变通方法并没有影响到现代英特尔系统,因为那些较新的英特尔平台使用替代的基于MWAIT的intel_idle驱动代码路径。
AMD的补丁演变成了英特尔Linux工程师Dave Hansen的这个补丁。那个将"假等待"的工作方法限制在旧系统上的补丁已经排到了TIP的x86/紧急分支。由于它走的是"x86/紧急"的路线,而且修复了一个在现代硬件上不需要的工作方法,这个补丁很可能会在本周作为Linux 6.0内核提交,而不是需要等到下一个(v6.1)合并窗口再提交。
扫一扫
在手机上阅读