Nota:

Optimice las aplicaciones Java nativas en la nube con GraalVM Enterprise PGO

Introducción

En este laboratorio se muestra cómo ejecutar una referencia de Java Microbenchmark Harness (JMH) como ejecutable nativo, creada con GraalVM Native Image y aplicar la optimización guiada por perfiles (PGO) para mejorar el rendimiento.

GraalVM Native Image permite compilar una aplicación Java en un ejecutable nativo que se inicia casi instantáneamente, requiere menos memoria y CPU.

Profile-Guided Optimization (PGO) es una técnica de uso común en el ecosistema Java para mitigar la falta de optimización justo a tiempo y recopilar los perfiles de ejecución en una sola ejecución y, a continuación, utilizarlos para optimizar las compilaciones posteriores. Con PGO puede recopilar los datos de creación de perfiles y, a continuación, alimentarlos a la herramienta native-image, que utilizará esta información para optimizar aún más el rendimiento del ejecutable resultante.

Notas sobre el uso de JMH con la imagen nativa GraalVM

Cuando se ejecuta en JVM, JMH bifurcará una nueva JVM para cada referencia a fin de garantizar que no haya ninguna interferencia en las mediciones para cada referencia. Este enfoque no es posible al utilizar la imagen nativa GraalVM, por lo que debe tener en cuenta la siguiente orientación al crear referencias de JMH que se van a ejecutar como ejecutables nativos:

Nota: Oracle Cloud Infrastructure (OCI) proporciona GraalVM Enterprise sin costo adicional.

Objetivos del laboratorio

En este laboratorio:

Tiempo de laboratorio estimado: 30-45 minutos

NOTA: si ve el icono del portátil en las instrucciones, significa que debe introducir un comando. Mantenga un ojo por ello.

# This is where we you will need to do something

Para copiar un comando, desplácese sobre el campo y, a continuación, haga clic en el icono Copiar al portapapeles.

Para pegar un comando copiado en una ventana de terminal, haga clic con el botón derecho y seleccione la opción Pegar en el menú contextual. Si prefiere los métodos abreviados del teclado, utilice CTRL+SHIFT+V.

PASO 1: Conexión a un host remoto y comprobación del entorno de desarrollo

Su entorno de desarrollo lo proporciona un host remoto: una instancia informática de OCI con Oracle Linux 8, 4 CPU y 32 GB de memoria.

El entorno de escritorio se mostrará antes de que el host remoto esté listo, lo que puede tardar hasta dos minutos.

Visual Studio Code (código VS) se abrirá y se conectará automáticamente a la instancia de VM que se le ha aprovisionado. Haga clic en Continuar para aceptar la huella del equipo.

Aceptación de código de VS

Si no hace clic en Continuar, VS Code mostrará un cuadro de diálogo emergente que se muestra a continuación. Haga clic en Realizar. VS Code le pedirá que acepte la huella de la máquina. Haga clic en Continuar.

Conexión de reintento de código de VS

Problemas relacionados con la conexión al entorno de desarrollo remoto

Si encuentra otros problemas en los que VS Code no puede conectarse al entorno de desarrollo remoto que no se tratan anteriormente, intente lo siguiente:

Enhorabuena. Ya está conectado a un host remoto en Oracle Cloud.

La secuencia de comandos abrirá VS Code, conectado al host remoto, con el código fuente para la práctica abierta.

A continuación, abra un terminal dentro de VS Code. El terminal le permite interactuar con el host remoto. Un terminal se puede abrir en VS Code mediante el menú: Terminal > New Terminal, como se muestra a continuación.

Terminal de código de VS

Nota sobre el entorno de desarrollo

Utilizará GraalVM Enterprise como entorno de tiempo de ejecución de Java para este ejercicio práctico. GraalVM es una distribución de JDK de alto rendimiento de Oracle basada en Oracle Java SE.
El entorno de desarrollo viene preconfigurado con las herramientas GraalVM Enterprise y Native Image necesarias para este laboratorio. Puede comprobarlo ejecutando estos comandos en el terminal:

java -version

native-image --version

Puede continuar con el siguiente paso.

PASO 2: compilación y ejecución de una referencia de JMH en JVM

El código fuente de la aplicación (referencia de JMH) está disponible en el host remoto. La referencia de JMH se origina en el juego de referencias de idioma del equipo. Crea árboles binarios, antes de que se recopile la basura de cualquier nodo de árbol, utilizando como mínimo el número de asignaciones.

Esta referencia de JMH utiliza la reflexión de Java. La herramienta native-image funciona bajo lo que se conoce como la suposición de "mundo cerrado", y no incluirá ningún elemento al que se acceda de forma reflexiva en el ejecutable nativo, a menos que la herramienta tenga la configuración necesaria en el momento de la creación. Por lo tanto, para crear un ejecutable nativo de esta referencia de JMH, debe ejecutar el agente de rastreo para proporcionar la configuración de reflejo a native-image. Esto ya se ha hecho para ahorrar tiempo y la configuración generada se puede encontrar en src/main/resources/META-INF/native-image/. Para obtener más información sobre la configuración de reflejo, consulte Luna Lab en GraalVM Native Image and Reflection.

Cree y ejecute la referencia como una aplicación Java, ejecutando el siguiente comando:

