AWS Germany – Amazon Web Services in Deutschland

Reduzieren Sie den CO2-Fußabdruck Ihres Unternehmens mit Amazon CodeGuru Profiler

von Isha Dua, Ifeanyi Okafor, Christian Tomeldan, übersetzt von Franz Stefan.

Es ist wichtig, alle Funktionsbereiche zu untersuchen, wenn Unternehmen ihre Geschäftstätigkeit auf nachhaltige Praktiken umstellen. Es ist notwendig, fundierte Entscheidungen zu treffen, um die Auswirkungen eines IT-Stacks auf die Umwelt zu reduzieren. Insbesondere wenn dieser erstellt, bereitgestellt und gewartet wird. Um ein nachhaltiges Unternehmen für unsere Kunden und für die Welt, die wir alle teilen, aufzubauen, haben wir Rechenzentren eingerichtet, welche den effizienten, ausfallsicheren Service bieten, den unsere Kunden erwarten. Gleichzeitig minimieren wir damit unseren und Ihren ökologischen Fußabdruck. Während wir daran arbeiten, die Energieeffizienz unserer Rechenzentren zu verbessern, arbeiten wir auch daran, unseren Kunden zu helfen, ihre Abläufe in der AWS-Cloud zu verbessern. Die beiden Ansätze basieren auf dem Konzept der geteilten Verantwortung zwischen AWS und AWS-Kunden. Wie in der Abbildung unten dargestellt, konzentriert sich AWS auf die Optimierung der Nachhaltigkeit der Cloud, während die Kunden für die Nachhaltigkeit in der Cloud verantwortlich sind. Dies bedeutet, dass AWS-Kunden ihre Workloads in der AWS-Cloud optimieren müssen.

Abbildung 1. Modell der geteilten Verantwortlichkeit für Nachhaltigkeit

Allein durch die Migration in die Cloud können AWS-Kunden ihren Technologiebetrieb deutlich nachhaltiger gestalten. Im Durchschnitt verwenden AWS-Kunden 77% weniger Server, 84% weniger Strom und einen um 28% saubereren Energiemix, wodurch ihre CO2-Emissionen im Vergleich zu der Ausführung von Workloads in ihren eigenen Rechenzentren um 88% reduziert werden. Diese Verbesserungen sind auf die technologischen Fortschritte und Skalierungseffekte zurückzuführen, die AWS-Rechenzentren mit sich bringen. Es gibt jedoch immer noch erhebliche Möglichkeiten für AWS-Kunden, ihren Cloud-Betrieb nachhaltiger zu gestalten. Um dies aufzudecken, müssen wir zunächst verstehen, wie Emissionen kategorisiert werden.

Das Greenhouse Gas Protocol unterteilt die Kohlenstoffemissionen in die folgenden Bereiche, angeführt mit relevanten Emissionsbeispielen für jeden Scope eines Cloud-Anbieters wie AWS:

  • Scope 1: Alle direkten Emissionen aus den Aktivitäten einer Organisation oder unter deren Kontrolle. Zum Beispiel die Verbrennung fossiler Brennstoffe durch Backup-Generatoren in Rechenzentren.
  • Scope 2: Indirekte Emissionen von Strom, der für die Stromversorgung von Rechenzentren und anderen Einrichtungen gekauft und verwendet wird. Zum Beispiel Emissionen aus der kommerziellen Stromerzeugung.
  • Scope 3: Alle anderen indirekten Emissionen aus Aktivitäten einer Organisation, deren Ursprung die Organisation nicht kontrolliert. AWS-Beispielen beinhalten Emissionen im Zusammenhang mit dem Bau von Rechenzentren sowie der Herstellung und dem Transport von IT-Hardware, die in Rechenzentren eingesetzt wird.

Aus Sicht der AWS-Kunden werden die Emissionen von Kunden-Workloads, die auf AWS ausgeführt werden, als indirekte Emissionen und als Teil der Scope-3-Emissionen des Kunden verbucht. Jeder bereitgestellte Workload erzeugt einen Bruchteil der gesamten AWS-Emissionen aus jedem der vorherigen Bereiche. Die tatsächliche Menge variiert je nach Workload und hängt von verschiedenen Faktoren ab, darunter den verwendeten AWS-Services, dem Energieverbrauch dieser Services, der Kohlenstoffintensität der Stromnetze, die die AWS-Rechenzentren versorgen, in denen sie betrieben werden, und der AWS-Beschaffung erneuerbarer Energien.

