Dans l'article de blog Comment créer, publier et utiliser des couches pour les fonctions Lambda Java 21, nous avons publié notre première couche Lambda avec Java 21. Dans cet article, nous allons créer l'application à l'aide de cette couche Lambda, puis mesurer le démarrage à froid et à chaud. fois sans SnapStart activé, avec SnapStart activé et également appliqué l'optimisation de l'amorçage des invocations DynamoDB. Nous comparerons également les résultats avec nos mesures sans utiliser les couches Lambda et en fournissant toutes les dépendances dans le fichier POM comme nous l'avons fait dans l'article Mesurer les démarrages à froid et à chaud avec Java 21 en utilisant différents paramètres de mémoire Lambda.
Dans notre expérience, nous utiliserons l'exemple d'application. Il existe essentiellement 2 fonctions Lambda définies dans le modèle AWS SAM qui répondent toutes deux aux requêtes API Gateway et récupèrent le produit par identifiant reçu de l'API Gateway de DynamoDB. Une fonction Lambda GetProductByIdWithPureJava21LambdaWithCommonLayer peut être utilisée avec et sans SnapStart et la seconde GetProductByIdWithPureJava21LambdaAndPrimingWithCommonLayer utilise l'amorçage d'appel de requête SnapStart et DynamoDB.
Les dépendances fournies via la couche Lambda ont la portée « fournie » dans le fichier pom.xml de notre application.
Afin d'attacher la couche Lambda créée dans l'article Comment créer une publication et utiliser des couches pour les fonctions Lambda Java 21 pour les fonctions Lambda dans le modèle AWS SAM, nous devons ajouter le paramètre Layers à la fonction Lambda comme ceci :
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
Veuillez remplacer l'ARN de la couche (y compris la version) par le vôtre qui est le résultat de la commande de couche de publication (aws lambda submit-layer-version).
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.
J'ai mené toutes ces expériences en donnant à nos fonctions Lambda 1024 Mo de mémoire et en passant l'option de compilation suivante via la variable d'environnement : JAVA_TOOL_OPTIONS : "-XX: TieredCompilation -XX:TieredStopAtLevel=1" (compilation client sans profilage) qui fournit un très bon compromis entre les heures de démarrage à froid et à chaud.
Dans les tableaux ci-dessous, je fournirai également les résultats de nos mesures sans utiliser les couches Lambda tirées de l'article Mesurer les démarrages à froid et à chaud avec Java 21 en utilisant différents paramètres de mémoire Lambda pour avoir directement la comparaison entre les deux.
L'abréviation c correspond au démarrage à froid et w correspond au démarrage à chaud.
Heures de démarrage à froid (c) et à chaud (w) sans SnapStart en ms :
Expérience | 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 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
avec une couche Lambda commune | 3497.91 | 3597.18 | 3695,58 | 3800.47 | 3908.33 | 4011.71 | 5,82 | 6,72 | 8h00 | 17,97 | 55,48 | 1709.13 |
sans couche Lambda | 3157.6 | 3213,85 | 3270,8 | 3428.2 | 3601.12 | 3725.02 | 5,77 | 6,50 | 7,81 | 20,65 | 90,20 | 1423,63 |
Heures de démarrage à froid (c) et à chaud (w) avec SnapStart sans amorçage en ms :
Expérience | 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 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
avec une couche Lambda commune | 2047.12 | 2124.24 | 2439,49 | 2705,52 | 2735,43 | 2831,59 | 5,68 | 6h40 | 7.45 | 17.06 | 48,45 | 2139,74 |
sans couche Lambda | 1626,69 | 1741.10 | 2040,99 | 2219,75 | 2319,54 | 2321,64 | 5,64 | 6.41 | 7,87 | 21h40 | 99,81 | 1355.09 |
Heures de démarrage à froid (c) et à chaud (w) avec SnapStart et avec l'invocation DynamoDB Amorçage en ms :
Expérience | 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 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
avec une couche Lambda commune | 713,88 | 766,38 | 1141,94 | 1181.41 | 1214,94 | 1215.32 | 5,59 | 6h30 | 7.39 | 16.39 | 45.09 | 574,61 |
sans couche Lambda | 702,55 | 759,52 | 1038,50 | 1169,66 | 1179.05 | 1179,36 | 5,73 | 6,51 | 7,87 | 21,75 | 92.19 | 328,41 |
Dans cet article, nous avons créé l'application à l'aide de la couche Lambda avec des dépendances communes, puis avons mesuré les temps de démarrage à froid et à chaud sans SnapStart activé, avec SnapStart activé et avons également appliqué l'optimisation de l'amorçage des invocations DynamoDB et comparé les résultats avec nos mesures sans utiliser Lambda. couches et en fournissant toutes les dépendances dans le fichier POM, ce que nous avons fait dans l'article Mesurer les démarrages à froid et à chaud avec Java 21 en utilisant différents paramètres de mémoire Lambda.
J'ai effectué plusieurs fois des mesures en utilisant les couches Lambda communes pour vraiment confirmer le résultat de mon expérience. Même si j'avais quelques écarts dans les résultats entre ces mesures, la tendance était toujours la même : lorsque SnapStart n'était pas activé ou lorsque SnapStart n'était pas activé mais n'était pas utilisé pour l'amorçage de l'invocation DynamoDB, les démarrages à froid avec l'utilisation de Lambda commun La couche était supérieure de plusieurs centaines de millisecondes par rapport au regroupement de toutes les dépendances uniquement dans le fichier POM. Ce n'est que lorsque SnapStart a été activé pour la fonction Lambda et que l'amorçage des appels DynamoDB a été appliqué que les démarrages à froid avec les deux approches étaient très proches, probablement en raison du fait que tout était déjà dans l'instantané créé.
Les démarrages à chaud de la fonction Lambda étaient assez proches pour les deux cas d'utilisation (avec et sans utilisation des couches Lambda) et pour toutes les expériences (avec et sans SnapStart activé) pour presque tous les centiles, mais j'ai toujours obtenu des résultats plus élevés pour la valeur maximale avec l'utilisation de la couche Lambda commune.
Dans le prochain article, je continuerai mes expériences avec les couches Lambda. Cette fois, je vais créer, publier et utiliser la couche Lambda contenant non seulement les dépendances communes (comme dans cet article), mais toutes les dépendances requises pour exécuter cette application, puis comparer les résultats des deux expériences.
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