Die aktuellste Version dieses Dokuments ist ein Entwurf.DiffDiese Version (2021/12/30 19:43) wurde bestätigt durch Daniel.

Dies ist eine alte Version des Dokuments!


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.

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.

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.

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.

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.

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.

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.

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.

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!

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.

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.

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

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.

[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

Diese Website verwendet Cookies. Durch die Nutzung der Website stimmen Sie dem Speichern von Cookies auf Ihrem Computer zu. Außerdem bestätigen Sie, dass Sie unsere Datenschutzbestimmungen gelesen und verstanden haben. Wenn Sie nicht einverstanden sind, verlassen Sie die Website.Weitere Information
  • /srv/www/htdocs/dokuwiki/data/pages/content/undervolting.txt
  • Zuletzt geändert: 2022/06/27 19:03
  • von Daniel