AMD工程師KPrateekNayak最近發現,Linux內核中一個大約20年前的芯片組解決方法仍被應用於現代AMD系統,在某些情況下,它負責損害現代Zen硬件性能。幸運的是,一個修復程序正在進行中,它可以限制舊系統的工作方法,從而幫助提升現代系統的性能。
上周發佈一個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)合並窗口再提交。