DEV Community

Cover image for Probando SnapStart en funciones lambdas
Kevin Catucuamba
Kevin Catucuamba

Posted on • Updated on

Probando SnapStart en funciones lambdas

SnapStart mejora el coldstart de las ejecuciones de las funciones lambdas en AWS, la documentación de esta configuración especifica que se puede mejorar hasta 10 veces el tiempo de inicialización sin costo adicional y sin cambios en el código de la función, se puede usar para mejorar el levantamiento de entornos pesados o que hacen uso de frameworks como Spring o Quarkus.

¿Qué es coldstart en funciones lambdas?

El término "cold start" o "inicio en frío" en funciones lambda se refiere a la situación en la que la lambda es invocada por primera vez después de un período prolongado sin haber sido llamada por ningún cliente. En este caso, la función lambda necesita más tiempo para configurar el entorno de ejecución o el contenedor y poder ejecutar la acción solicitada. Esta demora puede resultar una mala experiencia para los usuarios que consumen la función.

Consideraciones para SnapStart

A la fecha que se escribe este post existen algunas consideraciones que debe tener en cuenta al momento de configurar SnapStart en nuestras funciones lambdas.

  • Soporte para java 11
  • Soporte para arquitecturas x86_64 (no arm64)
  • No soporta la activación de tracing para la función lambda

Planteamiento del problema

Para probar SnapStart funcionando se toma como referencia una función que se demora alrededor de 5 segundos en inicializar por primera vez, luego se implementa SnapStart y se compara resultados, se realiza pruebas de cargas relativamente pequeñas para ver su comportamiento en ambos escenarios. La función a probar es de tipo GET reservada, pero a grandes rasgos lo que hace es consultar información desde una base de datos relacional, validar la información que entra y sale, entre algunas otras ejecuciones.

Escenario sin SnapStart

Primero se realiza un consumo directo desde la consola de Lambda para verificar tiempos de respuesta:

Image description

Vemos que el tiempo de inicialización de la función es un poco más de 5 segundos y de 1.8 segundos ejecutando el código.

Prueba de carga con Jmeter

Configuración de Jmeter para ambos casos:

Prueba de carga

Se realiza una prueba de carga usando Jmeter para poder visualizar las inicializaciones en coldstart, esto lo verificamos realizando una consulta en Logs Insights de AWS:

Image description

Se puede verificar que con la configuración de Jmeter mostrada anteriormente se pudo generar 100 inicios en frío (cold start).

La consulta que se utilizó en Logs Insights para ambos casos es la siguiente:

filter @type = "REPORT"
  | parse @log /\d+:\/aws\/lambda\/(?<function>.*)/
  | parse @message /Restore Duration: (?<restoreDuration>.*) ms/
  | stats
count(*) as invocations,
pct(@duration+coalesce(@initDuration,0)+coalesce(restoreDuration,0), 50) as p50,
pct(@duration+coalesce(@initDuration,0)+coalesce(restoreDuration,0), 90) as p90,
pct(@duration+coalesce(@initDuration,0)+coalesce(restoreDuration,0), 99)as p99,
pct(coalesce(@initDuration,0)+coalesce(restoreDuration,0), 50) as pi50,
pct(coalesce(@initDuration,0)+coalesce(restoreDuration,0), 90) as pi90,
pct(coalesce(@initDuration,0)+coalesce(restoreDuration,0), 99) as pi99
group by function, (ispresent(@initDuration) or ispresent(restoreDuration)) as coldstart
  | sort by coldstart desc
Enter fullscreen mode Exit fullscreen mode

Escenario con SnapStart

Lo primero será configurar SnapStart para esta función, para ello en configuración general de la función editar la parte donde dice SnapStart:

Image description

Se debe crear una nueva versión de la lambda, y el alias que se tenga debe apuntar a la nueva versión. Al crear una nueva versión se podrá notar que toma algo de tiempo, esto debido a que está preparando la imagen y almacenándola en caché para poder utilizarla cuando se invoque por primera vez. Podremos verificar que en los logs de CloudWatch empieza a ejecutarse algunas acciones de configuraciones:

Image description

En la configuración general de la nueva versión se debe poder observar activado el SnapStart:

Image description

De igual manera se realiza una prueba directa en la consola de lambda para verificar tiempos de respuesta.

Image description

Se observa que con SnapStart activado el tiempo de inicialización bajo de 5 segundos a menos de un segundo, validando de esta manera la funcionalidad de SnapStart, sin embargo se aprecia que la duración de la ejecución del código se demora un poco más, dando como resultado la facturación más elevada.

Prueba de carga

De igual manera se realiza pruebas de carga para poder sacar tiempos en inicio en ColdStart obteniendo los siguientes resultados:

Image description

Con la misma configuración de Jmeter mostrada en el primer escenario se genera 101 invocaciones en frío, se observa que los tiempos de inicialización han mejorado notablemente a menos de un segundo, entonces SnapStart está funcionando de manera adecuada.

Conclusiones

  • Los inicios en frío con SnapStart mejoran notablemente, según los resultados arrojados en Logs Insights de CloudWatch, mejoró 15 veces la inicialización de la lambda, ¡fantástico!.
  • Parecería que cuando se activa SnapStart, la duración de ejecución de código se demora un poco más, eso se lo puede notar claramente cuando ejecutamos la lambda directamente desde la consola.
  • SnapStart cumple con lo que dice en cuanto a tiempos de inicialización de la lambda, personalmente veo una característica muy potente que seguramente se irá mejorando con el tiempo y dando soporte a otras plataformas y versiones.

Referencias

Top comments (0)