Blogpost

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.

1261
4 Minuten Lesezeit
Green Coding

In dieser Collection enthalten:

Collection öffnen

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.

Energieverbrauch von MS-Teams in 1 Arbeitswoche

Abbildung 1: Energieverbrauch MS Teams in ca. einer Arbeitswoche

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.

Wie soll gezielt hinsichtlich Energieeffizienz optimiert werden, wenn der genaue Ansatzpunkt unbekannt ist?

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.

Messwert und Konfiguration HWiNFO und OpenHardwareMonitor

Abbildung 2: Messwert und Konfiguration HWiNFO und OpenHardwareMonitor

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.

Quellen
Sustainable Banking, ESG-Risiken, Nachhaltigkeit

Sustainable Banking

Nachhaltigkeit ist aus der Branche Banking nicht mehr wegzudenken. Treiber sind zum einen die Initiativen von Gesetzgebern und Regulatoren. Aber auch Kunden stellen vermehrt nachhaltige, umweltfreundliche und klimaschonende Aspekte in den Mittelpunkt ihrer Finanzentscheidungen. Um den langfristigen ökonomischen Erfolg zu sichern sowie die regulatorischen Hürden zu meistern, müssen Banken frühzeitig ihre Geschäftstätigkeit auf Nachhaltigkeitsziele ausrichten und fit sein für den Umgang mit Nachhaltigkeitsrisiken.

Wie sieht die optimale Vorbereitung auf eine nachhaltige Zukunft in der Branche Banking aus? Dieser Frage gehen wir in unserer Serie Sustainable Banking auf den Grund. Mehr Informationen zu diesem Zukunftsthema finden Sie auf unserer Webseite.

Jakob Deiner

ist M. Sc. Informatik und berät bei msg for banking Kunden in seinen Schwerpunktthemen IT-Architektur, objektorientiertes Design und containerbasierte Betriebsplattformen. Er ist außerdem Certified Professional for Software Architecture (iSAQB) - Foundation Level (CPSA-F) und Certified Scrum Master (CSM), Scrum Alliance.

Schreiben Sie einen Kommentar

Sie müssen sich anmelden, um einen Kommentar zu schreiben.