Maison > Java > javaDidacticiel > AWS SnapStart - Partie Mesure des démarrages à froid et à chaud avec Java à l'aide de différents algorithmes de récupération de place

AWS SnapStart - Partie Mesure des démarrages à froid et à chaud avec Java à l'aide de différents algorithmes de récupération de place

DDD
Libérer: 2024-09-24 06:16:44
original
965 Les gens l'ont consulté

AWS SnapStart - Part Measuring cold and warm starts with Java using different garbage collection algorithms

Introduction

Dans les parties précédentes de notre série, nous avons mesuré les démarrages à froid de la fonction Lambda avec le runtime Java 21 sans SnapStart activé, avec SnapStart activé et avons également appliqué l'optimisation de l'amorçage des invocations DynamoDB avec différents paramètres de mémoire Lambda, tailles d'artefacts de déploiement Lambda, Java options de compilation, (a)clients HTTP synchrones et utilisation de différentes couches Lambda. Pour toutes ces mesures, nous avons utilisé les algorithmes de garbage collection par défaut G1.

Dans cet article, nous aimerions explorer l'impact des algorithmes de garbage collection Java sur les performances de la fonction Lambda avec le runtime Java 21. Nous allons également tout remesurer pour que le G1 ait des résultats comparables avec la même version mineure de Java 21 utilisée pour tous les algorithmes de garbage collection.

Algorithmes de récupération de place Java

Pour nos mesures, nous utiliserons les algorithmes de collecte Java suivants avec leurs paramètres par défaut (veuillez vous référer à la documentation liée pour des informations plus détaillées sur chaque algorithme) :

  • Récupérateur de déchets Garbage-First (G1). Il s’agit de l’algorithme de garbage collection utilisé par défaut. Vous pouvez le définir explicitement dans le modèle AWS SAM en ajoutant -XX:+UseG1GC à la variable d'environnement JAVA_TOOL_OPTIONS.
  • Le collecteur parallèle. Vous pouvez le définir explicitement dans le modèle AWS SAM en ajoutant -XX:+UseParallelGC à la variable d'environnement JAVA_TOOL_OPTIONS.
  • Shenandoah GC. Oracle JDK ne le fournit pas, mais Amazon Corretto 21 JDK le fait. Vous pouvez le définir explicitement dans le modèle AWS SAM en ajoutant -XX:+UseShenandoahGC à la variable d'environnement JAVA_TOOL_OPTIONS.
  • Le collecteur de déchets Z. Il existe 2 algorithmes ZGC différents : par défaut et le plus récent, une génération. Vous pouvez le définir explicitement dans le modèle AWS SAM en ajoutant -XX:+UseZGC ou -XX:+UseZGC -XX:+ZGenerational à la variable d'environnement JAVA_TOOL_OPTIONS.

La mesure du froid et du chaud démarre avec Java 21 en utilisant différents algorithmes de garbage collection

Dans notre expérience, nous utiliserons une application légèrement modifiée introduite dans la partie 9. Vous pouvez trouver le code de l'application ici. Il existe essentiellement 2 fonctions Lambda qui répondent aux requêtes de l'API Gateway et récupèrent le produit par identifiant reçu de l'API Gateway de DynamoDB. Une fonction Lambda GetProductByIdWithPureJava21LambdaWithGCAlg peut être utilisée avec et sans SnapStart et la seconde GetProductByIdWithPureJava21LambdaAndPrimingWithGCAlg utilise l'amorçage d'appel de requête SnapStart et DynamoDB.

Les résultats de l'expérience ci-dessous étaient basés sur la reproduction de plus de 100 démarrages à froid et d'environ 100 000 démarrages à chaud avec une expérience qui a duré environ 1 heure. Pour cela (et pour les expériences de mon article précédent), j'ai utilisé l'outil de test de charge, mais vous pouvez utiliser l'outil de votre choix, comme Serverless-artillerie ou Postman. Nous effectuons des expériences en donnant aux fonctions Lambda 1024 Mo de mémoire et en utilisant JAVA_TOOL_OPTIONS : "-XX:+TieredCompilation -XX:TieredStopAtLevel=1" (compilation client Java sans profilage) qui présente un très bon compromis entre les heures de démarrage à froid et à chaud.

Malheureusement, je n'ai pas pu démarrer la fonction Lambda avec The Z Garbage Collector (avec celui par défaut et celui générationnel) qui se heurtait à l'erreur :

Failed to commit memory (Operation not permitted)
[error][gc] Forced to lower max Java heap size from 872M(100%) to 0M(0%)
[error][gc] Failed to allocate initial Java heap (512M)
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
Copier après la connexion

Il a essayé un paramètre de mémoire plus grand, comme 1 024, 2 048 Mo et encore plus, mais la même erreur est toujours apparue.

Regardons les résultats de nos mesures avec 3 autres algorithmes de garbage collection.

L'abréviation c est pour le démarrage à froid et w est pour le démarrage à chaud.

Heure de démarrage à froid (c) et à chaud (w) sans SnapStart activé en ms :

GC Algorithm 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
G1 3655.17 3725.25 3811.88 4019.25 4027.30 4027.83 5.46 6.10 7.10 16.79 48.06 1929.79
Parallel Collector 3714.10 3789.09 3857.87 3959.44 4075.89 4078.25 5.55 6.20 7.10 15.38 130.13 2017.92
Shenandoah 3963.40 4019.25 4096.30 4221.00 4388.78 4390.76 5.82 6.45 7.39 17.06 71.02 2159.21

Heure de démarrage à froid (c) et à chaud (w) avec SnapStart activé sans amorçage en ms :

GC Algorithm 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
G1 1867.27 1935.68 2152.02 2416.57 2426.25 2427.35 5.47 6.11 7.05 17.41 51.24 1522.04
Parallel Collector 1990.62 2047.12 2202.07 2402.12 2418.99 2419.32 5.68 6.35 7.45 18.04 147.83 1577.21
Shenandoah 2195.47 2301.07 2563.37 3004.89 3029.01 3030.36 5.73 6.41 7.51 17.97 75.00 1843.34

Heure de démarrage à froid (c) et à chaud (w) avec SnapStart activé et avec invocation DynamoDB Amorçage en ms :

GC Algorithm 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
G1 833.50 875.34 1089.53 1205.26 1269.56 1269.8 5.46 6.10 7.16 16.39 46.19 499.13
Parallel Collector 900.18 975.12 1058.41 1141.94 1253.17 1253.99 5.82 6.61 7.75 16.87 49.64 487.73
Shenandoah 1065.84 1131.71 1331.96 1473.44 1553.59 1554.95 5.77 6.40 7.39 17.20 65.06 500.48

Conclusion

Dans cet article, nous avons exploré l'impact des algorithmes de garbage collection Java (G1, Parallel Collector et Shenandoah) sur les performances de la fonction Lambda avec le runtime Java 21. Nous avons constaté une grande différence entre les performances de ces algorithmes. En utilisant les paramètres par défaut avec G1 (celui par défaut), nous obtenons (parfois de loin) les temps de démarrage à froid et à chaud les plus bas. En utilisant SnapStart avec l'amorçage de la requête DynamoDB, les résultats de performances sont comme prévu beaucoup plus proches les uns des autres.

Veuillez vous référer à la documentation de chaque algorithme de récupération de place pour régler les paramètres tels que le mixage et la mémoire maximale, ce qui peut apporter une amélioration significative des performances et effectuer vos propres mesures.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal