Blog (custom content)

Green Coding - Energieverbrauch von Software messen

Für Green Coding benötigt man Werkzeuge zur Energieverbrauchsmessung von Software. Dieser Beitrag stellt Tools zur Ermittlung des Stromverbrauchs auf Prozess- sowie Einzelfunktionsebene vor.

08/01/22
Nachhaltigkeit, Software
Green Coding - Energieverbrauch von Software messen

Die Reduzierung von Treibhausgas-Emissionen hat weltweit höchste Priorität. Auch die IT-Industrie kann hierbei einen nachhaltigen Beitrag leisten. Mittels Green Coding lässt sich der Stromverbrauch von Software und damit der CO2-Ausstoß verringern. Um jedoch herauszufinden, an welchen Stellen im Sourcecode Energie eingespart werden kann, benötigt man die richtigen Werkzeuge zur Energieverbrauchsmessung der Software. Im folgenden Beitrag werden die Tools zur Ermittlung des Stromverbrauchs auf Prozess- sowie Einzelfunktionsebene vorgestellt.

Stromverbrauch auf Prozess-Ebene messen

Windows bringt mit der Windows Energy Estimation Engine (E3)1 ein Werkzeug mit, das den Energieverbrauch auf Prozess-Ebene misst.
Prozess bezeichnet in diesem Kontext die Ausführung eines einzelnen Programms. E3 bedingt, dass es auf einem Gerät ausgeführt wird, das mit Akku betrieben werden kann. Für erste „Gehversuche“ kann auf einem Notebook in einer Kommandozeile mit Admin-Rechten der Befehl powercfg.exe /srumutil aufgerufen werden. Das Ergebnis ist eine srumutil.csv-Datei, die den Energieverbrauch aller Prozesse der letzten 7 Tage auf dem Computer enthält.

Um das Resultat möglichst auf die eigene Anwendung zu beschränken, können folgende Schritte in cmd durchgeführt werden:

  1. Mit sc stop dps die Datenaufzeichnung stoppen.
  2. Zur Sicherheit mit move C:\Windows\System32\sru\SRUDB.dat C:\Windows\System32\sru\SRUDB.dat.bak die historischen Daten sichern.
  3. Mit sc start dps die Datenerhebung erneut starten.
  4. Jetzt ausschließlich die zu messende Anwendung ausführen.
  5. Nach Programmende powercfg.exe /srumutil aufrufen.

Aufbereitet und um drei Spalten ergänzt (Messwerte werden von E3 in Millijoule ausgegeben, Umrechnungs-Formeln siehe Abbildung 1) ist erkennbar, dass eine Woche MS Teams gut 0,05kWh und damit, basierend auf dem aktuellen Strommix Deutschland2, ca. 0,02kg CO2 verbraucht.

Es gilt zu beachten, dass die ermittelten Messwerte nicht 1:1 den Verbrauch an der Steckdose wiedergeben, da Faktoren wie Verluste der AC/DC Wandler, Lüfter, GPU Stromverbrauch etc. nicht berücksichtigt werden. Dennoch gibt E3 einen Anhaltspunkt, wieviel Energie ein Prozess benötigt. Eine Alternative für Unix-basierte Betriebssysteme, die wir in unserem Fachartikel „Green Coding – die neue Dimension der Softwareentwicklung“ kurz vorgestellt haben, ist PowerTOP. MacOS bringt ähnliche Werkzeuge mit3.

Energieverbrauchsmessung auf Funktions-Ebene

In einen Prozess „hineinsehen“ kann man mit E3 nicht. Das bedeutet, dass keinerlei Aussage darüber getroffen werden kann, welche Komponente oder Funktion innerhalb des Prozesses am meisten Energie verbraucht. Exakt diese Information ist für Entwickler/-innen jedoch essenziell.

Man könnte mit einem Profiler die Funktionen der Applikation mit der höchsten CPU-Last ermitteln. In Kombination mit bekannter TDP4 der CPU oder Messwerten zum Stromverbrauch wäre es möglich, aus den gewonnenen Profildaten Schlüsse auf den Energieverbrauch zu extrapolieren.

Dieses Vorgehen halten wir jedoch für unbequem und ungenau. Um Stromverbrauchsmessungen als festen Bestandteil des Entwicklungsprozesses zu etablieren, muss dies für Entwickler/-innen möglichst komfortabel sein. Die Messwerte sollten in einer passenden Skala einfach ablesbar sein. Ungenau ist das Vorgehen, da Energieverbrauchsmessung und Profiling nicht unmittelbar miteinander korrelieren – man misst jeden Faktor einzeln.

Diese Lücke füllen wir mit der jPowerMonitor Java-Library. Die enthaltenen Komponenten jUnit-Extension und Java Agent ermöglichen direkte Messungen des Energieverbrauchs, auf Unit-Test respektive Methoden-Ebene eines beliebigen Java-Prozesses. Einzig ein ausführbares JAR-File wird benötigt – für Server-Anwendungen muss ein Java Agent konfiguriert werden.

Beide Erweiterungen schreiben während des Messlaufs den Momentan-Verbrauch in Watt sowie den kumulierten Energieverbrauch pro Testfall in Wattstunden bzw. pro Methode in Joule in separate CSV-Dateien.

jUnit-Extension sowie Java Agent werden in ergänzenden Blog-Beiträgen im Detail vorgestellt.

Stromverbrauchmessungs-Backends für jPowerMonitor

jPowerMonitor überwacht zur Laufzeit der Applikation, welche Funktionen gerade aktiv sind und wie viel CPU-Zeit sie in Anspruch nehmen (analog einem Profiler). Die zur Ermittlung des Energieverbrauchs zusätzlich notwendigen Messdaten wie z. B.  „CPU Package Power“ (= aktueller Gesamtverbrauch der CPU in Watt) kann jPowerMonitor nicht selbst abgreifen. Zu diesem Zweck ist eine konfigurierbare Schnittstelle implementiert, welche Stand heute die beiden Windows-Tools OpenHardwareMonitor (OHM)5 per REST sowie HWiNFO6 per CSV-Dateischnittstelle anbindet. Die CSV-Schnittstelle ist generisch, so dass sich beliebige Strommess-Tools verwenden lassen, die Messwerte periodisch nach CSV exportieren.

OHM und HWiNFO liefern eine Fülle an Messpunkten. Für Strommesszwecke empfehlen wir „CPU Package Power“ (HWiNFO) respektive „Powers“ –  „CPU Package“ (OHM). Rechenintensive Business-Applikationen dürften den Hauptteil ihres Stromverbrauchs durch CPU-Last erzeugen. Ist bekannt, dass die Anwendung eher RAM-, HDD/SSD- oder GPU-lastig ist, kann man stattdessen die korrespondierenden Sensoren oder „Total System Power“ (HWiNFO) konfigurieren.

Damit jPowerMonitor Verbrauchsdaten bekommt, ist bei OHM der „Remote Web Server“ zu aktivieren. Im Fall von HWiNFO ist das CSV-Monitoring einzuschalten. Eine Kurzübersicht der Konfigurationen ist in Abbildung 2 zusammengefasst.

Wir empfehlen, die exportierten Sensoren zu minimieren. Standardmäßig schreibt HWiNFO mehr als 100 Spalten pro Zeile – jede Sekunde. Das Logging kann im Einstellungsdialog konfiguriert werden7.

Fazit

Mit jPowerMonitor wird der Stromverbrauch transparent. Abgrenzungen sind die exklusive Verfügbarkeit in Java sowie die Beschränkung auf Windows-Tools als nativ unterstützte Mess-Backends. Das Konzept von jPowerMonitor lässt sich auf weitere Sprachen übertragen, die Introspektion bzw. Reflection unterstützen, wenngleich die Library in der jeweiligen Programmiersprache neu zu implementieren ist.

Mittels CSV-Schnittstelle lassen sich durch Konfigurationsanpassungen Tools für Linux oder MacOS anbinden.