„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > AWS SnapStart – Teil Messung von Kalt- und Warmstarts mit Java mithilfe der Lambda-Schicht (1)

AWS SnapStart – Teil Messung von Kalt- und Warmstarts mit Java mithilfe der Lambda-Schicht (1)

Veröffentlicht am 24.08.2024
Durchsuche:464

AWS SnapStart - Part Measuring cold and warm starts with Java using Lambda layer (1)

Einführung

Im Blogbeitrag So erstellen, veröffentlichen und verwenden Sie Ebenen für Java 21-Lambda-Funktionen haben wir unsere erste Lambda-Ebene mit Java 21 veröffentlicht. In diesem Artikel erstellen wir die Anwendung mithilfe dieser Lambda-Ebene und messen anschließend den Kalt- und Warmstart Mal ohne aktiviertes SnapStart, mit aktiviertem SnapStart und zusätzlich angewendeter DynamoDB-Aufruf-Priming-Optimierung. Wir werden die Ergebnisse auch mit unseren Messungen vergleichen, ohne die Lambda-Schichten zu verwenden und alle Abhängigkeiten in der POM-Datei bereitzustellen, was wir im Artikel Messen von Kalt- und Warmstarts mit Java 21 unter Verwendung unterschiedlicher Lambda-Speichereinstellungen getan haben.

Die Messung von Kälte und Wärme beginnt mit Java 21 mithilfe der Lambda-Schicht

In unserem Experiment verwenden wir die Beispielanwendung. Grundsätzlich sind in der AWS SAM-Vorlage zwei Lambda-Funktionen definiert, die sowohl auf die API-Gateway-Anfragen reagieren als auch Produkte anhand der ID abrufen, die sie vom API-Gateway von DynamoDB erhalten haben. Eine Lambda-Funktion, GetProductByIdWithPureJava21LambdaWithCommonLayer, kann mit und ohne SnapStart verwendet werden, und die zweite, GetProductByIdWithPureJava21LambdaAndPrimingWithCommonLayer, verwendet SnapStart und DynamoDB-Anforderungsaufruf-Priming.

Abhängigkeiten, die über die Lambda-Ebene bereitgestellt werden, haben den in der pom.xml-Datei unserer Anwendung „bereitgestellten“ Bereich.

Um die im Artikel „So erstellen Sie eine Veröffentlichung und Verwendung von Ebenen für Java 21 Lambda-Funktionen erstellte Lambda-Ebene“ für die Lambda-Funktionen in der AWS SAM-Vorlage anzuhängen, müssen Sie der Lambda-Funktion den Parameter „Layers“ wie folgt hinzufügen:

    Type: AWS::Serverless::Function
    Properties:
      FunctionName: GetProductByIdWithPureJava21LambdaWithCommonLayer
      AutoPublishAlias: liveVersion
      Layers:
        - !Sub arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:layer:aws-pure-java-21-common-lambda-layer:1
      Handler: software.amazonaws.example.product.handler.GetProductByIdHandler::handleRequest

Bitte ersetzen Sie den Layer-ARN (einschließlich der Version) durch Ihren eigenen, der die Ausgabe des Befehls zum Veröffentlichen des Layers ist (aws lambda Publish-Layer-Version).

Die Ergebnisse des folgenden Experiments basierten auf der Reproduktion von mehr als 100 Kalt- und etwa 100.000 Warmstarts mit einem Experiment, das etwa eine Stunde dauerte. Dafür (und Experimente aus meinem vorherigen Artikel) habe ich das Lasttest-Tool verwendet, aber Sie können jedes beliebige Tool verwenden, z. B. Serverless-Artillery oder Postman.
Ich habe alle diese Experimente durchgeführt, indem ich unseren Lambda-Funktionen 1024 MB Speicher gegeben und die folgende Kompilierungsoption über die Umgebungsvariable übergeben habe: JAVA_TOOL_OPTIONS: „-XX: TieredCompilation -XX:TieredStopAtLevel=1“ (Client-Kompilierung ohne Profilierung), was eine sehr gute Leistung liefert Kompromiss zwischen Kalt- und Warmstartzeit.

In den Tabellen unten werde ich auch die Ergebnisse unserer Messungen ohne Verwendung der Lambda-Schichten aus dem Artikel Messen von Kalt- und Warmstarts mit Java 21 unter Verwendung unterschiedlicher Lambda-Speichereinstellungen bereitstellen, um einen direkten Vergleich zwischen beiden zu ermöglichen.
Die Abkürzung c steht für den Kaltstart und w für den Warmstart.

