Comment tester les performances des fonctions AWS Lambda?

14

Le coût d'AWS Lambda dépend du temps d'exécution d'une fonction et, dans une certaine mesure, de l'empreinte mémoire. Avoir des fonctions qui se terminent plus rapidement et prennent moins de mémoire peut faire économiser beaucoup d'argent. Surtout quand une telle fonction est souvent exécutée.

Comment une fonction Node.js Lambda peut-elle être réglée pour la vitesse et une faible empreinte mémoire pour économiser sur les coûts?

Y a-t-il d'autres aspects intéressants à améliorer pour Lambda?

Evgeny
la source

Réponses:

6

La réponse de Dawny33 est bonne, mais je commencerais plus tôt dans le processus de développement.

Garder un œil sur votre environnement cloud pour vous assurer que vos fonctions se comportent comme prévu (y compris vos fonctions de «production», qui pourraient fonctionner sur un autre ensemble de données) est crucial, car cela pourrait révéler des choses impossibles à reproduire localement ou avec un ensemble de données de test.

Néanmoins, je dirais que ce test de performances que vous effectuez dans un but d'optimisation devrait commencer directement à partir de la machine du développeur. Ou, au moins, à partir d'un environnement local avant de passer au cloud.

La raison pour laquelle je le dis, c'est que même si AWS Lambdas est incroyable sur de nombreux points, le fait que vous n'ayez pas un contrôle total sur le serveur limitera vos capacités d'instrumentation. Je ne dis pas que l'instrumentation est impossible en mode sans serveur, mais essayez de déterminer combien d'interruptions CPU vous avez (et combien sont causées par votre code) juste pour le plaisir;)

Donc, ce que je conseille, et ce n'est en fait pas limité aux serveurs sans serveur, c'est de commencer le profilage tôt. Le profilage NodeJS peut être fait avec de nombreux outils différents, NewRelic, dynatrace et AppDynamic sont quelques-uns des grands acteurs. Il existe également un lecteur plus petit, certains d'entre eux ne sont qu'un package NPM à installer (comme Nodefly). Il est également possible de faire des NodeJS sans outil supplémentaire, car un profileur est intégré au moteur V8. Cette documentation de NodeJS vous aidera à démarrer.

Quel que soit l'outil que vous choisissez, vous souhaitez l'installer localement et collecter des données de profilage. Cela peut impliquer d'exécuter un agent ou d'inclure un package dans votre package.json. Les instructions de votre outil vous diront comment l'installer. Un bon profileur vous indiquera la quantité de mémoire et de CPU que vous utilisez. De meilleurs outils vous donneront un aperçu du nombre d'appels à distance effectués, de leur durée.

Utilisez les données de profilage fournies par l'outil pour identifier les goulots d'étranglement et les résoudre. Il n'y a pas de limite sur la quantité de profils que vous pouvez créer. Certaines personnes (folles?) Regarderont les appels système de leur fonction la plus critique. Vous devrez peut-être faire ce genre de chose si vous souhaitez réduire les nanosecondes de votre fonction (mais alors, peut-être qu'AWS Lambda n'est pas le meilleur choix pour commencer).

Il convient également de noter à ce stade que je n'ai rien mentionné de spécifique à AWS Lambda. En effet, vos optimisations ne seront probablement pas spécifiques à AWS Lambda (après tout, sans serveur, vous ne devriez pas vous soucier du serveur / de l'environnement).

Assurez-vous que non seulement votre code fonctionne, mais qu'il fonctionne comme vous vous y attendez. N'optimisez pas trop, mais gardez un œil critique sur l'utilisation du processeur et de la mémoire. Un tableau de 2 Mo doit-il vraiment atteindre 10 Mo lorsque vous le triez? Probablement pas.

Ensuite, vous pourrez utiliser les outils mentionnés par Dawny33, ou d'autres outils, pour confirmer que vos fonctions fonctionnent de manière similaire lorsqu'elles sont déployées sur Lambda. Cependant, vous aurez déjà un très haut niveau de confiance dans votre fonction et vous n'aurez qu'à valider qu'ils se comportent correctement, pas à les profiler complètement.

Alexandre
la source
Oui, c'est important, mais comment le faire? Existe-t-il des outils, des pratiques, que peut faire exactement un développeur? Je ne vois rien de tout cela mentionné dans cette réponse: /
Evgeny
Je l'ai dit, grâce au profilage et à l'instrumentation. NewRelic APM en est un exemple, mais ce n'est là qu'un des profileurs disponibles. Installez le profileur, exécutez votre fonction, optimisez. Qu'il s'exécute sur AWS Lambda n'a pas d'importance, sauf si vous avez un problème spécifique à AWS. Je mettrai à jour ma réponse en fonction de votre commentaire.
Alexandre
Quelques exemples et liens vers des articles, des blogs, des profileurs connus qui peuvent faire le travail. C'est le genre de chose qui à mon humble avis rend la réponse précieuse, et pas seulement d'envoyer des gens pour poser une question quelque part "comment puis-je compter mes interruptions de processeur, je n'ai aucune idée".
Evgeny
Bon point. J'ai encore amélioré ma réponse.
Alexandre
5

Je ne pourrais peut-être pas y répondre complètement, mais voici mes vues de mon expérience limitée avec lambda:

  1. Speed-Performance: La durée d'une seule exécution d'une fonction lambda sera présente dans le tableau de bord de l' monitoringonglet Lambda , qui ressemble à ceci:

entrez la description de l'image ici

Il en va de même pour les étranglements / erreurs / nombre d'appels.

  1. On peut également configurer des filtres CloudWatch pour l'utilisation de la mémoire d'une fonction lambda, dont les données peuvent être utilisées pour optimiser davantage votre gestionnaire. Ceci est un article décent sur la façon d'en créer un.
  2. Configurez également une journalisation appropriée , afin de pouvoir parcourir ultérieurement les journaux de CloudWatch. Ce n'est pas un hack d'optimisation en soi, mais plutôt une meilleure pratique
  3. Test : testez soigneusement vos fonctions lambda, afin de ne pas manquer les boîtiers de bord. Ceci est important, car lambda réessaye les fonctions défaillantes avant d'abandonner. Ainsi, vous pouvez gagner du temps en coup droit si vous avez correctement testé la fonction. Guide de test des fonctions Lambda
Dawny33
la source
5

Consultez le profileur IOpipe pour obtenir les vidages de profileur v8 complets des appels Lambda. Vous pouvez les charger dans Chrome Devtools pour voir exactement où le temps CPU est dépensé et comment la mémoire est utilisée pour vos fonctions.

entrez la description de l'image ici

Avertissement: je travaille pour IOpipe

adjohn
la source
0

Utilisez l' agent StackImpact pour obtenir les profils CPU et mémoire. Plus de détails dans le billet de blog: AWS Lambda CPU and Memory Profiling (Node.js) . Étant donné que le processus Lambda Node.js se fige entre les demandes, la plupart des autres outils ne fonctionneront probablement pas prêts à l'emploi.

entrez la description de l'image ici

Avertissement: je travaille pour StackImpact

logix
la source
Bien que cela semble apparenté et potentiellement une solution valable, étendre un peu sur la façon dont cela peut aider à répondre à la question éviterait le sentiment d'un lien ne répondrait que si le lien pourrissait, il n'y avait pas grand-chose pour avoir une première idée de la façon dont cela pouvait aider.
Tensibai