Wollen wir den CO2-Fußabdruck einer Software-Anwendung reduzieren, müssen wir vor allem ihren Stromverbrauch unter die Lupe nehmen. Denn dieser steht mit dem CO2-Fußabdruck in einem direkten Zusammenhang. Wird die Software in einem Rechenzentrum betrieben, kommen noch die Kosten für die Kühlung hinzu. Je nach Kühlungsstrategie werden hier neben Strom auch Wasser, Kühlmittel oder Luft verbraucht.

In diesem Post geht es in erster Linie darum, wie wir den Stromverbrauch einer Software-Anwendung messen. Zum Energieverbrauch für die Bereitstellung von Daten, für den Netzwerkverkehr oder für die Clients plane ich weitere Posts.

Messung in der Cloud

Die Cloud basiert auf einem hochverteilten System. Sie setzt sich zusammen aus einer Vielzahl häufig dezentral bereitgestellter, physischer Computer und Peripheriegeräte. Diese Geräte kommunizieren kabelgebunden oder kabellos miteinander.

Nutzen wir die Cloud, greifen wir dabei nicht direkt auf die physischen Geräte zu, sondern mieten und nutzen virtuelle Hardware oder Services, die auf diesen Geräten laufen. Uns ist dabei nicht transparent, welche und wie viele der physischen Geräte wir tatsächlich verwenden. Wir teilen unsere physischen Ressourcen möglicherweise mit vielen anderen Benutzern in der Cloud.

Basis vieler Cloud-Dienste ist das Betriebssystem Linux, sei es für Datenhaltung, für Container- und Orchestrierungs-Plattformen oder für virtuelle Maschinen. Ein Manko von Linux ist, dass die Messung von Energieverbräuchen nicht oder nicht gut genug unterstützt wird.

Nun versuchen wir, den Energieverbrauch der von uns genutzten, verteilten, Linux-basierten Cloud-Dienste zu messen. Dies erscheint unter den oben beschriebenen Umständen nicht gerade einfach.

Wie Etsy Cloud Jewels helfen, Näherungswerte zu finden

Dass die Messung des Energieverbrauchs von Cloud-Diensten schwierig sein kann, hat auch die IT-Abteilung von Etsy, einem Online-Marktplatz für Kunst und Kunsthandwerk, festgestellt. 2017 setzte man sich bei Etsy das Ziel, den Energieverbrauch des Unternehmens bis 2025 um 25 % zu reduzieren. Hier rückten natürlich die genutzten IT-Dienste ins Blickfeld. Eine erste signifikante Verbesserung brachte dabei schon die Migration von den eigenen physischen Servern (Stromverbrauchs-Effektivität: 1,39) in die Google Cloud (Stromverbrauchs-Effektivität: 1,1).

Die Stromverbrauchs-Effektivität beschreibt, wie viel der eingesetzten Elektroenergie in einem Rechenzentrum tatsächlich für die Bereitstellung und den Betrieb von IT-Services genutzt wird. Je näher der Wert bei 1 liegt, desto höher ist die Effektivität.

Im nächsten Schritt sollte bei Etsy gemessen werden, wieviel Energie die virtuellen Maschinen, ihr RAM, ihre Festplatten oder der Netzwerkverkehr kosten. Weder Google noch Azure oder AWS stellten ihrer Kundschaft zu diesem Zeitpunkt verlässliche Informationen zur Verfügung.

Ausgehend von der auf Tagesebene heruntergebrochenen Rechnung von Google Cloud Services, Annahmen bezüglich der genutzten virtuellen Ressourcen und der mit diesen verbundenen Stromkosten als Näherungswerte berechneten die Leute bei Etsy ihren Energieverbrauch. Aus dieser Vorgehensweise entstanden die Etsy Cloud Jewels. Dies ist eine Methodik zur Ermittlung der Energiekosten in einem Cloud-Umfeld. Die Cloud Jewels wurden vom Etsy Team auf Github unter einer MIT Lizenz zur Nachnutzung bereitgestellt. So können alle Organisationen, die die Google Cloud verwenden, ihren eigenen Stromverbrauch näherungsweise ermitteln.