Auf hoher Ebene gehen AWS-Kunden Optimierungsinitiativen auf drei Ebenen an:

  • Anwendung (Architektur und Design): Einsatz effizienter Softwaredesigns und -architekturen zur Minimierung des durchschnittlichen Ressourcenbedarfs pro Arbeitseinheit.
  • Ressource (Bereitstellung und Nutzung): Überwachung der Workload-Aktivität und Änderung der Kapazität einzelner Ressourcen, um Leerlaufzeiten aufgrund von Über- oder Unterauslastung zu verhindern.
  • Code (Codeoptimierung): Mithilfe von Code-Profilern und anderen Tools werden die Codebereiche identifiziert, die am meisten Zeit oder Ressourcen verbrauchen, als Optimierungsziele.

In diesem Blogpost fokussieren wir uns auf nachhaltige Verbesserungen Ihres Anwendungscodes mit Hilfe von Amazon CodeGuru Profiler.

Wie CodeGuru Profiler die Nachhaltigkeit von Codes verbessert

Amazon CodeGuru Profiler sammelt Daten zur Laufzeitleistung Ihrer Live-Anwendungen und gibt Empfehlungen, die Ihnen bei der Feinabstimmung Ihrer Anwendungsleistung helfen können. Mithilfe von Algorithmen für maschinelles Lernen kann CodeGuru Profiler Ihnen helfen, Ihre ressourcenintensivsten Methoden in Ihrem Code zu identifizieren, die am meisten zu Ihren Scope-3-Emissionen beitragen. CodeGuru Profiler schlägt dann Möglichkeiten vor, den Code zu verbessern, um die CPU-Auslastung zu reduzieren. CodeGuru Profiler bietet verschiedene Visualisierungen von Profilerstellungsdaten, mit denen Sie erkennen können, welche Codepfade am meisten Ressourcen verbraucht haben, wo am meisten Zeit aufgewendet wird. Weiters erhalten Sie Vorschläge zur Reduzierung der CPU-Auslastung. Die Optimierung Ihres Codes mit CodeGuru-Profiler führt zu Folgendem:

  • Verbesserungen der Anwendungsleistung
  • Reduktion der Cloud-Kosten und
  • Reduzierung der CO2-Emissionen, die auf Ihre Cloud-Workload zurückzuführen sind

Wenn Ihr Code dieselbe Aufgabe mit weniger CPU-Auslastung ausführt, laufen Ihre Anwendungen schneller, das Kundenerlebnis verbessert sich und Ihre Kosten sinken zusammen mit Ihren Cloud-Emissionen. CodeGuru Profiler generiert die Empfehlungen, mit denen Sie Ihren Code effizienter gestalten, indem er einen Agenten einsetzt, welcher kontinuierlich Stichproben Ihres Anwendungs-Stack-Traces nimmt. Die Stack-Traces geben an, wie viel Zeit die CPU für jede Funktion oder Methode in Ihrem Code aufwendet. Diese Informationen werden anschließend in CPU- und Latenzdaten umgewandelt, welche zur Erkennung von Anomalien verwendet werden. Wenn Anomalien festgestellt werden, generiert CodeGuru Profiler Empfehlungen, in denen klar beschrieben wird, wie Sie vorgehen sollten, um die Situation zu beheben. Obwohl CodeGuru Profiler über mehrere Visualisierungen verfügt, mit denen Sie visualisieren können, welche Codepfade die meisten Ressourcen verbrauchen, können Kunden auch ohne Visualisierungen, Empfehlungen vornehmen. Lassen Sie uns dies anhand eines einfachen Beispiels demonstrieren.

Demo: Verwenden von CodeGuru Profiler zur Optimierung einer Lambda-Funktion

In dieser Demo werden die Ineffizienzen einer AWS Lambda-Funktion von CodeGuru Profiler identifiziert.

Aufbau unserer Lambda-Funktion (10 Minuten)

Um dieses Beispiel einfach zu halten, erstellen wir eine einfache „Hello World“ Funktion. Für den Python-Code, der als Lambda-Funktion läuft und AWS-Services aufruft, sind zwei wesentliche Schritte erforderlich:

  • Importieren des AWS-SDK für Python (Boto3) und
  • Erstellen des AWS SDK-Service-client.

