Wie kann ich die Latenz bei der Initialisierung und Aufrufdauer meiner Java-Lambda-Funktion verringern?

Lesedauer: 4 Minute
0

Meine AWS-Lambda-Funktion in Java funktioniert nicht optimal. Warum passiert das und wie reduziere ich die Initialisierungs- und Dauer-Latenz meiner Java-Funktion?

Kurzbeschreibung

Es gibt zwei Hauptfaktoren, die zu einer hohen Latenz in einer Java-Lambda-Funktion beitragen können:

Verzögerte Initialisierung von Java Virtual Machine (JVM)

Um den Speicherverbrauch zu reduzieren, verzögert die JVM die Initialisierung einer Java-Klassenbibliothek, bis die Bibliothek erstmals in einer Anwendung aufgerufen wird. Diese Verzögerung kann zu einer hohen Anzahl von Input-Output-Vorgängen (I/O) führen, was sich in längeren Latenzen bei ersten Aufrufen in einer Lambda-Ausführungsumgebung niederschlägt.

Die Java Reflection API

Mithilfe der Java Reflection API kann Java-Code Informationen über andere Klassen, Schnittstellen, Felder und Methoden ermitteln und dann mit deren zugrunde liegenden Werten arbeiten. Da die Reflexion Typen beinhaltet, die dynamisch aufgelöst werden, können bestimmte JVM-Optimierungen nicht durchgeführt werden. Folglich weisen reflexive Operationen eine langsamere Leistung auf als ihre nicht reflexiven Gegenstücke.

Um die Leistung Ihrer Java-Lambda-Funktion zu optimieren, können Sie eine oder mehrere der in diesem Artikel beschriebenen bewährten Lösungen implementieren.

Hinweis: Eine konkrete Fallstudie finden Sie unter AWS re:Invent 2019: Best practices for AWS Lambda and Java.

Lösung

Konfigurieren bereitgestellter Gleichzeitigkeit für Ihre Lambda-Funktion

Bereitgestellte Gleichzeitigkeit initialisiert eine angeforderte Anzahl von Ausführungsumgebungen, sodass diese bereit sind, sofort auf die Aufrufe Ihrer Funktion zu reagieren. Um bereitgestellte Gleichzeitigkeit für Ihre Funktion einzurichten, folgen Sie den Anweisungen unter Konfigurieren von Provisioned Concurrency.

Weitere Informationen finden Sie unter Konfigurieren reservierter Gleichzeitigkeit.

Hinweis: Bei der Konfiguration von bereitgestellter Gleichzeitigkeit fallen Gebühren für Ihr AWS-Konto an. Sie können bereitgestellte Gleichzeitigkeit für eine Funktionsversion oder für einen Lambda-Funktions-Alias konfigurieren.

Initialisieren der statischen Logik Ihrer Funktion außerhalb des Funktions-Handlers

Wenn Sie eine Lambda-Funktion initialisieren, weist Lambda einen Burst der Host-CPU-Kapazität für bis zu 10 Sekunden zu. Aufgrund dieses CPU-Bursts empfiehlt es sich, Folgendes außerhalb des Funktions-Handlers zu tun:

  • Bibliotheken und Abhängigkeiten importieren
  • Konfigurationen einrichten
  • Verbindungen zu anderen Diensten initialisieren

Durch diese statische Initialisierung können diese Ressourcen einmal pro Sandbox initialisiert und dann für alle zukünftigen Aufrufe in der Ausführungsumgebung wiederverwendet werden.

Weitere Informationen finden Sie unter Optimizing static initialization.

Durchführung von API-Aufrufen an alle verzögert geladenen Bibliotheken außerhalb des Funktions-Handlers

Um ein verzögertes Laden von Bibliotheken während der Initialisierung zu vermeiden, können Sie Dummy-API-Aufrufe an alle verzögert geladenen Bibliotheken außerhalb des Funktions-Handlers ausführen. Diese Dummy-Aufrufe initialisieren die Bibliotheken und wärmen das von Ihnen verwendete SDK vor.

Hinweis: Dummy-Aufrufe an verzögert geladene Bibliotheken können fehlschlagen, wenn Lambda nicht über die nötigen Informationen für einen erfolgreichen API-Aufruf verfügt. Wenn der Aufruf fehlschlägt, fangen Sie den Fehler ab.

Reduzieren reflexiver Operationen in Ihrem Lambda-Code

Reflexive Operationen erbringen eine geringere Leistung als ihre nicht reflexiven Gegenstücke. Vermeiden Sie reflexive Operationen in Codeabschnitten, die häufig aufgerufen werden.

Reduzieren der Anzahl der Klassen in Ihrer Anwendung

Wenn Sie die Größe Ihres Bereitstellungspakets auf die erforderlichen Laufzeitanforderungen reduzieren, verringert sich auch die Zeit, die zum Aufrufen Ihrer Funktion benötigt wird.

Weitere Informationen finden Sie unter Bewährte Methoden für die Arbeit mit AWS Lambda-Funktionen.

Festlegen der Konfigurationsparameter Ihrer Lambda-Funktion im Voraus

Wenn Sie die Konfigurationsparameter Ihrer Funktion im Voraus festlegen, werden die Aufruf- und Dauer-Latenz Ihrer Funktion reduziert. Wenn Sie in Ihrem Code keine Konfigurationsvariablen angeben, benötigt Lambda mehr Zeit, um die Standardvariablen für Ihre Funktion zu ermitteln.

Weitere Informationen finden Sie im Abschnitt Funktionscode in Bewährte Methoden für die Arbeit mit AWS Lambda-Funktionen.

Aktualisieren auf AWS Java SDK 2.0

Weitere Informationen finden Sie unter Tuning the AWS Java SDK 2.x to reduce startup time.

Hinweis: Das AWS Java SDK 2.0 umfasst standardmäßig den Apache HTTP Client und den Netty HTTP Client sowie den Java HTTP URL Connection Client. Es hat sich bewährt, den Apache HTTP Client und den Netty HTTP Client aus Ihrem Bereitstellungspaket zu entfernen, wenn sie für Ihren Anwendungsfall nicht erforderlich sind.


AWS OFFICIAL
AWS OFFICIALAktualisiert vor 3 Jahren