Glücklicherweise haben die drei Hyperscaler heute verstanden, dass ihre Kunden ein großes Interesse daran haben, die Auswirkungen ihrer Services auf die Umwelt genau zu kennen. So bietet Microsoft inzwischen das Emission Impact Dashboard an. Von AWS gibt es das Customer Carbon Footprint Tool und Google liefert seinen Kunden Carbon Footprint.

Mit Kepler den realen Energieverbrauch messen

Näher an der realen Messung des Energieverbrauchs von Software-Anwendungen ist das Tool Kepler. Kepler steht für Kubernetes-based Efficient Power Level Exporter. Das Tool ist ein weitestgehend in Go geschriebener Metrik-Exporter für das Monitoring-Werkzeug Prometheus. Um zu erklären, was Kepler genau tut, müssen wir etwas tiefer in die Linux-Welt eintauchen und ein paar wesentliche Begriffe klären:

  • eBPF (extended Berkeley Packet Filter) bezeichnet ein Framework, mit dessen Hilfe ereignisgesteuerte Programme in den Linux-Kernel geladen und dort ausgeführt werden können. Diese Ereignisse können System-, Funktionsaufrufe oder Netzwerkereignisse sein.
  • cgroups (Control Groups) ist eine Linux-Kernel-Funktion, die zur Kontrolle, Priorisierung und Isolation von Prozessressourcen innerhalb eines Betriebssystems verwendet wird. cgroups ermöglichen die effiziente Verwaltung von Ressourcen wie CPU, Arbeitsspeicher, Festplattenspeicher und Netzwerkbandbreite für Prozesse oder Gruppen von Prozessen.
  • sysfs (System Filesystem) ist ein virtuelles Dateisystem des Linux-Kernels, das Informationen über den Kernel, verschiedene Kernel-Subsysteme, Hardware und Geräte-Treiber durch virtuelle Dateien bereitstellt. sysfs dient als Schnittstelle zwischen dem Linux-Kernel und Benutzeranwendungen, um wichtige Systeminformationen und Konfigurationsparameter zugänglich zu machen.

Kepler verwendet eben jene eBNF, um CPU-Leistungsindikatoren und Kernel Tracepoints zu messen. Die so ermittelten Daten bilden gemeinsam mit den zugehörigen Statistiken von cgroups und sysfs die Basis für die Machine-Learning-Modelle des Kepler Model Servers. Mit deren Hilfe wiederum wird der Energieverbrauch von Kubernetes Pods gemessen bzw. geschätzt.

Scaphandre: ein Mess-Tool, das sich vielversprechend entwickelt

Eine Alternative zu Kepler ist Scaphandre. Das Tool ist ein Software-Agent, der auf die Messung des Stromverbrauchs von Linux Bare-Metal-Servern und virtuellen Maschinen auf Basis von QEMU/KVM fokussiert. Die resultierenden Daten können so aufbereitet werden, dass sie von gängigen Monitoring- und Überwachungswerkzeugen wie Prometheus oder Grafana sinnvoll interpretiert und ausgewertet werden können.

Der Einsatzbereich von Scaphandre ist aktuell (noch) etwas eingeschränkt, weil für die Messungen Intel RAPL (Running Average Power Limit) oder AMD Power Gadget Daten von Prozessoren ausgelesen werden müssen. Prozessoren die diese Features nicht besitzen, können von Scaphandre aktuell nicht ausgelesen werden. Apple-ARM-Prozessoren werden heute beispielsweise nicht unterstützt.

Scaphandre funktioniert auch auf Kubernetes-Umgebungen und ist weitestgehend in Rust geschrieben. Für die Anbindung weiterer Prozessortypen und -familien benötigt das Projekt Scaphandre daher gern weitere Mitstreiter.

Direkte Messung des Stromverbrauchs

Für viele Programmiersprachen gibt es heute Frameworks zur Messung des Energieverbrauchs. Das geschieht über Programmcode in der jeweiligen Sprache.

Zwei Beispiele möchte ich hier vorstellen:

CodeCarbon

Auf die Messung des Energieverbrauchs virtueller oder realer Maschinen fokussiert das Projekt CodeCarbon. Mit Hilfe öffentlich zugänglicher Daten zum regional angebotenen Strommix wird zusätzlich der momentane CO2-Fußabdruck des gemessenen Verbrauchs ermittelt.

