AMD工程師K Prateek Nayak最近發(fā)現(xiàn),Linux內(nèi)核中一個(gè)大約20年前的芯片組解決方法仍被應(yīng)用于現(xiàn)代AMD系統(tǒng),在某些情況下,它負(fù)責(zé)損害現(xiàn)代Zen硬件性能。幸運(yùn)的是,一個(gè)修復(fù)程序正在進(jìn)行中,它可以限制舊系統(tǒng)的工作方法,從而幫助提升現(xiàn)代系統(tǒng)的性能。
上周發(fā)布了一個(gè)ACPI處理器空閑代碼的補(bǔ)丁,以避免現(xiàn)代AMD Zen系統(tǒng)上的舊芯片組工作方法。自從ACPI支持在2002年被添加到Linux內(nèi)核以來,一直有一個(gè)"假等待操作"來處理一些芯片組的STPCLK#沒有被及時(shí)處理的問題。這個(gè)假的I/O讀數(shù)會(huì)延遲進(jìn)一步的指令處理,直到CPU完全停止。這是一些使用威盛芯片組的AMD Athlon時(shí)代系統(tǒng)的問題。但在過去20年里,新的芯片組沒有這個(gè)問題。
在過去20年里,一個(gè)針對(duì)現(xiàn)在的古老芯片組的Linux內(nèi)核解決方法仍然被不必要地應(yīng)用于現(xiàn)代AMD系統(tǒng),這反過來又會(huì)損害特定工作負(fù)載的性能。K Prateek Nayak發(fā)現(xiàn),即使是現(xiàn)代的AMD系統(tǒng),也仍然在應(yīng)用這種變通方法。
在AMD Zen3系統(tǒng)上用IBS對(duì)某些工作負(fù)載進(jìn)行采樣顯示,大量的時(shí)間花在假操作上,這被錯(cuò)誤地算作C-State駐留。一個(gè)大的C-State駐留值可以促使處理器在隨后的空閑實(shí)例中推薦一個(gè)更深的C-State,開始一個(gè)惡性循環(huán),導(dǎo)致在繁忙和空閑階段之間快速切換的工作負(fù)載性能下降。
一個(gè)這樣的工作負(fù)載是Tbench,在某些運(yùn)行中可以觀察到大規(guī)模的性能下降。至少對(duì)于Tbench來說,Linux內(nèi)核中的這種長(zhǎng)期的、無條件的工作方法一直在損害AMD Ryzen / Threadripper / EPYC在特定工作負(fù)載中的性能。這個(gè)變通方法并沒有影響到現(xiàn)代英特爾系統(tǒng),因?yàn)槟切┹^新的英特爾平臺(tái)使用替代的基于MWAIT的intel_idle驅(qū)動(dòng)代碼路徑。
AMD的補(bǔ)丁演變成了英特爾Linux工程師Dave Hansen的這個(gè)補(bǔ)丁。那個(gè)將"假等待"的工作方法限制在舊系統(tǒng)上的補(bǔ)丁已經(jīng)排到了TIP的x86/緊急分支。由于它走的是"x86/緊急"的路線,而且修復(fù)了一個(gè)在現(xiàn)代硬件上不需要的工作方法,這個(gè)補(bǔ)丁很可能會(huì)在本周作為L(zhǎng)inux 6.0內(nèi)核提交,而不是需要等到下一個(gè)(v6.1)合并窗口再提交。
(舉報(bào))