Dies ist eine alte Version des Dokuments!
Undervolting
Die Theorie
Wozu braucht man Undervolting?
Das Undervolting ist ein sehr gutes Mittel, um ein System effizienter und leistungsfähiger zu machen, ohne hierbei Gefahr zu laufen, die Hardware wie Prozessor, Mainboard oder RAM irreperabel zu schädigen, was beim Overclocking durchaus passieren kann. Es lässt sich bei allen heutigen Systemen - ob alt, oder neu - anwenden und hat als positive Nebenwirkung, dass auch noch zusätzlich Strom im Leerlauf und auch unter Last gespart wird.
Die Taktung
Zuerst ein wenig Hintergunderklärung: Man muss generell wissen, dass heutige Prozessoren einen sehr großen Arbeitsbereich haben und diesen sehr dynamisch steuern können. Dies tun sie über die Taktrate oder auch als Frequenz in Mega-, oder GigaHerz bezeichnet. Mehrkernprozessoren mit 6, 8 oder mehr Kernen können diese teilweise ganz Stilllegen wenn diese nicht gebraucht werden (0 Mhz). Oder einige Kerne werden nur mit einer niedrigen Taktrate betreiben, um kleinere Aufgaben zu erledigen.
In der allermeisten Zeit läuft ein heutiges PC- System nur mit einem Bruchteil seiner maximale Taktrate, um Energie zu sparen. Der Nutzer merkt dies nicht - in dem Moment, wo die volle Leistung gebraucht wird, schaltet der Prozessor sehr schnell um und steigert seinen Takt bis zur seiner Maximalgrenze.
Egal aber, in welchem Leistungsbereich sich der Kern gerade befindet: Seine Leistungsaufnahme (gemessen in Watt) ist immer Abhängig von der aktuellen Taktung und der dazugehörigen Spannung. Die Stromstärke - der dritte Leistungsfaktor - lässt sich nicht beeinflussen, da Änderungen hier sehr schnell physikalische Auswirkungen haben und den Prozessor schädigen würden.
Das thermale Budget
Je mehr Leistung der Prozessor verbraucht, desto höher ist die Wärme, die er erzeugt. Hierbei können sehr große Wärmemengen auf einem sehr kleinen Bereich entstehen. Kein heutiger PC- Prozessor kann länger als ein paar Sekunden die volle Leistung liefern und schaltet zu seinem eigenen Schutz die Taktzahl herunter, sobald die Wärme zu groß wird, um sich zu schützen.
Das Overclocking
Beim Overcklocking, welches auf keinen Fall mit dem Undervolting zu verwechseln ist, stellt man die Taktrate hoch. Dies führt dazu, dass der Prozessor gezwungen wird, ausserhalb seiner Norm zu arbeiten. Hierdurch ist er in der Lage, für einen kurzen Moment mehr Maximalleistung zu bringen. Er verbraucht durch die höhere Taktung aber dauerhaft mehr Energie und wird schneller Heiss. Da sein thermales Budget schneller ausgereizt ist, wird er schneller seine Leistung wieder drosseln.
Zusätzlich führt der höhere Takt und dadurch größere Leistungsaufnahme dazu, dass bei gleicher Spannung ggfs. nicht genug Strom zur Verfügung steht. Hierdurch wird der Prozessor instabil und kann abstürzen. Dies kann man ausgleichen, indem man diesen zusätzlich mit höherer Spannung versorgt. Die höhere Spannung führt wieder zu noch mehr Hitze, so dass die Zeit bis zur Leistungsdrosselung noch kürzer wird und die Gefahr von einem Schaden an der hardware noch größer wird.
Diese Methode bringt also nur etwas, wenn man z.B. eine bessere Kühlung verbaut oder nur kurze Leistungsspitzen benötigt. In andere Fällen ist das Overclocking eher Energieverschwendung ohne großen Nutzen mit der großen Gefahr, den Prozessor oder das Mainboard im schlimmsten fall zu zerstören.
Undervolting
Ganz anders das Undervolting: hierbei stellt man bei den ansonsten unveränderten Taktraten die jeweilige Spannung möglichst niedrig ein. Dies geht, weil die Hersteller einen Puffer in der Spannung einbauen, der meistens recht groß ist. So werden die Prozessoren mit einer höheren Spannung betrieben, was alleine der Stabilität dient.
Der Prozessor bleibt in so jederzeit seiner Norm bezüglich Taktung und seine Leistung bleibt exakt gleich - es gibt keinen Einfluss auf die Rechenoperationen. Durch die niedrigere Spannung kann im schlimmsten Fall eine Berechnung nicht durchgeführt werden - was in leichten Fällen vom Betriebssystem bemerkt und wiederholt wird - oder schlimmstenfalls zum Aufhängen des Rechners führt. Nach einem Neustart, wird aber die alte Spannung wieder eingeschaltet und es ist kein Schaden entstanden.
Als sehr positiven Nebeneffekt kann der Rechner aufgrund der geringerem Wärmeerzegung in der maximale Leistungsstufe, diese sogar länger halten und damit hat über alles gesehen mehr Leistung. Zusätzlich spart er auch noch im Leerlauf Energie.
Undervolting ist damit das Mittel der Wahl, um Energie zu sparen und zeitgleich mehr Leistung zu erhalten.
Warum muss man das selbst einstellen?
Man kann sich nun Fragen: Warum stellen nicht die Hersteller gleich diesen Wert optimal ein? Nun die Antwort ist, dass jeder Prozessor sich in unterschiedlichen Situationen ganz leicht anders verhält. Das Herausfinden, was gerade noch geht, ist Zeitaufwändig und unter Umständen gar nicht richtig möglich. Schließlich weiss der Hersteller auch nicht, welches Mainboard, wieviel und welcher Speicher und welche Zusatzhardware verbaut wird. Deshalb werden die Prozessoren mit ganz sicheren Standarwerten geliefert - also sozusagen das Maximum, was auch in schlechtesten Bedingungen noch immer geht. Die Bedingungen sind aber bei 95% aller PCs besser - die mögliche optimalere Einstellung deshalb nur durch den Anwender möglich.
Fazit
Wir wissen nun: 95% aller Rechner können durch Undervolting ohne Änderung von gefährlichen Werten erheblich Leistungsfähiger und zeitgleich Stromsparender werden, als ohne. Im Folgenden wird gezeigt, wie das in der Praxis geht.
Die Praxis
Ich zeige anhand meines alten Testrechners auf welchem ein Linux/Fedora läuft nun, wie man im Terminal (als root) vorgehen kann, um korrekt zu undervolten. Das Vorgehen ist prinzipiell auch mit neuen Rechnern und mit Windows so anwendbar, auch wenn die benötigtem Programme dann anders heissen.
Ausgangslage
Zuerst sollte man die wichtigen Standardwerte herausfinden und sich notieren. Dies geht so:
>amdctl -g Pstate Status CpuFid CpuDid CpuVid CpuMult CpuFreq CpuVolt NbVid NbVolt IddVal IddDiv CpuCurr CpuPower 0 1 16 0 14 16.00x 3200MHz 1375mV 30 1175mV 190 10 19.00A 26.12W 1 1 9 0 22 12.50x 2500MHz 1275mV 30 1175mV 146 10 14.60A 18.62W 2 1 3 0 28 9.50x 1900MHz 1200mV 30 1175mV 130 10 13.00A 15.60W 3 1 0 1 42 4.00x 800MHz 1025mV 30 1175mV 76 10 7.60A 7.79W 4 1 0 0 0 8.00x 1600MHz 1550mV 0 1550mV 0 1 0.00A 0.00W
Diese Tabelle zeigt die wichtigen Werte: Taktung (CpuFreq), Spannung (CpuVolt) und Leistung (CpuPower) pro Leistungslevel (Pstate).
Das Programm lässt die Änderung der Spannung pro Level -pX durch den Parameter -vXX (CpuVid) zu. Ein höherer Wert ist eine NIEDRIGERE Spannung.
Beispiel:
>amdctl -p0 -v15
Setzt die Spannung für den Pstate 0 auf den nächstniedrigeren Wert:
Pstate Status CpuFid CpuDid CpuVid CpuMult CpuFreq CpuVolt NbVid NbVolt IddVal IddDiv CpuCurr CpuPower 0 1 16 0 15 16.00x 3200MHz 1362mV 30 1175mV 190 10 19.00A 25.89W
Hinweise: zum Ausprobieren nur in einzelnen Schritten testen und zuerst die Theorie durchlesen, bevor irgendwas größeres verstellt wird!
Stresstest installieren
Es ist sinnvoll, zuerst nur die Spannung von der höchsten Leistungsstufe zu ändern. Diese wird aber im Normalbetrieb nicht erreicht. Deshalb muss ein Stresstest eingeschaltet werden, der den Prozessor maximal fordert.
Ich setze hierzu das Tool „stress“ und das PIP-Tool „s-tui“ als dessen grafisches Frontend ein.
Installation:
>dnf install stress>pip install s-tui
Der Aufruf erfolt über „s-tui“. Die Bedienung ist selbsterklärend. Mit den Button „stress“ lassen sich alle Prozessorkerne auslasten und die Spannung und zeitgleich die Wärmeentwicklung beobachten, unter Monitoring schaltet man diesen Stresstest wieder aus.
Der Modus „Stress“ wird immer nur kurzzeitig aktiviert, nachdem die Spannung geändert wurde.
Vorgehen
Während also in einem Fenster „s-tui“ läuft, verändere ich im anderen Fenster die Spannung von -p0. Nach jeder Änderung lasse ich kurz einen Stresstest laufen. Die Änderung erfolgt in Einzelschritten - also erst -v15, dann Stresstest, dann wieder Monitoring, bevor -v16 gewählt wird.
Es ist darauf zu achten, dass die Spannung und die Leistung immer weiter sinkt - bei sonst gleichen Werten!
Achtung: Irgendwann wird sich das System dabei aufhängen! Das ist das Ziel: den Wert zu finden, bevor sich das System aufhängt.
Beim nächsten Start, setze ich dann den Wert an, der zuletzt funktioniert hat. Nun kommt ein langer Stresstest. Hängt sich das System nach einiger Zeit immer noch auf, erhöht man die Spannung um noch einen Schritt.
Wichtig ist generell, dass die Prozessortemperatur niemals höher wird, als maximal erlaubt (siehe technische Spezifikation im Prozessorblatt). Sollte die Temperatur dennoch zu hoch werden, stimmt eine andere Einstellung nicht z.B. im Mainboard die Overheat- Funktion, oder aber die Kühlung ist defekt.
Stabiler Betrieb im P0
Nach ein paar Versuchen, sollte der Stresstest sowohl stabil, als auch im normalen Temperaturbereich dauerhaft mit geringerer Spannung und weniger Leistungsverbrauch laufen.
Anhand des Vergleichs der Wattzahl vom ursprünglichen Wert und des neuen Wertes, kann die Energieeinsparung berechnet werden:
Bspw. für den P0:
Ursprüngliche CpuPower (mit CpuVid 14) = 26.12W
Neue Einstellung CpuPower (mit CpuVid 27) = 23.04W
Das entspricht einer Reduktion der Energieaufnahme auf den Faktor:
23.04 / 26,12 = 0,882082695253 also rund auf 88% der ursprünglichen Leistungsaufnahme - oder andersrum einer Einsparung von ca 12%.
Da ich vier Prozessorkerne habe, sinkt also meine Leistungsaufnahme von 104 auf 92 Watt:
(4 * 26,12W) - (4 * 23.04W) = (104,48W) - (92,16W) = 12,32 Watt
Faktor auf alle andere P-States anwenden
Nachdem man nun weiss, um wieviel die Leistung gesenkt werden kann, gilt es, per Dreisatz jeden anderen Leistungslevel analog einzustellen.
Also in meinem Besipeil so, dass die Wattzahl später immer dem Faktor 0,882082695253 des Ursprungswertes entspricht. Bei mir als Beispiel:
Pstate Status CpuFid CpuDid CpuVid CpuMult CpuFreq CpuVolt NbVid NbVolt IddVal IddDiv CpuCurr CpuPower 0 1 16 0 27 16.00x 3200MHz 1212mV 30 1175mV 190 10 19.00A 23.04W 1 1 9 0 34 12.50x 2500MHz 1125mV 30 1175mV 146 10 14.60A 16.43W 2 1 3 0 39 9.50x 1900MHz 1062mV 30 1175mV 130 10 13.00A 13.81W 3 1 0 1 52 4.00x 800MHz 900mV 30 1175mV 76 10 7.60A 6.84W 4 0 0 0 0 8.00x 1600MHz 1550mV 0 1550mV 0 1 0.00A 0.00W
Damit sind die richtigen Werte eingestellt.
Persitieren
[Fedora- eigen, mangels Zeit, nur Stichworte]
eintrag in /etc/rc.d/rc.local (chmod 755
#!/bin/bash
amdctl -p0 -v27
amdctl -p1 -v34
amdctl -p2 -v39
amdctl -p3 -v52
exit 0
danach ausführen:
/usr/lib/systemd/system-generators/systemd-rc-local-generator
und
systemctl enable rc-local.service
→ Das gibt fehler, aber macht nix
danach starten
systemctl start rc-local.service
mit „systemctl status rc-local.service“
ist nun alles zu sehen