mvn clean package exec:exec

Tenga en cuenta que en el archivo pom.xml hay instrucciones para desactivar explícitamente el compilador JIT GraalVM mediante la opción -XX:-UseJVMCICompiler. Esto significa que la referencia se ejecutará con el compilador JIT C2.

La aplicación ejecutará la referencia en tres iteraciones y mostrará los resultados en el terminal. La ejecución debe tardar menos de cuatro minutos en completarse. El resultado final es el más significativo. Verá algo similar a lo siguiente:

Benchmark          (binaryTreesN)   Mode  Cnt    Score   Error  Units
BinaryTrees.bench              14  thrpt    3  180.819 ± 8.301  ops/s

Ahora puede continuar con el siguiente paso.

PASO 3: Creación y ejecución de una referencia de JMH como ejecutable nativo

Ahora cree un ejecutable nativo con GraalVM Enterprise Native Image.

La referencia de JMH se crea con Maven y aplica el plugin de Maven para la creación de GraalVM Native Image (abra pom.xml para ver el registro del plugin native-maven-plugin). El plugin muestra qué archivo JAR necesita transferir a native-image y cuál debe ser la clase principal ejecutable.

  1. Crear un ejecutable nativo. La compilación debe tardar aproximadamente un minuto:

    mvn package -Pnative
    

    El perfil de Maven -Pnative activa la creación de un ejecutable nativo. Generará un ejecutable nativo en el directorio target, denominado benchmark-binary-tree.

  2. A continuación, ejecute la referencia como ejecutable nativo:

    ./target/benchmark-binary-tree
    

    Estos son los resultados obtenidos con GraalVM Enterprise Native Image 22.2.0:

    Benchmark          (binaryTreesN)   Mode  Cnt    Score    Error  Units
    BinaryTrees.bench              14  thrpt    3  174.135 ± 10.020  ops/s
    

    Los números ejecutables nativos pueden ser similares o mejores en comparación con la opción anterior (no nativa). Los resultados variarán en función del hardware en el que ejecute la misma referencia.

Ahora puede continuar con el siguiente paso.

PASO 4: optimización de un ejecutable nativo con PGO y ejecución

Ahora optimice el ejecutable nativo mediante Optimización guiada por perfil (PGO). Es un proceso de dos pasos. En primer lugar, cree una versión instrumentada del ejecutable nativo y ejecútelo para rastrear su ejecución y recopilar un perfil de rendimiento. Cuando finalice la ejecución, se generará un archivo de perfil, default.iprof, en el directorio raíz del proyecto. A continuación, cree un ejecutable optimizado que contenga los datos de perfil sobre la referencia y ejecútelo.

La función Optimización guiada de perfil (PGO) está disponible con GraalVM Enterprise Edition.

  1. Cree un ejecutable nativo instrumentado transfiriendo el perfil de Maven -Pinstrumented:

    mvn package -Pinstrumented
    

    Genera un binario en el directorio target, denominado benchmark-binary-tree-instr.

  2. Ejecútelo para recopilar los perfiles de frecuencia de ejecución de código:

    ./target/benchmark-binary-tree-instr
    

    Los perfiles recopilados de esta ejecución se almacenan en el archivo default.iprof del directorio de trabajo actual, si no se especifica nada más.

    Nota: Puede especificar dónde recopilar los perfiles al ejecutar un ejecutable nativo instrumentado transfiriendo la opción -XX:ProfilesDumpFile=YourFileName en tiempo de ejecución. También puede recopilar varios archivos de perfil especificando diferentes nombres y transferirlos a la herramienta native-image en el momento de la creación.

  3. Ahora que ha generado el archivo de perfil, cree la versión optimizada:

    mvn package -Poptimized
    

    Genera un binario optimizado en el directorio target, denominado benchmark-binary-tree-opt.

  4. Por último, ejecute el ejecutable nativo optimizado:

    ./target/benchmark-binary-tree-opt
    

Estos son los resultados obtenidos con GraalVM Enterprise Native Image 22.2.0 en la máquina host:

Benchmark          (binaryTreesN)   Mode  Cnt    Score   Error  Units
BinaryTrees.bench              14  thrpt    3  223.241 ± 3.578  ops/s

La puntuación media de operaciones por segundo aumentó de 180 en ejecución como aplicación Java a 223 en ejecución como ejecutable nativo optimizado. Los resultados variarán en función del hardware en el que ejecute la misma referencia.

Resumen

En este laboratorio se muestra cómo puede optimizar los ejecutables nativos con la optimización guiada por perfiles (PGO) para obtener un mayor rendimiento en comparación con la versión de Java y, al mismo tiempo, conservar otras ventajas: inicio instantáneo, menor uso de CPU y memoria. Con PGO puede "entrenar" su aplicación para cargas de trabajo específicas y transformarla en un binario optimizado sin sacrificar ningún rendimiento.

Más información

Felicidades. Ha finalizado correctamente esta práctica.

Más recursos de aprendizaje

Explore otros laboratorios en docs.oracle.com/learn o acceda a más contenido de aprendizaje gratuito en el canal YouTube de Oracle Learning. Además, visite education.oracle.com/learning-explorer para convertirse en un explorador de Oracle Learning.

Para obtener documentación sobre los productos, visite Oracle Help Center.