Die Python-Codezeilen (die Teil unserer Funktion sein werden), welche die oben aufgeführten Schritte ausführen, sind unten dargestellt:

import boto3 #hiermit wird die AWS SDK Bibliothek für Python importiert
VariableName = boto3.client('dynamodb') #erstellt den AWS SDK service client

Zweitens bestehen die Funktionen von AWS Lambda funktionell aus zwei Abschnitten:

  • Initialisierungscode
  • Handlercode

Wenn eine Funktion zum ersten Mal aufgerufen wird (z.B: ein Kaltstart), lädt Lambda den Funktionscode herunter, erstellt die erforderliche Laufzeitumgebung, führt den Initialisierungscode aus und führt dann den Handlercode aus. Bei nachfolgenden Aufrufen (Warmstarts) umgeht Lambda den Initialisierungscode und geht direkt zum Handlercode über, um die Ausführungszeit gering zu halten. AWS Lambda ist so konzipiert, dass der SDK-Serviceclient, der während der Initialisierung erstellt wurde, bis zur Ausführung des Handlercodes bestehen bleibt. Aus diesem Grund sollten AWS SDK-Service-Clients im Initialisierungscode erstellt werden. Wenn die Codezeilen für die Erstellung des AWS-SDK-Service-Clients in den Handler-Code eingefügt werden, wird der AWS-SDK-Service-Client bei jedem Aufruf der Lambda-Funktion neu erstellt, wodurch die Dauer der Lambda-Funktion bei Kalt- und Warmstarts unnötig verlängert wird. Dies erhöht unbeabsichtigt den CPU-Bedarf (und die Kosten), was wiederum die CO2-Emissionen erhöht, die auf den Code des Kunden zurückzuführen sind. Unten sehen Sie die grüne und braune Version derselben Lambda-Funktion.

Nachdem wir nun verstanden haben, wie wichtig es ist, unseren Lambda-Funktionscode für eine effiziente Ausführung zu strukturieren, erstellen wir eine Lambda-Funktion, die den SDK-Serviceclient neu erstellt. Wir werden dann beobachten, wie CodeGuru Profiler dieses Problem meldet und eine Empfehlung generiert.

  1. Wählen Sie AWS Lambda in der AWS-Konsole aus und klicken Sie auf Funktion erstellen.
  2. Wählen Sie „Ohne Vorgabe erstellen“, benennen Sie die Funktion ‚demo-function‘, wählen Sie Python 3.9 unter Laufzeit aus und wählen Sie x86_64 unter Architektur aus.
  3. Erweitern Sie Berechtigungen und wählen Sie dann aus, ob Sie eine neue Ausführungsrolle erstellen oder eine vorhandene verwenden möchten.
  4. Erweitern Sie Erweiterte Einstellungen und wählen Sie dann Funktions-URL aktivieren aus.
  5. Wählen Sie als Authentifizierungstyp AWS_IAM oder NONE.
  6. Wählen Sie Cross-Origin Resource Sharing (CORS) konfigurieren aus. Wenn Sie diese Option bei der Funktionserstellung auswählen, erlaubt Ihre Funktions-URL standardmäßig Zugriffe von jedem Ursprung zu. Sie können die CORS-Einstellungen für Ihre Funktions-URL bearbeiten, nachdem Sie die Funktion erstellt haben.
  7. Wählen Sie Funktion erstellen.
  8. Kopieren Sie im Code-Editor-Tab des Quellcode-Fensters den folgenden Code und fügen Sie ihn ein:
#Aufrufender Code
import json
import boto3

#Handler-Code
def lambda_handler(event, context):
  client = boto3.client('dynamodb') #erstellt den AWS SDK Service client’
  #einfacher Codeblock zu Demozwecken  
  output = 'Hello World'
  print(output)
  #Handler-Funktion Return

  return output

Stellen Sie sicher, dass der Handlercode richtig eingerückt ist.

