AMD 工程師 K Prateek Nayak 最近發現,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)合并窗口再提交。
原文地址:http://www.myzaker.com/article/6331cfec8e9f094bf3098b0d