Kalt- (c) und Warmstartzeiten (w) ohne SnapStart in ms:

Experiment c p50 c p75 c p90 c p99 c p99.9 c max w p50 w p75 w p90 w p99 w p99.9 w max
mit gemeinsamer Lambda-Schicht 3497,91 3597,18 3695,58 3800,47 3908,33 4011,71 5,82 6,72 8.00 17,97 55,48 1709.13
ohne Lambda-Schicht 3157,6 3213,85 3270,8 3428.2 3601.12 3725.02 5,77 6,50 7,81 20,65 90,20 1423,63

Kalt- (c) und Warmstartzeiten (w) mit SnapStart ohne Priming in ms:

Experiment c p50 c p75 c p90 c p99 c p99.9 c max w p50 w p75 w p90 w p99 w p99.9 w max
mit gemeinsamer Lambda-Schicht 2047.12 2124,24 2439,49 2705,52 2735,43 2831,59 5,68 6,40 7,45 17.06 48,45 2139,74
ohne Lambda-Schicht 1626,69 1741.10 2040,99 2219,75 2319,54 2321,64 5,64 6.41 7,87 21,40 99,81 1355.09

Kalte (c) und warme (w) Startzeiten mit SnapStart und mit DynamoDB-Aufruf Priming in ms:

Experiment c p50 c p75 c p90 c p99 c p99.9 c max w p50 w p75 w p90 w p99 w p99.9 w max
mit gemeinsamer Lambda-Schicht 713,88 766,38 1141,94 1181,41 1214,94 1215,32 5,59 6.30 7,39 16,39 45.09 574,61
ohne Lambda-Schicht 702,55 759,52 1038,50 1169,66 1179,05 1179,36 5,73 6,51 7,87 21,75 92,19 328,41

Abschluss

In diesem Artikel haben wir die Anwendung mithilfe der Lambda-Schicht mit gemeinsamen Abhängigkeiten erstellt und dann Kalt- und Warmstartzeiten ohne aktiviertes SnapStart gemessen, wobei SnapStart aktiviert war, und außerdem die DynamoDB-Aufruf-Priming-Optimierung angewendet und die Ergebnisse mit unseren Messungen ohne Verwendung von Lambda verglichen Schichten und Bereitstellung aller Abhängigkeiten in der POM-Datei, was wir im Artikel Messung von Kalt- und Warmstarts mit Java 21 unter Verwendung unterschiedlicher Lambda-Speichereinstellungen getan haben.

Ich habe mehrmals Messungen mit den üblichen Lambda-Schichten durchgeführt, um das Ergebnis meines Experiments wirklich zu bestätigen. Auch wenn ich zwischen diesen Messungen einige Abweichungen in den Ergebnissen hatte, war der Trend immer derselbe: Wenn SnapStart nicht aktiviert wurde oder aktiviert wurde, aber kein Priming des DynamoDB-Aufrufs verwendet wurde, startete der Kaltstart mit der Verwendung von Common Lambda Die Laufzeit der Schicht war mehrere Hundert Millisekunden höher als beim Paketieren aller Abhängigkeiten nur in der POM-Datei. Nur wenn SnapStart für die Lambda-Funktion aktiviert und DynamoDB-Aufrufpriming angewendet wurde, waren die Kaltstarts bei beiden Ansätzen sehr ähnlich, wahrscheinlich aufgrund der Tatsache, dass sich bereits alles im erstellten Snapshot befand.

Die Warmstarts der Lambda-Funktion waren für beide Anwendungsfälle (mit und ohne Verwendung der Lambda-Ebenen) und für alle Experimente (mit und ohne aktiviertem SnapStart) für fast alle Perzentile recht ähnlich. Aber ich habe immer höhere Ergebnisse für den Maximalwert erzielt, wenn ich eine gemeinsame Lambda-Schicht verwende.

Im nächsten Artikel werde ich meine Experimente mit den Lambda-Ebenen fortsetzen. Dieses Mal werde ich die Lambda-Ebene erstellen, veröffentlichen und verwenden, die nicht nur allgemeine Abhängigkeiten (wie in diesem Artikel), sondern alle Abhängigkeiten enthält, die zum Ausführen dieser Anwendung erforderlich sind, und dann die Ergebnisse beider Experimente vergleichen.

Freigabeerklärung Dieser Artikel ist abgedruckt unter: https://dev.to/aws-builders/aws-snapstart-part-24-measuring-cold-and-warm-starts-with-java-21-using-lambda-layer-1- 4o8l? 1Wenn es einen Verstoß gibt, wenden Sie sich bitte an [email protected], um ihn zu löschen
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3