9. Speichern Sie den Code, stellen Sie die Funktion durch Klick auf „Deploy“ bereit und klicken Sie dann auf „Test.
10. Bei der ersten Ausführung dieser Lambda-Funktion wird ein Dialogfeld zur Konfiguration des Testereignisses angezeigt. Belassen Sie im Dialogfenster Testereignis konfigurieren die Standardauswahl (Neues Ereignis erstellen), geben Sie „demo-event“ als Eventnamen ein und belassen Sie die Hello-World-Vorlage als Event-Vorlage.
11. Wenn Sie den Code ausführen, indem Sie auf Test klicken, sollte die Konsole „Hello World“ zurückgeben.
12. Um den tatsächlichen Verkehr zu simulieren, führen wir ein curl-Skript aus, das die Lambda-Funktion alle 0,2 Sekunden aufruft. Führen Sie auf einem Bash-Terminal den folgenden Befehl aus:

while true; do curl {Lambda Funktion URL]; sleep 0.06; done

Wenn Sie Git Bash nicht installiert haben, können Sie das Service AWS Cloud 9 verwenden, welches curl-Befehle unterstützt.

CodeGuru Profiler für unsere Lambda-Funktion aktivieren

Wir werden jetzt CodeGuru Profiler einrichten, um unsere Lambda-Funktion zu überwachen. Für Lambda-Funktionen, die auf Java 8 (Amazon Corretto), Java 11, als auch Python 3.7 bis 3.9-Laufzeiten ausgeführt werden, kann CodeGuru Profiler mit einem einzigen Klick auf der Registerkarte „Konfiguration“ in der AWS Lambda-Konsole aktiviert werden. Andere Laufzeiten können nach einer Reihe von Schritten aktiviert werden, die in der CodeGuru Profiler-Dokumentation für Java und Python zu finden sind.

Unser Demo-Code ist in Python 3.9 geschrieben, daher aktivieren wir Profiler auf der Registerkarte Konfiguration in der AWS Lambda-Konsole.

1. Wählen Sie in der AWS Lambda-Konsole die Funktion demo-function aus, die wir erstellt haben.

2. Navigieren Sie zu Konfiguration > Überwachungs- und Betriebstools und klicken Sie rechts auf der Seite auf Bearbeiten.

3. Scrollen Sie nach unten zu Amazon CodeGuru Profiler und klicken Sie auf die Schaltfläche neben Code-Profiling, um den Dienst zu aktivieren. Nachdem Sie die Codeprofilerstellung aktiviert haben, klicken Sie auf Speichern.

Hinweis: CodeGuru Profiler benötigt 5 Minuten an Lambda-Laufzeitdaten, um Ergebnisse zu generieren. Nachdem Ihre Lambda-Funktion diese Laufzeitdaten bereitgestellt hat, werden diese auf der Profiling-Gruppenseite in der CodeGuru Profiler-Konsole angezeigt.

Wenn die Laufzeit Ihrer Lambda-Funktion kurz ist, erfordert dies möglicherweise mehrere Durchläufe, um Daten zu generieren. Es dauert ungefähr 15 Minuten, nachdem CodeGuru Profiler die Laufzeitdaten erhalten hat, bis diese Profiling-Gruppe angezeigt wird. Die Profiling-Gruppe erhält einen Standardnamen (z.B. aws-lambda-<lambda-function-name>). Obwohl die Laufzeit unserer Beispielfunktion im Durchschnitt ~33 ms beträgt, ruft unser curl-Skript die Anwendung alle 0,06 Sekunden auf. Dies sollte dem Profiler genügend Informationen geben, um unsere Funktion in ein paar Stunden zu profilieren. Nach 5 Minuten sollte unsere Profiling-Gruppe in der Liste der aktiven Profiling-Gruppen erscheinen, wie unten dargestellt.

Je nachdem, wie oft Ihre Lambda-Funktion aufgerufen wird, kann das Aggregieren von Profilen bis zu 15 Minuten dauern. Anschließend können Sie Ihre erste Visualisierung in der CodeGuru Profiler-Konsole sehen. Die Granularität der ersten Visualisierung hängt davon ab, wie aktiv Ihre Funktion in den ersten 5 Minuten der Profilerstellung war — eine Anwendung, die die meiste Zeit inaktiv ist, hat nicht viele Datenpunkte zum Zeichnen in der Standardvisualisierung. Sie können dies jedoch beheben, indem Sie sich einen größeren Zeitraum der profilierten Daten ansehen, z. B. einen Tag oder sogar bis zu einer Woche, wenn Ihre Anwendung eine sehr geringe CPU-Auslastung aufweist. Für unsere Demofunktion sollte nach etwa einer Stunde eine Empfehlung erscheinen. Nach dieser Zeit sollte die Liste der Profiling-Gruppen anzeigen, dass unsere Profiling-Gruppe jetzt eine Empfehlung hat.

