"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > AWS SnapStart: parte Medición de arranques en frío y en caliente con Java utilizando diferentes algoritmos de recolección de basura

AWS SnapStart: parte Medición de arranques en frío y en caliente con Java utilizando diferentes algoritmos de recolección de basura

Publicado el 2024-11-01
Navegar:118

AWS SnapStart - Part Measuring cold and warm starts with Java using different garbage collection algorithms

Introducción

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.

Algoritmos de recolección de basura de Java

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):

  • Recolector de basura Garbage-First (G1). Este es el algoritmo de recolección de basura utilizado por defecto. Puede configurarlo explícitamente en la plantilla de AWS SAM agregando -XX: UseG1GC a la variable de entorno JAVA_TOOL_OPTIONS.
  • El coleccionista paralelo. Puede configurarlo explícitamente en la plantilla de AWS SAM agregando -XX: UseParallelGC a la variable de entorno JAVA_TOOL_OPTIONS.
  • Shenandoah GC. Oracle JDK no lo proporciona, pero Amazon Corretto 21 JDK sí. Puede configurarlo explícitamente en la plantilla de AWS SAM agregando -XX: UseShenandoahGC a la variable de entorno JAVA_TOOL_OPTIONS.
  • El recolector de basura Z. Hay dos algoritmos ZGC diferentes: el predeterminado y el más nuevo, unigeneracional. Puede configurarlo explícitamente en la plantilla de AWS SAM agregando -XX: UseZGC o -XX: UseZGC -XX: ZGenerational a la variable de entorno JAVA_TOOL_OPTIONS.

Medición de arranques fríos y cálidos con Java 21 utilizando diferentes algoritmos de recolección de basura

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

Conclusión

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.

Declaración de liberación Este artículo se reproduce en: https://dev.to/aws-builders/aws-snapstart-part-26-measuring-cold-and-warm-starts-with-java-21-using- Different-garbage-collection- algoritmos- 8h3?1 Si hay alguna infracción, comuníquese con [email protected] para eliminarla.
Último tutorial Más>

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