Heim >Java >javaLernprogramm >AWS SnapStart – Teil Messung von Kalt- und Warmstarts mit Java mithilfe der Lambda-Schicht (1)
Im Blogbeitrag „So erstellen, veröffentlichen und verwenden Sie Schichten für Java 21 Lambda-Funktionen“ haben wir unsere erste Lambda-Schicht mit Java 21 veröffentlicht. In diesem Artikel erstellen wir die Anwendung mithilfe dieser Lambda-Schicht und messen dann 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.
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 bietet Guter Kompromiss zwischen den Kalt- und Warmstartzeiten.
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 verschiedener Lambda-Speichereinstellungen bereitstellen, um einen direkten Vergleich zwischen beiden zu haben.
Die Abkürzung c steht für den Kaltstart und w für den Warmstart.
Kaltstartzeiten (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 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
with common Lambda Layer | 3497.91 | 3597.18 | 3695.58 | 3800.47 | 3908.33 | 4011.71 | 5.82 | 6.72 | 8.00 | 17.97 | 55.48 | 1709.13 |
w/o Lambda Layer | 3157.6 | 3213.85 | 3270.8 | 3428.2 | 3601.12 | 3725.02 | 5.77 | 6.50 | 7.81 | 20.65 | 90.20 | 1423.63 |
Kaltstartzeiten (c) und Warmstartzeiten (w) mit SnapStart ohne Grundierung 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 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
with common Lambda Layer | 2047.12 | 2124.24 | 2439.49 | 2705.52 | 2735.43 | 2831.59 | 5.68 | 6.40 | 7.45 | 17.06 | 48.45 | 2139.74 |
w/o Lambda Layer | 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 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
with common Lambda Layer | 713.88 | 766.38 | 1141.94 | 1181.41 | 1214.94 | 1215.32 | 5.59 | 6.30 | 7.39 | 16.39 | 45.09 | 574.61 |
w/o Lambda Layer | 702.55 | 759.52 | 1038.50 | 1169.66 | 1179.05 | 1179.36 | 5.73 | 6.51 | 7.87 | 21.75 | 92.19 | 328.41 |
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, kam es zu einem 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. Erst 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 alles bereits im erstellten Snapshot enthalten war.
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-Schichten fortsetzen. Dieses Mal werde ich die Lambda-Ebene erstellen, veröffentlichen und verwenden, die nicht nur allgemeine Abhängigkeiten enthält (wie in diesem Artikel), sondern alle Abhängigkeiten, die zum Ausführen dieser Anwendung erforderlich sind, und dann die Ergebnisse beider Experimente vergleichen.
Das obige ist der detaillierte Inhalt vonAWS SnapStart – Teil Messung von Kalt- und Warmstarts mit Java mithilfe der Lambda-Schicht (1). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!