¿Cómo afectan el lenguaje, la memoria y el tamaño del paquete los inicios en frío de AWS Lambda?

Comparación de los tiempos de inicio en frío de AWS Lambda utilizando diferentes idiomas, asignación de memoria y tamaños de paquete de implementación

esta publicación analiza el tiempo de arranque en frío entre los tiempos de ejecución de C #, Java, Python y Nodejs en AWS Lambda

En un blog reciente, examinamos la diferencia de rendimiento entre los tiempos de ejecución de los lenguajes que AWS Lambda admite de forma nativa. Como ese experimento estaba específicamente interesado en las diferencias de tiempo de ejecución de una función "cálida", los tiempos de "arranque en frío" se omitieron intencionadamente.

Se produce un inicio en frío cuando se invoca una función AWS Lambda después de no haber sido utilizada durante un período de tiempo prolongado, lo que da como resultado un aumento de la latencia de invocación.

Dado que los tiempos de inicio en frío de AWS Lambda son una consideración de rendimiento importante, echemos un vistazo más de cerca a algunos experimentos diseñados para aislar las variables que pueden afectar las invocaciones de funciones por primera vez.

Metodología de prueba

Desde mi experiencia en la ejecución de funciones de Lambda en entornos de producción, los arranques en frío suelen producirse cuando una función AWS Lambda está inactiva durante más de cinco minutos. Más recientemente, algunas de mis funciones no experimentaron un arranque en frío hasta después de 30 minutos de tiempo de inactividad. Incluso si mantiene su función caliente, se producirá un arranque en frío cada 4 horas cuando se recicla la máquina virtual del host; solo revise las medidas de IO Pipe .

Para fines de prueba, necesitaba un método confiable para garantizar constantemente el inicio en frío de una función AWS Lambda. La única forma segura de crear un arranque en frío es mediante la implementación de una nueva versión de una función antes de la invocación.

Para el experimento, creé 45 variaciones de la función AWS Lambda. Utilizando la configuración del marco de trabajo Serverless a continuación, fue fácil crear variantes de la misma función con diferentes tamaños de memoria.

Recursivamente implementé las 45 funciones e invoqué cada una de ellas programáticamente usando el sencillo script a continuación.

El ciclo de despliegue e invocación duró unos tres minutos. Para recopilar una cantidad significativa de puntos de datos, realicé el experimento durante más de 24 horas.

Mi hipótesis inicial

Basé la hipótesis en mi conocimiento de que la cantidad de recursos de la CPU es proporcional a la cantidad de memoria asignada a una función AWS Lambda.

  1. C # y Java tendrían un mayor tiempo de arranque en frío
  2. El tamaño de la memoria afecta el tiempo de inicio en frío de forma lineal
  3. El tamaño del código afecta el tiempo de inicio en frío de forma lineal

Ahora era el momento de ver si los experimentos apoyaban mi hipótesis.

Experimento 1: tiempo de arranque en frío por tiempo de ejecución y memoria

Para evaluar el impacto de la memoria en los arranques en frío, creé 20 funciones con 5 variantes, utilizando diferentes tamaños de memoria para cada idioma de ejecución. Los idiomas admitidos son C #, Java, Node.js y Python.

Creé 5 variantes de la misma función hello world (usando diferentes tamaños de memoria) para cada idioma de ejecución

Después de ejecutar el experimento durante poco más de 24 horas, recopilé los siguientes datos : estos son los resultados:

Observación: C # y Java tienen un tiempo de arranque en frío mucho más alto

La tendencia más obvia es que los lenguajes de tipo estático (C # y Java) tienen un tiempo de inicio en frío 100 veces mayor . Esto claramente apoya nuestra hipótesis, aunque en una medida mucho mayor de lo que originalmente había previsto.

Siéntase libre de jugar con el gráfico interactivo plot.ly aquí

Observación: Python tiene un tiempo de arranque en frío ridículamente bajo

Estoy gratamente sorprendido por el poco frío que experimenta el tiempo de ejecución de Python. OK, hubo algunos puntos de datos atípicos que influyeron fuertemente en algunas de las desviaciones típicas y percentiles 99, pero no se puede discutir con un tiempo de inicio en frío de 0.41ms en el percentil 95 de una función de 128MB.

Observación: el tamaño de la memoria mejora el tiempo de arranque en frío linealmente

Cuanta más memoria se asigne a su función, menor será el tiempo de arranque en frío, y la menor desviación estándar. Esto es más obvio con los tiempos de ejecución de C # y Java ya que el tiempo de arranque en frío de referencia (128 MB) para ambos es muy significativo.

Hasta ahora, los datos del primer experimento apoyan la hipótesis inicial.

Experimento 2: tiempo de inicio en frío por tamaño de código y memoria

Para evaluar el impacto de la memoria y el tamaño del paquete en arranques en frío, creé 25 funciones con varios códigos y tamaños de memoria. Node.js fue el lenguaje constante para este experimento.

Aquí están los resultados de este experimento:

Observación: el tamaño de la memoria mejora el tiempo de arranque en frío linealmente

Al igual que con el primer experimento, el tamaño de la memoria mejora el tiempo de inicio en frío y la desviación estándar de una manera aproximadamente lineal.

Observación n. ° 2: el tamaño del código mejora el tiempo de arranque en frío

Curiosamente, el tamaño del paquete de implementación no aumenta el tiempo de arranque en frío. Hubiera supuesto que el paquete más grande equivaldría a más tiempo para descargar y descomprimir. En cambio, un paquete de implementación más grande parece tener un efecto positivo en la disminución del tiempo total de arranque en frío.

Para ver si el comportamiento es consistente, me encantaría que alguien más repita este experimento usando un tiempo de ejecución de idioma diferente. El código fuente utilizado para estos experimentos se puede encontrar aquí , incluidos los scripts utilizados para calcular las estadísticas y generar gráficos de cuadro plot.ly.

theburningmonk / lambda-coldstart-comparison
lambda-coldstart-comparison – Comparando el tiempo de arranque en frío de las funciones de AWS Lambda usando una variedad de tiempos de ejecución del lenguaje … github.com

Conclusiones

Aquí hay algunas cosas que aprendí de estos experimentos:

  • las funciones ya no se reciclan después de ~ 5 minutos de inactividad, lo que hace que el arranque en frío sea mucho menos castigador que antes
  • el tamaño de la memoria mejora el tiempo de arranque en frío linealmente
  • Los tiempos de ejecución C # y Java experimentan ~ 100 veces el tiempo de inicio en frío de Python y también sufren una desviación estándar mucho más alta
  • debería considerar ejecutar sus funciones C # / Java Lambda con una asignación de memoria más alta que las funciones Node.js / Python
  • El tamaño más grande del paquete de implementación no aumenta el tiempo de arranque en frío

actualización 04/07/2017 : Publiqué un experimento de seguimiento para averiguar cuánto tiempo Lambda mantiene las funciones inactivas antes de reciclarlas.

¿Por cuánto tiempo AWS Lambda mantiene sus funciones inactivas antes de un arranque en frío?
Usando AWS Step Function para encontrar el tiempo más largo que su función AWS Lambda puede estar inactiva antes de reclamar los recursos read.acloud.guru

Texto original en inglés.