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'artefact 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 re-mesurer 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.
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) :
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 attribuant aux fonctions Lambda 1 024 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 générationnel) qui rencontre 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.
Il a essayé un paramètre de mémoire plus grand, comme 1 024, comme 2 048 Mo, et encore plus, mais la même erreur est toujours apparue.
Examinons les résultats de nos mesures avec 3 autres algorithmes de garbage collection.
Abréviation c désigne le démarrage à froid et w désigne le démarrage à chaud.
Heure de démarrage à froid (c) et à chaud (w) sans SnapStart activé en ms :
Algorithme GC | 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 |
Collecteur parallèle | 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 :
Algorithme GC | 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 | 17h41 | 51.24 | 1522.04 |
Collecteur parallèle | 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 :
Algorithme GC | 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 |
Collecteur parallèle | 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 | 6h40 | 7.39 | 17h20 | 65.06 | 500,48 |
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.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3