ubuntuusers.de

Prozessortaktung

Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:

Wiki/Icons/config.png Linux bietet die Möglichkeit, die Taktfrequenz des Prozessors (CPU) auszulesen und wenn notwendig, auch zu modifizieren bzw. den aktuellen Bedürfnissen (an die Rechenleistung) anzupassen. Dies wird normalerweise vollautomatisch erledigt.

Während die Taktfrequenzstufen und -grenzen durch die Hardware vorgegeben sind, entscheidet ein "(Scaling-)Governor", wie die Taktfrequenz automatisch geregelt bzw. konkret angepasst wird. Moderne CPUs und die entsprechenden Module im Linux Kernel besitzen vielfältige Mechanismen zum Stromsparen und verschiedene Modi / (Tief-) Schlafmodi, die C-States. Deshalb ist ein manueller Eingriff in das Umschaltverhalten des Taktfrequenz bzw. der Wahl des Governors in der Regel nicht notwendig oder empfehlenswert. Wer dies trotzdem tun möchte findet im Abschnitt manuelle Einstellungen einige Hinweise dazu.

Hinweis:

Je nach Prozessortyp stehen gegebenenfalls nicht alle in diesem Artikel beschriebenen Abfrage- und Einstellmöglichkeiten zur Verfügung, wenn im BIOS des Rechners bestimmt Funktionen der CPU aktiviert bzw. deaktiviert werden können.

CPU Treiber und Governor

Für jede CPU bzw. für genau genommen für jeden CPU-Kern ist ein Treiber in Form eines Kernelmoduls zuständig. Jeder Treiber wiederum stellt verschiedene "Scaling Governor" (oder kurz nur : "Governor") zur Verfügung, die das Wechseln der Taktfrequenz des CPU-Kerns zuständig sind.

Kernel-Module

Die folgenden Tabelle gibt eine Übersicht über einige Kernelmodule für x86 CPUs:

Übersicht Kernel Module für CPUs
Kernel-Modul Prozessortyp(en)
intel_pstate Intel Core i Prozessoren Sandy Bridge und neuer (=alle Intel Core i CPUs ab 2011)
acpi-cpufreq neuere AMD Prozessoren der Athlon 64, Opteron und Phenom Serien
p4-clockmod Intel Pentium 4, Xeon und Celeron Prozessoren
powernow-k8 AMD K8, K10 sowie ältere Athlon 64, Opteron und Phenom Prozessoren
speedstep-lib Intel Atom und altere Pentium Prozessoren
cpufreq_nforce2 Mainboards mit Nforce2-Chipsatz

Welches Modul geladen ist, kann man über die Ausgabe von

lsmod | less 