Das Projekt ist mit Python / Jupyter Notebook geschrieben. Mit CodeCarbon lässt sich der Stromverbrauch von Python Programmen oder der Gesamtverbrauch eines Computers messen. Will man den Verbrauch einer Software-Anwendung messen, bietet es sich an, eine Differenzmessung durchzuführen:

  1. Wie hoch ist der Stromverbrauch des Computers ohne die zu messende Software?
  2. Wie hoch ist der Stromverbrauch mit der zu messenden Software?
  3. Aus der Differenz der Werte (2. minus 1.) lässt sich näherungsweise der Verbrauch der Software ableiten.

Mit Hilfe so ermittelter Verbrauchswerte für eine bestimmte Zeiteinheit lassen sich auch die Entwicklungen beim Verbrauch ermitteln und bewerten, wenn sich Software oder Laufzeitbedingungen ändern.

Nach der Installation von CodeCarbon mittels pip wird eine eindeutige experiment_id erzeugt:

! codecarbon init

Anschließend kann die Messung gestartet werden:

codecarbon monitor

Alle 20 Sekunden wird ein Messwert erzeugt und ausgegeben:

[codecarbon INFO @ 18:18:47] Energy consumed for all CPUs : 0.003071 kWh. Total CPU Power : 42.5 W

Alle fünf Minuten wird der Stromverbrauch in CO2 Äquivalente umgerechnet und eine Schätzung für den CO2 Ausstoß der Messung für ein ganzes Kalenderjahr berechnet:

[codecarbon INFO @ 18:19:27] 0.005533 g.CO2eq/s mean an estimation of 174.48031279157075 kg.CO2eq/year

JoularJX

Für Programme aus der Java Welt bietet sich die Nutzung von JourlarJX an. JoularJX ist ein Java basierter Agent mit dem sich der Energieverbrauch von Java Programmen zur Laufzeit messen lässt.

JoularJX funktioniert für Intel und AMD Prozessoren, aber auch für Apple ARM Prozessoren. Für Apple Prozessoren benötigt der Agent sudo Rechte für den Zugriff auf powermetrics.

Für eine Messung wird eine startbare Java-Klasse oder ein Jar-File mittels Java Runtime unter Benutzung des Agents gestartet:

java -javaagent:joularjx-2.8.0.jar ../../PowerConsumption/src/PowerConsumer.java

oder:

java -javaagent:joularjx-2.8.0.jar -jar PowerConsumer.jar

JoularJX liefert den Energieverbrauch nicht in Watt, sondern in Joule. Warum? Leistung wird üblicherweise in Watt oder Kilowatt gemessen, Energieverbrauch in Joule oder Kilojoule. Z. B. lässt sich dieser Ausgabewert:

10/11/2023 07:11:46.244 - [INFO] - Program consumed 99,19 joules

bequem in Watt umrechnen: 1 Joule = 0.000278 Watt

99,19 Joule = 0,02757482 Watt

Stromverbrauch in anderen Programmiersprachen messen

Auch wenn du Software nicht in Python oder Java entwickelst, gibt es Möglichkeiten, den Stromverbrauch zu messen. So gibt es inzwischen eine Vielzahl von Tools, die den Stromverbrauch des Systems, auf dem ein Programm bzw. eine Programmiersprache läuft, auf Hardware-Ebene messen. Beispiele hierfür sind Intel PCM, CPU Energy Meter oder RAPL-formula.

Fazit

Die Hürden für die Messung des Energieverbrauchs von Software-Anwendungen sinken. Für virtuelle und reale Hardware stehen inzwischen viele Messwerkzeuge und Schätzverfahren zur Verfügung mit deren Hilfe sich der Energieverbrauch konkret messen lässt. Einige Werkzeuge wie CodeCarbon bieten darüber hinaus die Möglichkeit, aus dem Stromverbrauch den CO2 Fußabdruck abzuleiten.

Dazu kommen immer mehr Open-Source-Werkzeuge, mit denen sich der Energieverbrauch von Software-Anwendungen konkret messen lässt. Gerade im Bereich der Software-Entwicklung lässt sich so feststellen, welche Auswirkungen eine Code-Änderung oder eine Änderung der Konfiguration auf den Energieverbrauch hat.

Alle Beiträge von Ramon Anger

Seit über 25 Jahren Software Architekt und Entwickler von ganzem Herzen.

Schreibe einen Kommentar