
Es gibt zwei SLES 11-Server:
SERVER311:~ # cat /sys/devices/system/cpu/cpuidle/current_driver
acpi_idle
SERVER311:~ #
Und:
SERVER705:~ # cat /sys/devices/system/cpu/cpuidle/current_driver
intel_idle
SERVER705:~ #
Beide haben:
intel_idle.max_cstate=0 processor.max_cstate=0
in der Datei: "/boot/grub/menu.lst", wurden neugestartet.
Die Frage:Was ist der Unterschied zwischen acpi_idle und intel_idle?
Antwort1
Kurze Antwort: Beides sind unterschiedliche Implementierungen von CPU-Leerlauftreibern. acpi_idle ist der Standardtreiber und unterstützt alle CPU-Architekturen, während intel_idle spezifisch für Intel-CPUs ist.
Mehr Details: Die API für einen CPU-Leerlauftreiber ist in include/linux/cpuidle.h definiert. Sie definiert das „allgemeine Framework für die CPU-Leerlauf-Energieverwaltung“. Der acpi_idle-Treiber (definiert in drivers/acpi/processor_idle.c) implementiert dieses Verhalten für alle CPU-Architekturen. intel_idle (definiert in drivers/idle/intel_idle.c) ist ein Leerlauftreiber, der speziell für moderne Intel-CPUs entwickelt wurde (aus den Kommentaren im intel_idle.c-Header):
/* * intel_idle.c – native Hardware-Leerlaufschleife für moderne Intel-Prozessoren * ...
/* * intel_idle ist ein CPU-Treiber, der auf bestimmten Intel-Prozessoren * anstelle des alten ACPI-Prozessor_idle-Treibers geladen wird. Die Absicht ist, * Linux auf diesen Prozessoren effizienter zu machen, da intel_idle * mehr weiß als ACPI, und Linux außerdem immuner gegen ACPI-BIOS-Fehler zu machen. */
Daher sollten Sie für moderne Intel-CPUs den Treiber „intl_idle“ verwenden, da dieser speziell zur Steigerung der Effizienz von Intel-CPUs entwickelt wurde.
Warum werden also einige Setups mit intel_idle und andere mit acpi_idle geladen? Dies steht in der Commit-Nachricht zur Einführung des intel_idle-Treibers:
Melden Sie sich bei 2671717265ae6e720a9ba5f13fbec3a718983b65 an.
Autor: Len Brown Datum: Mo 8. März 2010 14:07:30 -0500
intel_idle: nativer Hardware-CPU-Treiber für die neuesten Intel-Prozessoren
Dieser EXPERIMENTELLE Treiber ersetzt acpi_idle auf Intel Atom-Prozessoren, Intel Core i3/i5/i7-Prozessoren und zugehörigen Intel Xeon-Prozessoren.
Der Intel Core2-Prozessor oder früher wird nicht unterstützt.
Bei mit ACPI konfigurierten Kerneln ermöglicht CONFIG_INTEL_IDLE=y intel_idle vor dem ACPI-Prozessortreiber zu testen. Das Booten mit „intel_idle.max_cstate=0“ deaktiviert intel_idle und das System greift auf „acpi_idle“ von ACPI zurück.
Typische Linux-Distributionen laden das ACPI-Prozessormodul frühzeitig, wodurch CONFIG_INTEL_IDLE=m auf ACPI-Plattformen nicht ohne weiteres nutzbar ist.
intel_idle prüft alle Prozessoren zum Zeitpunkt module_init. Prozessoren, die später im laufenden Betrieb hinzugefügt werden, sind im Leerlauf auf die Verwendung von C1 beschränkt.
Unterzeichnet von: Len Brown
Die Gründe sind also:
- Nicht-Intel-CPU auf dem System oder ältere Intel-Architekturen.
- Nicht als CONFIG_INTEL_IDLE=y in .config markiert
- Booten mit intel_idle.max_cstate=0 in der Befehlszeile
Da Sie sagten, Sie hätten bei beiden Setups #3 eingestellt, stellt sich die Frage, warum eines davon mit intel_idle geladen wurde. Versuchen Sie es mit „cat /proc/cmdline“ und stellen Sie sicher, dass die Option wirklich eingestellt ist. Überprüfen Sie außerdem die Unterschiede zwischen den Architekturen mit „lscpu“ oder „cat /proc/cpuinfo“.
Antwort2
Die andere Antwort hat die Unterschiede wirklich gut zusammengefasst: intel_idle vs. acpi_idle.
Gibt zusätzliche Informationen zum Aktivieren der einzelnen Treiber. Dabei wird davon ausgegangen, dass der Kernel mit CONFIG_INTEL_IDLE=y erstellt wurde.
- intel_idle: Aktivieren Sie C-States im Plattform-BIOS und verwenden Sie kein Kernel-Boot-Argument. Überprüfen Sie dann, ob
/sys/devices/system/cpu/cpuidle/current_driver
angezeigt wirdintel_idle
. - acpi_idle: Aktivieren Sie C-States im Plattform-BIOS, verwenden Sie das Kernel-Boot-Argument intel_idle.max_cstate=0 und überprüfen Sie, ob current_driver ist
acpi_idle
. - C-States vollständig deaktivieren: Deaktivieren Sie C-States im Plattform-BIOS, schließen Sie das Kernel-Boot-Argument intel_idle.max_cstate=0 ein und überprüfen Sie, ob current_driver ist
none
.