En las partes anteriores de nuestra serie, medimos los inicios en frío de la función Lambda con el tiempo de ejecución de Java 21 sin SnapStart habilitado, con SnapStart habilitado y también aplicamos la optimización de preparación de invocación de DynamoDB con diferentes configuraciones de memoria Lambda, tamaños de artefactos de implementación de Lambda, Java opciones de compilación, (a) clientes HTTP sincrónicos y el uso de diferentes capas Lambda. Para todas estas mediciones utilizamos los algoritmos predeterminados de recolección de basura G1.
En este artículo nos gustaría explorar el impacto de los algoritmos de recolección de basura de Java en el rendimiento de la función Lambda con el tiempo de ejecución de Java 21. También volveremos a medir todo para que el G1 tenga resultados comparables con la misma versión menor de Java 21 en uso para todos los algoritmos de recolección de basura.
Para nuestras mediciones usaremos los siguientes algoritmos de recopilación de Java con su configuración predeterminada (consulte la documentación vinculada para obtener información más detallada sobre cada algoritmo):
En nuestro experimento usaremos una aplicación ligeramente modificada introducida en la parte 9. Puede encontrar el código de la aplicación aquí. Básicamente, existen 2 funciones Lambda 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 GetProductByIdWithPureJava21LambdaWithGCAlg se puede usar con y sin SnapStart y la segunda GetProductByIdWithPureJava21LambdaAndPrimingWithGCAlg usa el cebado de invocación de solicitudes de SnapStart y DynamoDB.
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. Realizamos experimentos dándole a las funciones Lambda 1024 MB de memoria y usando JAVA_TOOL_OPTIONS: "-XX: TieredCompilation -XX:TieredStopAtLevel=1" (compilación del cliente Java sin creación de perfiles), que tiene una muy buena compensación entre tiempos de inicio en frío y en caliente.
Desafortunadamente no pude hacer que la función Lambda se iniciara con The Z Garbage Collector (con el predeterminado y el generacional) y me encontré con el error:
Failed to commit memory (Operation not permitted) [error][gc] Forced to lower max Java heap size from 872M(100%) to 0M(0%) [error][gc] Failed to allocate initial Java heap (512M) Error: Could not create the Java Virtual Machine. Error: A fatal exception has occurred. Program will exit.
Probó una configuración de memoria más grande, como 1024 o 2048 MB, e incluso más MB, pero aún aparecía el mismo error.
Veamos los resultados de nuestras mediciones con otros 3 algoritmos de recolección de basura.
Abreviatura c es para arranque en frío y w es para arranque en caliente.
Hora de inicio en frío (c) y caliente (w) sin SnapStart habilitado en ms:
Algoritmo GC | cp50 | 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 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
G1 | 3655.17 | 3725.25 | 3811.88 | 4019.25 | 4027.30 | 4027.83 | 5.46 | 6.10 | 7.10 | 16.79 | 48.06 | 1929.79 |
Coleccionista paralelo | 3714.10 | 3789.09 | 3857.87 | 3959.44 | 4075.89 | 4078.25 | 5.55 | 6.20 | 7.10 | 15.38 | 130.13 | 2017.92 |
Shenandoah | 3963.40 | 4019.25 | 4096.30 | 4221.00 | 4388.78 | 4390.76 | 5.82 | 6.45 | 7.39 | 17.06 | 71.02 | 2159.21 |
Hora de inicio en frío (c) y caliente (w) con SnapStart habilitado sin cebado en ms:
Algoritmo GC | cp50 | 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 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
G1 | 1867.27 | 1935.68 | 2152.02 | 2416.57 | 2426.25 | 2427.35 | 5.47 | 6.11 | 7.05 | 17.41 | 51.24 | 1522.04 |
Coleccionista paralelo | 1990.62 | 2047.12 | 2202.07 | 2402.12 | 2418.99 | 2419.32 | 5.68 | 6.35 | 7.45 | 18.04 | 147,83 | 1577.21 |
Shenandoah | 2195.47 | 2301.07 | 2563.37 | 3004.89 | 3029.01 | 3030.36 | 5.73 | 6.41 | 7.51 | 17,97 | 75.00 | 1843.34 |
Hora de inicio en frío (c) y cálido (w) con SnapStart habilitado y con invocación de DynamoDB Priming en ms:
Algoritmo GC | cp50 | 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 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
G1 | 833.50 | 875.34 | 1089,53 | 1205.26 | 1269,56 | 1269,8 | 5.46 | 6.10 | 7.16 | 16.39 | 46.19 | 499.13 |
Coleccionista paralelo | 900.18 | 975.12 | 1058.41 | 1141,94 | 1253.17 | 1253,99 | 5.82 | 6.61 | 7.75 | 16.87 | 49,64 | 487,73 |
Shenandoah | 1065,84 | 1131.71 | 1331,96 | 1473.44 | 1553.59 | 1554.95 | 5.77 | 6.40 | 7.39 | 17.20 | 65.06 | 500.48 |
En este artículo exploramos el impacto de los algoritmos de recolección de basura de Java (G1, Parallel Collector y Shenandoah) en el rendimiento de la función Lambda con el tiempo de ejecución de Java 21. Vimos una gran diferencia entre el rendimiento de esos algoritmos. Usando la configuración predeterminada con G1 (la predeterminada), experimentamos (a veces con diferencia) los tiempos de arranque en frío y en caliente más bajos. Al utilizar SnapStart con la preparación de la solicitud de DynamoDB, los resultados de rendimiento son, como se esperaba, mucho más cercanos entre sí.
Consulte la documentación de cada algoritmo de recolección de basura para ajustar configuraciones como la mezcla y la memoria máxima, lo que puede proporcionar una mejora significativa en el rendimiento y realizar sus propias mediciones.
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