feststellen (beenden mit Q . In neueren Ubuntu-Versionen sind die Module teilweise statisch in den Kernel eingebunden, und werden daher nicht von lsmod angezeigt. Für intel-pstate (das Standmodul für alle Core i Prozessoren ab 2011) prüft man das z.B. mit folgendem Befehl. Steht am Ende der Ausgabezeile ein "y", ist das Modul fest in den Kernel eingebunden und wird daher bei jedem Start geladen.

grep INTEL_PSTATE /boot/config* 

...
/boot/config-4.4.0-104-generic:CONFIG_X86_INTEL_PSTATE=y
...

Eine vollständige Übersicht über alle Module, die im aktuellen Linux-Kernel enthalten sind, findet man auf der Github-Seite des Linux-Kernels:

Scaling Governor

Der "Scaling Governor" oder kurz einfach nur Governor, bestimmt, wann und wie welche CPU die Taktfrequenz wie ändert. Es gibt die folgenden Governor:

Governor Beschreibung
ondemand Standard bei den meisten Systemen, die nicht das Intel P-State Modul für die CPU verwenden. Die CPU-Frequenz wird den aktuellen Bedürfnissen an die Rechenleistung angepasst. Dabei wird die CPU-Frequenz u.U. sprunghaft angehoben oder abgesenkt.
conservative Die CPU-Frequenz wird den aktuellen Bedürfnissen an die Rechenleistung angepasst. Die Taktfrequenz wird aber Schritt-für-Schritt angehoben bzw. abgesenkt.
performance CPU läuft permanent auf der höchsten erlaubten Taktfrequenz
powersave CPU läuft permanent auf der niedrigsten erlaubten Taktfrequenz.
userspace Dies ist kein kernel-eigener Governor. Vielmehr wird ein eigenes Governor-Programm verwendet.

Je nach CPU-Architektur und Typ stehen nicht alle Governor zur Verfügung. So kennt z.B. das Intel P-State Modul, welche für alle neueren Core i CPUs der Standard ist, "nur" die Governors "Performance" und "Powersave".

Informationen zur Prozessortaktung ermitteln

Informationen zum Prozessor bzw. dessen Taktfrequenz sind im sys-Verzeichnis zu finden. Der Befehl[1]

ls /sys/devices/system/cpu/cpu0/cpufreq/ 

zeigt das Verzeichnis für die cpu0 an, in dem alle Informationen hinterlegt sind. Solch ein Verzeichnis gibt es für jede CPU, d.h. für eine 4-Kern CPU gibt es auch die Verzeichnisse cpu1, cpu2 und cpu3.

Die Ausgabe für z.B. eine Intel i5 Prozessor sieht so aus:

affected_cpus               related_cpus                 scaling_governor
cpuinfo_max_freq            scaling_available_governors  scaling_max_freq
cpuinfo_min_freq            scaling_cur_freq             scaling_min_freq
cpuinfo_transition_latency  scaling_driver               scaling_setspeed

Hinweis:

Bei anderen CPU-Architekturen und Typen kann die Ausgabe leicht anders aussehen.

Die verschiedenen Dateien beinhalten die folgenden Informationen:

Datei enthaltene Information
scaling_driver Name des Linux Kernel Treibers, der für die CPU zuständig ist
scaling_governor Name des Governors, der aktuell die Taktfrequenz des CPU-Kerns regelt
scaling_available_governor Liste der für diesen CPU-Kern verfügbaren Governor
scaling_max_freq Frequenz in Hertz, mit der der Governor den CPU-Kern maximal laufen lässt
scaling_min_freq Frequenz in Hertz, mit der der Governor den CPU-Kern minimal laufen lässt
cpuinfo_max_freq Frequenz in Hertz, mit der der CPU-Kern maximal laufen kann
cpuinfo_min_freq Frequenz in Hertz, mit der der CPU-Kern minimal laufen kann

CPU Zustände - C-States

CPUs, wie sie üblicherweise in Desktop-Rechnern und Servern verwendet werden, kennen verschiedene Zustände der Leistungaufnahme die C-States. Diese werden mit dem Buchstaben C, gefolgt von einer Zahl und ggf. gefolgt von einem weiteren Buchstaben, gekennzeichnet. Der Zustand C0 ist der CPU (bzw. eines CPU-Kerns) unter Last, also wenn der Kern voll aktiv ist. Je höher die Zahl hinter dem C, desto weniger Strom braucht der CPU-Kern in diesem Moment.

Die Anzahl der Zustände, die die CPU 0 des Rechners kennt, sind im Verzeichnis /sys/devices/system/cpu/cpu0/cpuidle/ zu sehen. Hier gibt es Unterverzeichnisse mit den Namen state0 bis stateX, wobei X je nach CPU-Architektur und Typ variieren kann. In jedem Verzeichnis sind Informationen zum jeweiligen C-State abgelegt. Die Nummerierung der Verzeichnisse muss zumindest ab state2 nicht dem C-State entsprechen. So kann z.B. im Verzeichnis state2 die Information zum C-State C1E abgelegt sein.

Der Inhalt eines state-Verzeichnisses kann z.B. so aussehen:

above  below  desc  disable  latency  name  power  residency  time  usage

Die Dateien enthalten die folgenden Informationen:

Datei Beschreibung
name enthält den Namen des C-States (also z.B. C0)
time Zeit in Mikrosekunden, die der CPU-Kern in diesem C-State verbracht hat
usage Zähler, wie oft der CPU-Kern in diesen C-State gewechselt hat

Ein vollständige Beschreibung aller Dateien ist in der Kernel-Dokumentation 🇬🇧 zu finden.

manuelle Einstellungen

Artikel für fortgeschrittene Anwender

Dieser Artikel erfordert mehr Erfahrung im Umgang mit Linux und ist daher nur für fortgeschrittene Benutzer gedacht.

Achtung!

Die unüberlegte oder unvorsichtige Änderung von Dateien, welche die CPU-Taktfrequenz beeinflussen, kann im schlimmsten Fall zur Beschädigung der Hardware führen!

In aktuellen Ubuntu-Versionen wird die Prozessorsteuerung vollautomatisch über eine vordefinierte Kernel-Einstellung bzw. die zuständigen Module im Kernel geregelt. Damit muss der Anwender diesbezüglich eigentlich nichts weiter tun.

Wie in der Einleitung schon erwähnt, haben moderne CPUs und deren Kernel Treiber sehr effizient Mechanismen zum Stormsparen implementiert. Ein manueller Eingriff kann also auch dazu führen, dass eine vermeintlich Optimierung letztendlich zu einem erhöhten Energieverbrauch der CPU führt. So kann es z.B. bei rechenintensiven Aufgaben effizienter sein, kurz mit hoher Frequenz (=höherer Stromverbrauch) zu rechnen und dann wieder in einen Halte- oder Schlafzustand zurück zu fallen, als über einen längeren Zeitraum mit niedriger oder mittleren Frequenz zu rechnen.

Wer dies nichts desto trotz machen möchte, findet im folgenden Abschnitt die entsprechenden Befehle.

Governor und Frequenzgrenzen ändern

Manuell lassen sich folgende Änderungen vornehmen:

  • maximal erlaubte obere Taktfrequenz

  • minimal erlaubte untere Taktfrequenz

  • zu verwendener Governor

Die Änderungen lassen sich per echo und tee in die entsprechende Datei schreiben. Im folgenden Beispiel wird zuerst für den ersten CPU-Kern der aktuelle Governor abgefragt, dann die möglichen Alternativen und anschließend der Governor von "powersave" auf "performance" gesetzt:

cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor 

powersave
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors 

powersave performance
echo performance | sudo tee /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor 

performance

Im nächsten Beispiel wird die maximale Taktfrequenz von 2700000 (=2.7 GHz) auf 2000000 (=2.0 GHz) begrenzt:

cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq 

2700000

echo 2000000 | sudo tee /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq 

Die Umleitung über tee ist für das Wechseln des Governors notwendig, da ein direktes echo XXX > /sys/... nicht erlaubt ist und mit einer Fehlermeldung beendet wird.

Zu bedenken ist, dass die Änderung flüchtig ist, d.h. nach einem Neustart des Rechners muss die gewünschte Änderung erneut vorgenommen werden.

Weiterführende Informationen

Weitere Informationen zu den verschiedenen Governors, den Dateien im Verzeichnis /sys/devices/system/cpu/cpu0/cpufreq und manuellen Eingriffsmöglichkeiten enthält die Kernel-Dokumentation. Diese kann über folgendes Paket installiert werden [1]:

  • linux-doc

Paketliste zum Kopieren:

sudo apt-get install linux-doc 

Oder mit apturl installieren, Link: apt://linux-doc

Die entsprechenden Dokumente befinden sich dann im Verzeichnis /usr/share/doc/linux-doc-KERNELVERSION/Documentation/cpu-freq, wobei die KERNELVERSION je nach System variiert.

Problembehebung

es wird kein CPU Modul geladen

In manchen seltenen Fällen - gerade bei Notebooks - kann es vorkommen, dass das BIOS falsche ACPI-Tabellenwerte zurückliefert. Dann kann es sein, dass entweder kein Modul geladen wurde oder ein anderes nötig ist.

Ein Kernel-Modul wird mit

sudo modprobe -v MODULNAME 

geladen. Näheres zum Umgang mit Modulen erfährt man unter Kernelmodule.

Nach dem Laden des richtigen Moduls sollte das Heruntertakten funktionieren. Wenn nicht, dann kann vielleicht noch ein BIOS-Update/-Downgrade (bekannte Bugs beim BIOS von Asus Mainboards; siehe Forum) helfen.

ondemand-Governor startet nicht

Per Design - it's a feature, not a bug - wird der Rechner ab Ubuntu 9.04 mit dem Governor performance gestartet. Nach kurzer Zeit (wenige Minuten nach Systemstart) übernimmt der neue Dienst ondemand die Aufgabe, den gleichnamigen Governor ondemand zu aktivieren. Damit ist Ubuntu in der Lage, den Systemstart zu beschleunigen, während der Prozessor im normalen Betrieb dynamisch geregelt wird.

Allerdings können Probleme mit manchen CPUs auftreten, die auf performance bleiben. Zur Diagnose die Datei /var/log/kern.log auf Fehlermeldungen prüfen. Beispiel:

"ondemand governor failed, too long transition latency of HW, fallback to performance governor"

Praktisch heißt das: der Prozessor ist nicht in der Lage, ausreichend schnell herunter- bzw. hochzutakten. Daher wird er dauerhaft mit der höchsten Taktfrequenz betrieben.

Speziell beim Pentium 4 kann der Einsatz eines userspace-Governors in Kombination mit dem Kernelmodul p4-clockmod helfen. Obwohl einzelne Taktstufen dann frei wählbar sind, bewirkt die Auswahl von "Conservative" und "Ondemand" in manchen Fällen einen Rückfall auf "Performance" ("Powersave" funktioniert). Die Kontrolle kann alternativ auch mit PowerTOP erfolgen.

Der Dienst ondemand kann auch der Grund sein, wenn eigene Einstellungen (z.B. über /etc/rc.local) wieder überschrieben bzw. zurückgesetzt werden. Dies sollte bei Manipulationen am Governor beachtet werden.

Diese Revision wurde am 8. September 2020 09:28 von paule_pvp erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen: System, Hardware