Prozessortaktung
Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:
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) |
amd_pstate | neuere AMD Prozesoren mit Zen 2 und Zen 3 (oder neuer) Architektur |
acpi-cpufreq | 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. |
schedutil | Die CPU-Frequenz wird abhängig von dem Arbeitsaufkommen des Schedulers angepasst. |
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 variieren.
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_governors | 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 Stromsparen 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 verwendender 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 ein vorangestelltes sudo, sudo echo XXX > /sys/...
sich nur auf den Echobefehl, nicht aber auf die Umlenkung erstreckt.
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
Befehl zum Installieren der Pakete:
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 wieder überschrieben bzw. zurückgesetzt werden. Dies sollte bei Manipulationen am Governor beachtet werden.
Links¶
laptop-mode-tools - Taktfrequenz etc. eines (Laptop-) Computers kontrollieren
Strom sparen - weitere Maßnahmen, um (am Laptop) Strom zu sparen
Shell-Skript zum schnellen Anzeigen der möglichen CPU-Frequenzen, verfügbarer Governors etc. ⮷
Why are missing the frequency options on cpufreq-utils indicator? 🇬🇧