So aktualisieren Sie mögliche C-Zustände

So aktualisieren Sie mögliche C-Zustände

Ich habe Ubuntu 20.04.4 LTS auf einem alten Motherboard mit Intel i5 3570k ausgeführt. Diese CPU hat eine begrenzte Anzahl verfügbarer C-Zustände und daher war der Stromverbrauch mittelmäßig. Ich habe jetzt auf ein neues Motherboard mit installiertem i7 11700k aktualisiert und als ich Powertop verwendet habe, um zu überprüfen, wie meine Ubuntu-Distribution funktioniert, habe ich festgestellt, dass die verfügbaren C-Zustände abgenommen haben, was wahrscheinlich bedeutet, dass mehr Spielraum zum Energiesparen besteht. Ich habe Ubuntu überprüft, das vom USB-Laufwerk gestartet wurde, und alle C-Zustände waren verfügbar. So sieht Powertop die C-Zustände im Moment:

Darin steht, dass mit ACPI nur die Zustände C1, C2 und C3 verfügbar sind. Was muss ich tun, um alle anderen C-Zustände nutzen zu können?

Ich wurde gebeten, die Ausgabe von grep cpu bereitzustellen:

/sys/devices/system/cpu/cpu0/cpuidle/state0/name:POLL
/sys/devices/system/cpu/cpu0/cpuidle/state1/name:C1_ACPI
/sys/devices/system/cpu/cpu0/cpuidle/state2/name:C2_ACPI
/sys/devices/system/cpu/cpu0/cpuidle/state3/name:C3_ACPI

Antwort1

Intel entscheidet für jede Prozessorfamilie, ob die standardmäßige ACPI-Leerlaufstruktur, die von Linux-Kerneln verwendet wird, überschrieben werden soll. Dies geschieht im Kernel-Quellcodebaum unter drivers/idle/intel_idle.c. Ein Beispiel für die Überschreibung für meinen Comet Lake-Prozessor:

doug@s19:~/temp-k-git/linux$ git diff
diff --git a/drivers/idle/intel_idle.c b/drivers/idle/intel_idle.c
index 3273360f30f7..770660d777c4 100644
--- a/drivers/idle/intel_idle.c
+++ b/drivers/idle/intel_idle.c
@@ -1155,6 +1155,7 @@ static const struct x86_cpu_id intel_idle_ids[] __initconst = {
        X86_MATCH_INTEL_FAM6_MODEL(KABYLAKE_L,          &idle_cpu_skl),
        X86_MATCH_INTEL_FAM6_MODEL(KABYLAKE,            &idle_cpu_skl),
        X86_MATCH_INTEL_FAM6_MODEL(SKYLAKE_X,           &idle_cpu_skx),
+       X86_MATCH_INTEL_FAM6_MODEL(COMETLAKE,           &idle_cpu_skl),
        X86_MATCH_INTEL_FAM6_MODEL(ICELAKE_X,           &idle_cpu_icx),
        X86_MATCH_INTEL_FAM6_MODEL(XEON_PHI_KNL,        &idle_cpu_knl),
        X86_MATCH_INTEL_FAM6_MODEL(XEON_PHI_KNM,        &idle_cpu_knl),

Standardmäßig sind die Leerlaufzustände:

$ grep . /sys/devices/system/cpu/cpu0/cpuidle/state*/name
/sys/devices/system/cpu/cpu0/cpuidle/state0/name:POLL
/sys/devices/system/cpu/cpu0/cpuidle/state1/name:C1_ACPI
/sys/devices/system/cpu/cpu0/cpuidle/state2/name:C2_ACPI
/sys/devices/system/cpu/cpu0/cpuidle/state3/name:C3_ACPI

$ grep . /sys/devices/system/cpu/cpu0/cpuidle/state*/desc
/sys/devices/system/cpu/cpu0/cpuidle/state0/desc:CPUIDLE CORE POLL IDLE
/sys/devices/system/cpu/cpu0/cpuidle/state1/desc:ACPI FFH MWAIT 0x0
/sys/devices/system/cpu/cpu0/cpuidle/state2/desc:ACPI FFH MWAIT 0x30
/sys/devices/system/cpu/cpu0/cpuidle/state3/desc:ACPI FFH MWAIT 0x60

Über die obige Übersteuerung sind die Leerlaufzustände:

$ grep . /sys/devices/system/cpu/cpu0/cpuidle/state*/name
/sys/devices/system/cpu/cpu0/cpuidle/state0/name:POLL
/sys/devices/system/cpu/cpu0/cpuidle/state1/name:C1
/sys/devices/system/cpu/cpu0/cpuidle/state2/name:C1E
/sys/devices/system/cpu/cpu0/cpuidle/state3/name:C3
/sys/devices/system/cpu/cpu0/cpuidle/state4/name:C6
/sys/devices/system/cpu/cpu0/cpuidle/state5/name:C7s
/sys/devices/system/cpu/cpu0/cpuidle/state6/name:C8
/sys/devices/system/cpu/cpu0/cpuidle/state7/name:C9
/sys/devices/system/cpu/cpu0/cpuidle/state8/name:C10

$ grep . /sys/devices/system/cpu/cpu0/cpuidle/state*/desc
/sys/devices/system/cpu/cpu0/cpuidle/state0/desc:CPUIDLE CORE POLL IDLE
/sys/devices/system/cpu/cpu0/cpuidle/state1/desc:MWAIT 0x00
/sys/devices/system/cpu/cpu0/cpuidle/state2/desc:MWAIT 0x01
/sys/devices/system/cpu/cpu0/cpuidle/state3/desc:MWAIT 0x10
/sys/devices/system/cpu/cpu0/cpuidle/state4/desc:MWAIT 0x20
/sys/devices/system/cpu/cpu0/cpuidle/state5/desc:MWAIT 0x33
/sys/devices/system/cpu/cpu0/cpuidle/state6/desc:MWAIT 0x40
/sys/devices/system/cpu/cpu0/cpuidle/state7/desc:MWAIT 0x50
/sys/devices/system/cpu/cpu0/cpuidle/state8/desc:MWAIT 0x60

Diese Aussage:

Mir ist aufgefallen, dass die verfügbaren C-Zustände abgenommen haben, was wahrscheinlich bedeutet, dass mehr Spielraum zum Energiesparen besteht.

Das ist falsch. Es gibt keinen Raum für Energieeinsparungen nur in den aktuell verfügbaren Zuständen. Beachten Sie, dass der tiefste Zustand derselbe ist. Sie können möglicherweise etwas Energie sparen, indem Sie den Leerlaufregler entsprechend Ihren speziellen Workflow-Anforderungen auswählen:

$ grep . /sys/devices/system/cpu/cpuidle/*
/sys/devices/system/cpu/cpuidle/available_governors:ladder menu teo
/sys/devices/system/cpu/cpuidle/current_driver:intel_idle
/sys/devices/system/cpu/cpuidle/current_governor:teo
/sys/devices/system/cpu/cpuidle/current_governor_ro:teo
/sys/devices/system/cpu/cpuidle/low_power_idle_cpu_residency_us:0
/sys/devices/system/cpu/cpuidle/low_power_idle_system_residency_us:0

verwandte Informationen