Personalice el comportamiento de inicio del tiempo de ejecución de Java para funciones de Lambda
En esta página, se describe la configuración específica de las funciones de Java en AWS Lambda. Puede utilizar esta configuración para personalizar el comportamiento de inicio del tiempo de ejecución de Java. Esto puede reducir la latencia general de las funciones y mejorar su rendimiento general, sin tener que modificar ningún código.
Secciones
Cómo entender la variable de entorno JAVA_TOOL_OPTIONS
En Java, Lambda admite la variable de entorno JAVA_TOOL_OPTIONS para establecer variables de línea de comandos adicionales. Puede utilizar esta variable de entorno de varias maneras, como para personalizar la configuración de compilación por niveles. En el siguiente ejemplo, se muestra cómo utilizar la variable de entorno JAVA_TOOL_OPTIONS en este caso de uso.
Ejemplo: cómo personalizar la configuración de compilación por niveles
La compilación por niveles es una característica de la máquina virtual Java (JVM). Puede utilizar configuraciones específicas de compilación por niveles para aprovechar al máximo la compilación en tiempo de ejecución (JIT) de la JVM. Por lo general, el compilador C1 está optimizado para un inicio rápido. El compilador C2 está optimizado para obtener el mejor rendimiento general, pero también utiliza más memoria y tarda más en lograrlo. Hay 5 niveles diferentes de compilación por niveles. En el nivel 0, la JVM interpreta el código de bytes de Java. En el nivel 4, la JVM usa el compilador C2 para analizar los datos de creación de perfiles recopilados durante el inicio de la aplicación. Con el tiempo, monitorea el uso del código para identificar las mejores optimizaciones.
La personalización del nivel de compilación por niveles puede ayudarlo a ajustar el rendimiento de sus funciones de Java. En el caso de las funciones pequeñas que se ejecutan rápidamente, establecer la compilación por niveles en el nivel 1 puede ayudar a mejorar el rendimiento del arranque en frío al hacer que la JVM utilice el compilador C1. Esta opción produce rápidamente código nativo optimizado, pero no genera ningún dato de creación de perfiles y nunca usa el compilador C2. Para funciones más grandes y con un uso intensivo de cómputo, establecer la compilación por niveles en el nivel 4 maximiza el rendimiento general a expensas del consumo adicional de memoria y del trabajo de optimización adicional durante las primeras invocaciones después de aprovisionar cada entorno de ejecución de Lambda.
Para los tiempos de ejecución de Java 11 y versiones anteriores, Lambda usa la configuración de compilación por niveles predeterminada de la JVM. Para Java 17 y Java 21, Lambda configura la JVM para detener la compilación por niveles en el nivel 1 de forma predeterminada. A partir de Java 25, Lambda sigue deteniendo la compilación por niveles en el nivel 1 de forma predeterminada, excepto cuando se usa SnapStart o la concurrencia aprovisionada, en cuyo caso se usa la configuración predeterminada de la JVM. Esto mejora el rendimiento de SnapStart y la concurrencia aprovisionada sin incurrir en una penalización por arranque en frío, ya que, en estos casos, la compilación por niveles se realiza fuera de la ruta de invocación. Para aprovechar al máximo esta ventaja, puede utilizar las rutas de código de preparación-ejecución durante la inicialización de la función para activar el JIT antes de tomar la instantánea de SnapStart o cuando los entornos de ejecución con concurrencia aprovisionada están aprovisionados previamente. Para obtener más información, consulte la entrada del blog Optimizing cold start performance of AWS Lambda using advanced priming strategies with SnapStart
Para personalizar la configuración de compilación por niveles (consola)
-
Abra la página Funciones
en la consola de Lambda. -
Elija la función de Java para la que desea personalizar la compilación por niveles.
-
Elija la pestaña Configuración y, a continuación, elija Variables de entorno en el menú de la izquierda.
-
Elija Editar.
-
Elija Add environment variable (Añadir variable de entorno).
-
Para la clave, ingrese
JAVA_TOOL_OPTIONS. Para el valor, ingrese-XX:+TieredCompilation -XX:TieredStopAtLevel=1.
-
Seleccione Save.
nota
También puede utilizar Lambda SnapStart para mitigar los problemas de arranque en frío. SnapStart utiliza instantáneas almacenadas en caché de su entorno de ejecución para mejorar de forma significativa el rendimiento de inicio. Para obtener más información sobre las características, las limitaciones y las regiones admitidas de SnapStart, consulte Mejora del rendimiento de inicio con Lambda SnapStart.
Ejemplo: personalización del comportamiento de GC mediante JAVA_TOOL_OPTIONS
Los tiempos de ejecución de Java 11 utilizan el recopilador de elementos no utilizados (GC) en serieJAVA_TOOL_OPTIONS para cambiar el GC predeterminado. Puede elegir entre el GC en paralelo y el GC Shenandoah
Por ejemplo, si su carga de trabajo utiliza más memoria y varias CPU, considere la posibilidad de utilizar el GC en paralelo para obtener un mejor rendimiento. Para ello, agregue lo siguiente al valor de la variable de entorno JAVA_TOOL_OPTIONS:
-XX:+UseParallelGC
Si su carga de trabajo tiene muchos objetos de corta duración, puede beneficiarse de un menor consumo de memoria si habilita el modo generacional del recolector de basura Shenandoah introducido en Java 25. Para ello, agregue lo siguiente al valor de la variable de entorno JAVA_TOOL_OPTIONS:
-XX:+UseShenandoahGC -XX:ShenandoahGCMode=generational
Parche de Log4j para Log4Shell
Los tiempos de ejecución de Lambda para Java 8, 11, 17 y 21 incluyen un parche para mitigar la vulnerabilidad de Log4Shell (CVE-2021-44228) en Log4j, un popular marco de registro de Java. Este parche supone una sobrecarga de rendimiento al arrancar en frío. Si utiliza una versión parcheada de Log4j (versión 2.17.0 o posterior), puede deshabilitar este parche para mejorar el rendimiento del arranque en frío. Para deshabilitar el parche, configure la variable de entorno AWS_LAMBDA_DISABLE_CVE_2021_44228_PROTECTION en true.
A partir de Java 25, los tiempos de ejecución de Lambda ya no incluyen el parche Log4Shell. Debe comprobar que está utilizando la versión 2.17.0 o posterior de Log4j.
Cachés anticipadas (AOT) y CDS
A partir de Java 25, el entorno de ejecución de Lambda incluye una caché anticipada (AOT) para el cliente de interfaz de ejecución (RIC) de Java, un componente de tiempo de ejecución que sondea activamente los eventos de la API de tiempo de ejecución de Lambda. Esto mejora el rendimiento del arranque en frío.
Las cachés AOT son específicas de una compilación de JVM. Cuando Lambda actualiza el tiempo de ejecución administrado, también actualiza la caché AOT del RIC. Sin embargo, si implementa sus propias cachés AOT, estas pueden invalidarse o provocar un comportamiento inesperado tras una actualización del tiempo de ejecución. Por lo tanto, recomendamos encarecidamente no utilizar cachés AOT cuando se utilicen tiempos de ejecución administrados. Para usar las cachés AOT, debe implementar las funciones mediante imágenes de contenedor.
Las cachés AOT no se pueden usar con las cachés de intercambio de datos de clase (CDS). Si implementa cachés CDS en su función de Lambda, Lambda deshabilita la caché AOT.