Profiler weist auf die wiederholte Erstellung des SDK-Service-Client bei jedem Aufruf hin.

Die angezeigten Informationen legend dar, dass unsere CPU fünfmal mehr Rechenzeit als erwartet für die Neuerstellung des SDK-Service-Clients aufwendet. Die geschätzten Kostenauswirkungen dieser Ineffizienz werden ebenfalls angegeben. In Produktionsumgebungen können sich die Kostenauswirkungen schon bei scheinbar geringfügigen Ineffizienzen sehr schnell auf mehrere Kilogramm CO2 und hunderten von Euros belaufen – vor allem wenn die Häufigkeit der Aufrufe und die Anzahl der Lambda-Funktionen zunimmt.

CodeGuru Profiler lässt sich in Amazon DevOps Guru integrieren, einen vollständig verwalteten Service, welcher es Entwicklern und OPS-Teams leicht macht, die Leistung und Verfügbarkeit ihrer Anwendungen zu verbessern. Amazon DevOps Guru analysiert Betriebsdaten und Anwendungsmetriken, um Verhaltensweisen zu identifizieren, die von normalen Laufzeitmustern abweichen. Sobald diese betrieblichen Anomalien erkannt wurden, präsentiert DevOps Guru intelligente Empfehlungen. Diese betreffen aktuelle als auch zukünftige operative Besonderheiten. Durch die Integration mit CodeGuru Profiler können Kunden jetzt betriebliche Anomalien und Empfehlungen zur Codeoptimierung auf der DevOps Guru-Konsole einsehen. Die Integration, welche standardmäßig aktiviert ist, gilt nur für Lambda-Ressourcen, die von CodeGuru Profiler unterstützt und sowohl von DevOps Guru als auch von CodeGuru überwacht werden.

Sie können jetzt die curl-Schleife beenden (Strg+C), damit die Lambda-Funktion nicht mehr aufgerufen wird. Als Nächstes löschen Sie die Profiling-Gruppe, die erstellt wurde, als wir die Profilerstellung in Lambda aktiviert haben, und löschen dann die Lambda-Funktion.

Fazit

Die Nachhaltigkeit der Cloud ist eine geteilte Verantwortung von AWS und unseren Kunden. Während wir daran arbeiten, unser Rechenzentrum nachhaltiger zu gestalten, müssen Kunden auch daran arbeiten, ihren Code, ihre Ressourcen und Anwendungen nachhaltiger zu gestalten. CodeGuru Profiler kann Ihnen dabei helfen, die Nachhaltigkeit des Codes zu verbessern – wie oben gezeigt. Um noch heute mit der Profilierung Ihres Codes zu beginnen, besuchen Sie die CodeGuru Profiler Dokumentation. Um mit der Überwachung Ihrer Anwendungen zu beginnen, besuchen Sie die Amazon DevOps Guru Dokumentation.

Über die Autoren

Isha Dua ist eine leitende Lösungsarchitektin mit Sitz in der San Francisco Bay Area. Sie unterstützt AWS Enterprise-Kunden dabei, zu wachsen, indem sie ihre Ziele und Herausforderungen versteht und sie dabei anleitet, wie sie ihre Anwendungen auf eine cloud-native Weise gestalten können, wobei sie sicherstellt, dass sie widerstandsfähig und skalierbar sind. Sie ist begeistert von Machine-Learning-Technologien und Umweltschutz.
Christian Tomeldan ist ein DevOps-Ingenieur, der zum Lösungsarchitekten wurde. Er arbeitet von San Francisco aus und ist leidenschaftlich für Technologie. Diese Leidenschaft gibt er an Kunden weiter, um sicherzustellen, dass sie mit der richtigen Unterstützung und den besten Praktiken wachsen. Sein technischer Schwerpunkt liegt hauptsächlich auf Containern, Sicherheit und Umweltschutz.
Ifeanyi Okafor ist Produktmanager bei AWS. Er genießt es, Produkte zu entwickeln, die Kundenprobleme im großen Maßstab lösen.