Hasta ahora no he medido el rendimiento (tiempos de inicio en caliente y en frío) de las funciones Lambda usando el tiempo de ejecución de Java 21 para algunos casos de uso (como realizar solicitudes de DynamoDB) para la arquitectura arm64 porque no es compatible con SnapStart. Lambda con el tiempo de ejecución de Java 21 con arquitectura x86_64 con SnapStart habilitado superará (aún más con optimización de preparación adicional) a Lambda con arquitectura arm64. Pero el 18 de julio de 2024, AWS anunció que AWS Lambda ahora admite funciones SnapStart para Java que utilizan la arquitectura ARM64. Así que ahora tenía sentido para mí comenzar a medir los tiempos de arranque en frío y en caliente, considerando también la elección de la arquitectura de la función Lambda. Se sabe que con la configuración actual de la memoria de precios de AWS Lambda y la duración de ejecución, Lambda con arquitectura arm64 será de aprox. 25% más barato que Lambda con arquitectura x86_64.
Decidí crear una serie de artículos separada y no agregar este tema a mi serie cada vez mayor de AWS Lambda SnapStart.
En nuestro experimento reutilizaremos la aplicación presentada en el artículo AWS Lambda SnapStart: medición de arranques en frío de Java 21 Lambda. Aquí está el código de la aplicación de muestra. Básicamente, existen 2 funciones Lambda principales que responden a las solicitudes de API Gateway para crear el producto con la identificación dada (consulte la función Lambda PutProductFunction) y recuperan el producto mediante la identificación dada (consulte la función Lambda GetProductByIdFunction). Puede utilizar ambas funciones Lambda con y sin SnapStart habilitado. Hay una función Lambda adicional GetProductByIdWithPrimingFunction que escribí para medir de forma independiente el efecto del cebado de solicitudes de DynamoDB para la función Lambda habilitada para SnapStart. Puede leer más sobre el efecto del cebado en mi artículo AWS Lambda SnapStart: medición del cebado, la latencia de extremo a extremo y el tiempo de implementación.
Para habilitar SnapStart en todas las funciones de Lambda, descomente lo siguiente en la plantilla SAM:
Globals: Function: CodeUri: target/aws-pure-lambda-snap-start-21-1.0.0-SNAPSHOT.jar ... SnapStart: ApplyOn: PublishedVersions ...
Si deseo usar SnapStart solo para las funciones Lambda individuales, pero no para todas, debe aplicar esta definición de SnapStart en el nivel de función Lambda en lugar del nivel de función global.
Todas las funciones Lambda tienen las siguientes configuraciones como punto de partida:
En la plantilla SAM agregué la posibilidad de definir la arquitectura Lambda en la sección de función Lambda global como:
Globals: Function: CodeUri: target/aws-pure-lambda-snap-start-21-1.0.0-SNAPSHOT.jar ... Architectures: #- arm64 - x86_64
Simplemente descomente la arquitectura que le gustaría usar para sus funciones Lambda.
Incluso si Java es "escribir una vez, ejecutar en todas partes", de todos modos compilé y construí el archivo jar de la aplicación para mis mediciones arm64 en la instancia t4g AWS EC2 con el procesador Graviton (que se basa en la arquitectura arm64/aarch64) instalando previamente Amazon Corretto 21 para Linux aarch64. Puedes encontrar este frasco aquí.
También volví a medir todo para la arquitectura x86_64 una vez más para obtener resultados comparables usando la misma última versión de tiempo de ejecución de Corretto Java 21 que en el momento de mis mediciones era Java 21.v17.
Los resultados del siguiente experimento se basaron en la reproducción de más de 100 arranques en frío y aproximadamente 100.000 en caliente. Para ello (y para los experimentos de mi artículo anterior) utilicé la herramienta de prueba de carga, pero puedes usar cualquier herramienta que quieras, como Serverless-artillery o Postman. También es importante tener en cuenta que comencé las mediciones justo después de la (re)implementación del nuevo código fuente de la aplicación. Tenga en cuenta que también existe un impacto de la caché escalonada de instantáneas en los arranques en frío, donde las primeras invocaciones son generalmente más lentas y las siguientes se vuelven más rápidas hasta que se alcanza una cierta cantidad de invocaciones.
Ahora juntemos todas las mediciones para "obtener producto mediante identificación existente" (funciones Lambda GetProductByIdFunction y GetProductByIdWithPrimingFunction para SnapStart habilitado y mediciones de cebado).
Hora de inicio en frío (c) y calor (m) en ms:
Acercarse | c p50 | c p75 | c p90 | c p99 | c p99.9 | c máx | w p50 | w p75 | w p90 | w p99 | w p99.9 | w máx |
---|---|---|---|---|---|---|---|---|---|---|---|---|
x86_64, no hay SnapStart habilitado | 3554.30 | 3615.21 | 3666.15 | 3800.47 | 4108.61 | 4111.78 | 5.42 | 6.01 | 6.88 | 14.09 | 40,98 | 1654.59 |
arm64, no hay SnapStart habilitado | 3834.81 | 3904.42 | 3983.26 | 4047.47 | 4332.13 | 4335.74 | 5.96 | 6.66 | 7.69 | 16.01 | 43,68 | 1844.54 |
x86_64, SnapStart habilitado sin cebado | 1794.09 | 1846.86 | 2090.54 | 2204.27 | 2239.80 | 2240.08 | 5.37 | 5.96 | 6.93 | 15.88 | 51,64 | 1578.34 |
arm64, SnapStart habilitado sin cebado | 1845.01 | 1953.18 | 2591.70 | 2762.91 | 2793.45 | 2795.8 | 5.91 | 6.56 | 7.63 | 16.75 | 63,52 | 1779.14 |
x86_64, SnapStart habilitado con preparación de solicitudes de DynamoDB | 803.18 | 870.18 | 1103.78 | 1258.19 | 1439,95 | 1440.67 | 5.55 | 6.25 | 7.45 | 15.50 | 63,52 | 448,85 |
arm64, SnapStart habilitado con preparación de solicitudes de DynamoDB | 910.14 | 1001.79 | 1376.62 | 1623.44 | 1684.60 | 1686.19 | 6.05 | 6.72 | 7.81 | 16.66 | 74,68 | 550.59 |
En este artículo comparamos las mediciones de los tiempos de inicio en frío y en caliente de la función Lambda que se conecta a la base de datos de DynamoDB para 3 casos de uso:
Vimos que al usar la arquitectura x86_64, todos los tiempos de inicio en frío y en caliente eran menores en comparación con la arquitectura arm64. Pero como el precio Lambda de la arquitectura arm64 es un 25% más barato que el de la arquitectura x86_64, introduce una compensación costo-rendimiento muy interesante.
Para nuestras mediciones, para los 3 casos de uso:
Por lo tanto, la elección de la arquitectura arm64 es bastante razonable para esta aplicación de muestra. Como la compatibilidad con SnapStart para la arquitectura arm64 se introdujo recientemente, también espero algunas mejoras de rendimiento en el futuro. ¡Haga sus propias medidas para su caso de uso!
En la siguiente parte del artículo haremos las mismas mediciones de rendimiento pero configurando la memoria Lambda en diferentes valores entre 256 y 2048 MB y compararemos los resultados.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3