Probando SnapStart en funciones lambdas
Tags: aws, lambda, snapstart, java
Published: 2022-12-16 18:53:26

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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wewsxupqlxu98ziuiavs.png)

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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bzvhuctf877cmmodi632.png)

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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6zqgloei3as6jmqzmlr5.png)

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:

``` sh
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
```

## **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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0fenrsb78z0fnpfujqe4.png)

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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y8bf0ueltjc2lmz5pzz8.png)

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

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jsirqv2hkkqixlzx09y5.png)

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

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6fc5v6dtxw8mnd8qf7ay.png)

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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/moqd3fqe4836s5enfjoz.png)

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
- https://aws.amazon.com/es/blogs/aws/new-accelerate-your-lambda-functions-with-lambda-snapstart/
- https://docs.aws.amazon.com/lambda/latest/dg/snapstart.html