¿Cómo probar el rendimiento de las funciones de AWS Lambda?

14

El costo de AWS Lambda depende del tiempo que se ejecuta una función y, en cierta medida, de la huella de memoria. Tener funciones que terminen más rápido y consuman menos memoria puede ahorrar bastante dinero. Especialmente cuando dicha función se ejecuta a menudo.

¿Cómo se puede ajustar una función Lambda de Node.js para la velocidad y la pequeña huella de memoria para ahorrar costos?

¿Hay otros aspectos para Lambda que sean ventajosos de mejorar?

Evgeny
fuente

Respuestas:

6

La respuesta de Dawny33 es buena, pero comenzaría antes en el proceso de desarrollo.

Mantener un ojo en su entorno de nube para asegurarse de que sus funciones se comporten como espera (incluidas sus funciones de "producción", que podrían operar en un conjunto de datos diferente) es crucial, porque puede revelar cosas que son imposibles de reproducir localmente o con Un conjunto de datos de prueba.

No obstante, diría que esta prueba de rendimiento que realiza en un propósito de optimización debe comenzar directamente desde la máquina del desarrollador. O, al menos, de algún entorno local antes de pasar a la nube.

La razón por la que lo digo es que, si bien AWS Lambdas es increíble en muchos puntos, el hecho de que no tenga un control total sobre el servidor limitará sus capacidades de instrumentación. No digo que la instrumentación sea imposible cuando no se utiliza un servidor, pero intente averiguar cuántas interrupciones de CPU tiene (y cuántas son causadas por su código) solo por diversión;)

Entonces, lo que aconsejo, y esto en realidad no se limita a sin servidor, es comenzar el perfil temprano. La creación de perfiles de NodeJS se puede hacer con muchas herramientas diferentes, NewRelic, dynatrace y AppDynamic son algunos de los grandes jugadores. También hay un reproductor más pequeño, algunos de ellos son solo un paquete NPM para instalar (como Nodefly). También es posible hacer algunos NodeJS sin ninguna herramienta adicional, ya que hay un generador de perfiles integrado en el motor V8. Esta documentación de NodeJS lo ayudará a comenzar.

Independientemente de la herramienta que elija, desea instalarla localmente y recopilar datos de creación de perfiles. Eso podría implicar ejecutar un agente o incluir un paquete en su package.json. Las instrucciones de su herramienta le indicarán cómo instalarla. Un buen generador de perfiles le permitirá saber cuánta memoria y CPU usa. Mejores herramientas le darán una idea de cuántas llamadas remotas se hicieron, cuánto tiempo tomaron.

Utilice los datos de creación de perfiles que le brinda la herramienta para identificar cuellos de botella y abordarlos. No hay límite en la cantidad de perfiles que puede hacer. Algunas personas (¿locas?) Mirarán las llamadas al sistema de su función más crítica. Es posible que tenga que hacer ese tipo de cosas si desea reducir los nanosegundos de su función (pero entonces, tal vez AWS Lambda no sea la mejor opción para comenzar).

También vale la pena señalar en este punto que no he mencionado nada específico de AWS Lambda. Esto se debe a que sus optimizaciones probablemente no sean específicas de AWS Lambda (después de todo, en serverless no debe preocuparse por el servidor / entorno).

Asegúrese de que no solo su código funcione, sino que funcione de la manera esperada. No optimices en exceso, pero mantén un ojo crítico en el uso de la CPU y la memoria. ¿Debería una matriz de 2MB realmente crecer a 10MB cuando la ordena? Probablemente no.

Entonces podrá utilizar las herramientas mencionadas por Dawny33, o algunas otras herramientas, para confirmar que sus funciones funcionan de manera similar cuando se implementan en Lambda. Sin embargo, ya tendrá un nivel muy alto de confianza en su función y solo tendrá que validar que se comporten correctamente, no perfilarlos completamente.

Alexandre
fuente
Sí, es importante, pero ¿cómo se puede hacer? ¿Hay algunas herramientas, prácticas, qué puede hacer exactamente un desarrollador? No veo nada de esto mencionado en esta respuesta: /
Evgeny
Lo dije, a través de perfiles e instrumentación. NewRelic APM es un ejemplo, pero ese es solo uno de los perfiladores disponibles. Instale el generador de perfiles, ejecute su función, optimice. No importa si se ejecutará en AWS Lambda, a menos que tenga un problema específico con AWS. Actualizaré mi respuesta en función de tu comentario.
Alexandre
Algunos ejemplos y enlaces a artículos, blogs, perfiladores conocidos que pueden hacer el trabajo. Ese es el tipo de cosas que en mi opinión hace que la respuesta sea valiosa, no solo enviando a la gente a hacer una pregunta en algún lugar "¿cómo cuento las interrupciones de mi CPU? No tengo idea".
Evgeny
Buen punto. He mejorado mi respuesta nuevamente.
Alexandre
5

Es posible que no pueda responderlo por completo, pero aquí están mis puntos de vista de mi experiencia limitada con lambda:

  1. Velocidad-rendimiento: la duración de una sola ejecución de una función lambda estará presente en el tablero de la monitoringpestaña Lambda , que se ve más o menos así:

ingrese la descripción de la imagen aquí

También lo hacen los aceleradores / errores / número de invocaciones.

  1. También se pueden configurar filtros CloudWatch para el uso de memoria de una función lambda, cuyos datos se pueden utilizar para optimizar aún más su controlador. Esta es una publicación decente sobre cómo configurar una.
  2. Además, configure el registro adecuado , para que luego pueda revisar los registros en CloudWatch. Este no es un truco de optimización per se, sino más bien una mejor práctica.
  3. Pruebas : pruebe sus funciones lambda a fondo, para que no se pierda los casos extremos. Esto es importante, ya que lambda reintenta las funciones fallidas antes de darse por vencido. Por lo tanto, puede ahorrar tiempo de antemano si probó la función correctamente. Guía para probar funciones de Lambda
Dawny33
fuente
5

Consulte el generador de perfiles IOpipe para obtener volcados completos del generador de perfiles v8 de las invocaciones de Lambda. Puede cargarlos en Chrome Devtools para ver exactamente dónde se gasta el tiempo de CPU y cómo se usa la memoria para sus funciones.

ingrese la descripción de la imagen aquí

Descargo de responsabilidad: trabajo para IOpipe

adjohn
fuente
0

Use el agente StackImpact para obtener perfiles de CPU y memoria. Más detalles en la publicación del blog: AWS Lambda CPU and Memory Profiling (Node.js) . Debido a que el proceso Lambda Node.js se congela entre solicitudes, la mayoría de las otras herramientas probablemente no funcionarán de inmediato.

ingrese la descripción de la imagen aquí

Descargo de responsabilidad: trabajo para StackImpact

logix
fuente
Si bien parece una solución relacionada y potencialmente válida, extender un poco sobre cómo puede ayudar a abordar la pregunta evitaría la sensación de un enlace y solo respondería si, si el enlace se pudre, no hay mucho para tener una primera idea de cómo puede ayudar.
Tensibai