Vergessener Patch im Linux-Kernel gefunden, der die AMD-CPU-Leistung beeinträchtigt

Der Linux 6.0-Kernel, der voraussichtlich am kommenden Montag veröffentlicht wird, hat eine Änderung übernommen, die Leistungsprobleme auf Systemen behebt, die auf AMD Zen-Prozessoren basieren. Es stellte sich heraus, dass die Ursache des Leistungsabfalls vor 20 Jahren hinzugefügter Code war, um ein Hardwareproblem in einigen Chipsätzen zu umgehen. Das Hardwareproblem ist seit langem behoben und tritt bei aktuellen Chipsätzen nicht mehr auf, aber der alte Workaround ist in Vergessenheit geraten und hat sich zu einer Ursache für Leistungseinbußen auf Systemen entwickelt, die auf modernen AMD-CPUs basieren. Neue Systeme mit Intel-CPUs sind von der alten Problemumgehung nicht betroffen, da sie über einen separaten intel_idle-Treiber auf ACPI zugreifen und nicht über einen gemeinsamen Prozessor_idle-Treiber.

Im März 2002 wurde dem Kernel eine Problemumgehung hinzugefügt, um das Auftreten eines Fehlers in Chipsätzen zu verhindern, der damit zusammenhängt, dass der Ruhezustand aufgrund der Verzögerung der STPCLK#-Signalverarbeitung nicht richtig eingestellt wird. Um das Problem in der ACPI-Implementierung zu umgehen, wurde eine zusätzliche WAIT-Anweisung hinzugefügt, die den Prozessor verlangsamt, sodass der Chipsatz Zeit hatte, in den Ruhezustand zu wechseln. Bei der Profilerstellung mithilfe von IBS-Anweisungen (Instruction-Based Sampling) auf AMD Zen3-Prozessoren wurde festgestellt, dass der Prozessor viel Zeit mit der Ausführung eines Stubs verbringt, was zu einer falschen Interpretation des Lastzustands des Prozessors und der Einstellung tieferer Schlafmodi führt (C-State) durch die Handler-Cpuidle.

Dieses Verhalten spiegelt sich in Leistungseinbußen bei Arbeitslasten wider, die häufig zwischen Leerlauf- und Auslastungszuständen wechseln. Wenn beispielsweise ein Patch verwendet wird, der das Bypass-Manöver deaktiviert, steigen die durchschnittlichen Tbench-Testergebnisse von 32191 MB/s auf 33805 MB/s.

Source: opennet.ru

Kommentar hinzufügen