Nota:
- Este tutorial está disponible en un entorno de laboratorio gratuito proporcionado por Oracle.
- Utiliza valores de ejemplo para las credenciales, el arrendamiento y los compartimentos de Oracle Cloud Infrastructure. Al finalizar el laboratorio, sustituya estos valores por otros específicos de su entorno en la nube.
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:
- Incluir una sola referencia en cada ejecutable nativo
- Anote la referencia con
@Fork(0)
para asegurarse de que la referencia no está bifurcada- Si desea perfilar la referencia para generar una referencia optimizada, obviamente, ignore los resultados de la referencia mientras crea perfiles
Nota: Oracle Cloud Infrastructure (OCI) proporciona GraalVM Enterprise sin costo adicional.
Objetivos del laboratorio
En este laboratorio:
- Conectarse a un host remoto en Oracle Cloud
- Compilar y ejecutar una referencia de JMH en JVM
- Cree esta referencia de JMH en un ejecutable nativo mediante GraalVM Native Image y ejecútela
- Optimizar la versión ejecutable nativa con PGO y ejecutarla
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.
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.
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:
- Cerrar código VS
- Haga clic dos veces en el icono "Luna-Lab.html" en el escritorio
- Copie la opción "Configurar script" del separador Recursos y péguela de nuevo en el terminal de escritorio Luna
- Repita las instrucciones anteriores para conectarse al entorno de desarrollo remoto.
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.
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.
-
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, denominadobenchmark-binary-tree
. -
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.
-
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
. -
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 herramientanative-image
en el momento de la creación. -
Ahora que ha generado el archivo de perfil, cree la versión optimizada:
mvn package -Poptimized
Genera un binario optimizado en el directorio
target
, denominadobenchmark-binary-tree-opt
. -
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.
Optimize Cloud Native Java Applications with GraalVM Enterprise PGO
F75977-01
January 2023
Copyright © 2023, Oracle and/or its affiliates.