En la publicación del blog Cómo crear, publicar y usar capas para funciones Lambda de Java 21, publicamos nuestra primera capa Lambda con Java 21. En este artículo crearemos la aplicación usando esta capa Lambda y luego mediremos el inicio en frío y en caliente. veces sin SnapStart habilitado, con SnapStart habilitado y también se aplicó la optimización de preparación de invocación de DynamoDB. También compararemos los resultados con nuestras mediciones sin usar las capas Lambda y proporcionando todas las dependencias en el archivo POM, lo cual hicimos en el artículo Medición de arranques en frío y en caliente con Java 21 usando diferentes configuraciones de memoria Lambda.
En nuestro experimento usaremos la aplicación de muestra. Básicamente, hay 2 funciones Lambda definidas en la plantilla de AWS SAM que responden a las solicitudes de API Gateway y recuperan el producto por identificación recibido de API Gateway desde DynamoDB. Una función Lambda GetProductByIdWithPureJava21LambdaWithCommonLayer se puede usar con y sin SnapStart y la segunda GetProductByIdWithPureJava21LambdaAndPrimingWithCommonLayer usa el cebado de invocación de solicitudes de SnapStart y DynamoDB.
Las dependencias proporcionadas a través de la capa Lambda tienen el alcance "proporcionado" en el archivo pom.xml de nuestra aplicación.
Para adjuntar la capa Lambda creada en el artículo Cómo crear capas de publicación y uso para funciones Lambda de Java 21 para las funciones Lambda en la plantilla de AWS SAM, tenemos que agregar el parámetro Capas a la función Lambda de esta manera:
Type: AWS::Serverless::Function Properties: FunctionName: GetProductByIdWithPureJava21LambdaWithCommonLayer AutoPublishAlias: liveVersion Layers: - !Sub arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:layer:aws-pure-java-21-common-lambda-layer:1 Handler: software.amazonaws.example.product.handler.GetProductByIdHandler::handleRequest
Reemplace el ARN de capa (incluida la versión) por uno propio, que es el resultado del comando de publicación de capa (aws lambda Publish-layer-version).
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 con un experimento que duró aproximadamente 1 hora. 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.
Ejecuté todos estos experimentos dándole a nuestras funciones Lambda 1024 MB de memoria y pasando la siguiente opción de compilación a través de la variable de entorno: JAVA_TOOL_OPTIONS: "-XX: TieredCompilation -XX:TieredStopAtLevel=1" (compilación del cliente sin creación de perfiles), lo que proporciona una muy buena compensación entre los tiempos de arranque en frío y en caliente.
En las tablas a continuación también proporcionaré los resultados de nuestras mediciones sin usar las capas Lambda tomadas del artículo Medición de arranques en frío y en caliente con Java 21 usando diferentes configuraciones de memoria Lambda para tener directamente la comparación entre ambos.
La abreviatura c es para arranque en frío y w es para arranque en caliente.
Tiempos de inicio en frío (c) y cálido (w) sin SnapStart en ms:
Experimento | c p50 | c p75 | c p90 | c p99 | cp99.9 | c máx | w p50 | w p75 | w p90 | w p99 | w p99.9 | w máx |
---|---|---|---|---|---|---|---|---|---|---|---|---|
con capa Lambda común | 3497.91 | 3597.18 | 3695.58 | 3800.47 | 3908.33 | 4011.71 | 5.82 | 6.72 | 8.00 | 17,97 | 55.48 | 1709.13 |
sin capa Lambda | 3157.6 | 3213.85 | 3270.8 | 3428.2 | 3601.12 | 3725.02 | 5.77 | 6.50 | 7.81 | 20.65 | 90.20 | 1423.63 |
Tiempos de inicio en frío (c) y cálido (w) con SnapStart sin cebado en ms:
Experimento | c p50 | c p75 | c p90 | c p99 | cp99.9 | c máx | w p50 | w p75 | w p90 | w p99 | w p99.9 | w máx |
---|---|---|---|---|---|---|---|---|---|---|---|---|
con capa Lambda común | 2047.12 | 2124.24 | 2439.49 | 2705.52 | 2735.43 | 2831.59 | 5.68 | 6.40 | 7.45 | 17.06 | 48.45 | 2139.74 |
sin capa Lambda | 1626.69 | 1741.10 | 2040.99 | 2219.75 | 2319.54 | 2321.64 | 5.64 | 6.41 | 7.87 | 21.40 | 99,81 | 1355.09 |
Horas de inicio en frío (c) y cálido (w) con SnapStart y con invocación de DynamoDB Priming en ms:
Experimento | c p50 | c p75 | c p90 | c p99 | cp99.9 | c máx | w p50 | w p75 | w p90 | w p99 | w p99.9 | w máx |
---|---|---|---|---|---|---|---|---|---|---|---|---|
con capa Lambda común | 713,88 | 766.38 | 1141,94 | 1181.41 | 1214.94 | 1215.32 | 5.59 | 6.30 | 7.39 | 16.39 | 45.09 | 574.61 |
sin capa Lambda | 702.55 | 759.52 | 1038,50 | 1169,66 | 1179.05 | 1179.36 | 5.73 | 6.51 | 7.87 | 21.75 | 92.19 | 328,41 |
En este artículo creamos la aplicación usando la capa Lambda con dependencias comunes y luego medimos los tiempos de inicio en frío y en caliente sin SnapStart habilitado, con SnapStart habilitado y también aplicamos la optimización de preparación de invocación de DynamoDB y comparamos los resultados con nuestras mediciones sin usar Lambda. capas y proporcionando todas las dependencias en el archivo POM que hicimos en el artículo Medición de arranques en frío y en caliente con Java 21 usando diferentes configuraciones de memoria Lambda.
He realizado mediciones con el uso de las capas Lambda comunes varias veces para confirmar realmente el resultado de mi experimento. Incluso si tuve algunas desviaciones en los resultados entre esas mediciones, la tendencia fue siempre la misma: cuando no habilito SnapStart o lo habilito pero no uso el cebado de la invocación de DynamoDB, el arranque en frío con el uso de Lambda común La capa era varios cientos de milisegundos más alta en comparación con empaquetar todas las dependencias solo en el archivo POM. Solo cuando se habilitó SnapStart para la función Lambda y se aplicó el cebado de invocación de DynamoDB, los arranques en frío con ambos enfoques estuvieron muy cerca, probablemente debido al hecho de que todo ya estaba en la instantánea creada.
Los inicios en caliente de la función Lambda fueron bastante similares para ambos casos de uso (con y sin el uso de las capas Lambda) y para todos los experimentos (con y sin SnapStart habilitado) para casi todos los percentiles, pero siempre obtuve resultados más altos para el valor máximo con el uso de la capa Lambda común.
En el próximo artículo continuaré mis experimentos con las capas Lambda. Esta vez crearé, publicaré y usaré la capa Lambda que contiene no solo las dependencias comunes (como en este artículo), sino también todas las dependencias necesarias para ejecutar esta aplicación y luego compararé los resultados de ambos experimentos.
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