Nota:

Acelere las aplicaciones en Oracle Cloud con GraalVM Enterprise

Introducción

GraalVM Enterprise es una distribución de JDK de alto rendimiento, basada en Oracle Java SE seguro y de confianza, que proporciona mejoras significativas en la ejecución y eficiencia de las aplicaciones.

GraalVM Enterprise se incluye en Oracle Java SE Subscription y está disponible sin costo en Oracle Cloud Infrastructure (OCI)

GraalVM Enterprise ofrece dos formas de ejecutar aplicaciones Java: en JVM HotSpot o como ejecutable nativo compilado previo. Cuando se ejecuta en JVM HotSpot, GraalVM Enterprise emplea el compilador de Graal como compilador JIT de nivel superior. El compilador realiza una optimización avanzada y aplica técnicas en línea agresivas para acelerar el rendimiento de cualquier aplicación, sin ningún cambio de código. La ejecución como una instancia nativa ejecutable de GraalVM Enterprise utiliza Native Image para transformar una aplicación Java en un ejecutable nativo independiente que no necesita que se ejecute una JVM, se inicie instantáneamente y proporcione un rendimiento máximo sin tiempo de calentamiento.

En este laboratorio, ejecutará proyectos de demostración en una JVM y como ejecutables nativos para comparar el rendimiento y ver cómo GraalVM Enterprise puede acelerar las aplicaciones en OCI. Las aplicaciones más rápidas con menores requisitos de recursos se traducen en menos servidores o en menos servidores, lo que reduce los costos en la nube.

Contenido del laboratorio

En este laboratorio:

Tiempo de laboratorio estimado: 30 minutos

NOTA: Siempre que vea el icono de portátil, deberá realizar una acción, como introducir un comando o editar un archivo.

# The box under the icon will tell you what to do.

Para copiar un comando, pase el cursor sobre el campo y, a continuación, haga clic en el ícono de copia en el portapapeles.

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

Tarea 1: Conectarse a una instancia de VM en Oracle Cloud

Al iniciar el laboratorio, se aprovisionan los recursos necesarios en segundo plano: red virtual en la nube (VCN), instancia informática con la imagen incorporada de Oracle Linux 8. El aprovisionamiento de recursos también incluye la instalación y configuración del entorno de tiempo de ejecución de GraalVM Enterprise con Native Image para mantener este laboratorio conciso y ahorrar tiempo. El aprovisionamiento puede tardar unos 5 minutos en realizarse. Puede saber cuándo están totalmente aprovisionados y listos los recursos consultando el separador Recursos de la página web Luna Lab (consulte el paso 1, a continuación).

  1. Haga doble clic en el icono Luna Lab en el escritorio para abrir el explorador.

    Espere hasta que el engranaje animado, además de los recursos, se convierta en una marca de verificación. Esto significa que se aprovisionan todos los recursos informáticos y de red necesarios y puede continuar.

  2. Haga clic en el separador Recursos de la página Laboratorio de Luna. En la página Recursos se muestra el nombre y la dirección IP pública de una instancia de VM aprovisionada por usted.

  3. Copie la dirección IP pública del cuadro SERVER_IP. Es necesario hacer clic en View Details. Para copiar, pase el cursor sobre el campo y, a continuación, haga clic en el icono Copiar al portapapeles.

  4. Minimice la ventana del explorador para que pueda ver Luna Desktop. Haga clic en el menú Aplicaciones y abra un emulador de terminal.

  5. Introduzca el comando de conexión SSH donde es la dirección IP pública de la instancia de VM:

    ssh opc@<SERVER_IP>
    

    Acepte la huella de la clave ECDSA escribiendo yes en la petición de datos.

Ahora está conectado a una instancia de VM en Oracle Cloud. Su instancia de VM ya está preconfigurada con GraalVM Enterprise y las herramientas de Native Image necesarias para este laboratorio. Puede comprobar fácilmente si ejecuta estos comandos:

java -version

native-image --version

Si desea aprender a instalar GraalVM Enterprise y sus funciones en Oracle Linux, ejecute el laboratorio Introducción a GraalVM en Oracle Linux cuando finalice este laboratorio.

Puede continuar con la siguiente tarea.

Tarea 2: ejecutar demostraciones: plantilla de Microbenchmark (JMH) de Java

En esta parte, ejecutará una referencia de Java para comparar el rendimiento del compilador en modo JIT de GraalVM Enterprise con el compilador en modo JIT de C2. El compilador Graal, activado por defecto en GraalVM Enterprise, proporciona rendimiento optimizado para programas que se ejecutan en JVM mediante enfoques únicos para el análisis de código, optimizaciones avanzadas y realiza un algoritmo de línea de comandos muy agresivo para jerarquías de clase profunda y amplia.

La referencia que va a ejecutar se escribe con Java Microbenchmark Harness (JMH) y utiliza Java Stream API. Ilustra el análisis en línea y de escape parcial que el compilador realiza conjuntamente, lo que explica las mejoras de rendimiento significativas en tiempo de ejecución.

El código de origen de demostración está disponible en el directorio java-simple-stream-benchmark.

El microbenchmark crea un flujo a partir de elementos de matriz y asigna cada número mediante varias funciones de asignación:

public class JavaSimpleStreamBenchmark {

  static int[] values = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

  @Benchmark
  public int testMethod() {
    return Arrays.stream(values)
      .map(x -> x + 1)
      .map(x -> x * 2)
      .map(x -> x + 2)
      .reduce(0, Integer::sum);
  }
}

JavaSimpleStreamBenchmark.testMethod se ejecuta con 3 iteraciones para permitir que el compilador JIT se calcule antes de muestrear el rendimiento. Los resultados de referencia se imprimen en la consola y se encuentran en nanosegundos por operación, lo que significa que los números más bajos son mejores.

  1. En la ventana de terminal conectada a la instancia de VM, vaya al directorio de demostración:

    cd java-simple-stream-benchmark
    
  2. El proyecto de referencia se crea con Maven, pero no incluye un envoltorio de Maven (.mvnw) y Oracle Linux no incluye Maven por defecto. Instale Maven con yum:

    sudo yum install maven
    
  3. Crear el proyecto:

    mvn package
    
  4. Ejecute la referencia con el compilador en modo JIT de GraalVM Enterprise:

    java -jar target/benchmarks.jar
    

    Al llamar al comando java, se utiliza el compilador JIT de Graal optimizado activado en GraalVM Enterprise de forma predeterminada.

  5. Ejecute la referencia en la misma JVM (GraalVM Enterprise), pero utilice el compilador C2 en lugar del compilador de Graal aplicando la opción -XX:-UseJVMCICompiler:

    java -XX:-UseJVMCICompiler -jar target/benchmarks.jar
    

Compare los resultados de la referencia después de completar los pasos 4-5. Por supuesto, los resultados dependerán del número de procesadores y la memoria de la instancia de VM. A continuación se muestran los números tomados en una instancia informática con la unidad VM.Standard.2-2 y 30 GB de memoria:

Compilador JIT de Graal:

[opc@demo-instance java-simple-stream-benchmark]$ java -jar target/benchmarks.jar
...
Benchmark                             Mode  Cnt   Score    Error  Units
JavaSimpleStreamBenchmark.testMethod  avgt    3  53.474 ? 1236.199  ns/op

Compilador JIT de C2:

[opc@demo-instance java-simple-stream-benchmark]$ java -XX:-UseJVMCICompiler -jar target/benchmarks.jar
...
Benchmark                             Mode  Cnt    Score    Error  Units
JavaSimpleStreamBenchmark.testMethod  avgt    3  361.844 ? 37.120  ns/op

El resultado medio del compilador de JIT de Graal es más de 5 veces más rápido que el de C2 en la misma referencia.

Puede continuar con la siguiente tarea.

Tarea 3: ejecutar demostraciones: ejecutable de Micronaut Native Linux

Esta tarea se centrará en comparar los tiempos de inicio al ejecutar un microservicio Java en una JVM y como ejecutable nativo. En ambos casos, el microservicio se ejecutará en GraalVM Enterprise, pero se ejecutará en diferentes modos: compilado justo a tiempo o con antelación, para demostrar la mejora del inicio.

Este microservicio se escribe con Micronaut, un marco Java de pila completa adecuado para crear microservicios y aplicaciones sin servidor. Es una aplicación de presentación simple del servidor, donde el servicio, ConferenceService.java, contiene una lista de conferencias y devuelve una conferencia aleatoria. El controlador se define con la anotación @Controller y se asigna a la ruta /conferences para obtener un nombre de conferencia aleatorio. Micronaut la convierte automáticamente en JSON en la respuesta.

  1. Vuelva al directorio raíz:

    cd
    
  2. Cree una aplicación Micronaut que especifique herramientas de creación de Maven o Gradle, descargue los orígenes de la aplicación, descomprima el archivo y navegue hasta él.

    mkdir micronaut-demo && cd micronaut-demo
    

    Maven:

    curl https://guides.micronaut.io/latest/micronaut-creating-first-graal-app-maven-java.zip -o micronaut-creating-first-graal-app.zip
    

    Gradle:

    curl https://guides.micronaut.io/latest/micronaut-creating-first-graal-app-gradle-java.zip -o micronaut-creating-first-graal-app.zip
    

    Descargará la versión Micronaut 3.0.x.

    unzip micronaut-creating-first-graal-app.zip
    
  3. Cree y ejecute la aplicación con Gradle o Maven Wrapper en JVM (GraalVM Enterprise).

    Maven:

    ./mvnw mn:run
    

    Gradle:

    ./gradlew run
    

    La aplicación se inicia en el puerto 8080. Tenga en cuenta el tiempo necesario para iniciar este simple microservicio Micronaut.

    Ver el tiempo necesario para iniciar un simple microservicio Micronaut en JIT

  4. Para terminar la aplicación, escriba CTRL+C.

  5. Genere un ejecutable nativo de Linux independiente con Native Image. Puede crear un ejecutable nativo con Gradle o Maven.

    Maven especificando el formato de empaquetado native-image:

    ./mvnw package -Dpackaging=native-image
    

    Gradle ejecutando la tarea nativeImage del proyecto Micronaut:

    ./gradlew nativeImage
    

    Si ha utilizado Maven, el ejecutable denominado micronautguide se escribirá en el directorio target/ del proyecto de forma predeterminada o en el directorio build/native-image/ denominado application si ha utilizado Gradle.

    Nota: El tiempo que se tarda en crear un ejecutable depende del tamaño y la complejidad de la aplicación y puede tardar algún tiempo en usar máquinas virtuales con baja energía.

  6. Llame al ejecutable.

    Creado con Maven:

    ./target/micronautguide
    

    Creado con Gradle:

    ./build/native-image/application
    

    Una vez más, tenga en cuenta el tiempo que se tarda en iniciar este microservicio como ejecutable nativo. Se inicia mucho más rápido porque el ejecutable es un binario independiente y no requiere que se ejecute un JDK, lo que hace que sea una forma fácil de distribuir las aplicaciones. El tamaño de archivo también es bastante pequeño.

    Vea el tiempo que se tarda en iniciar un microservicio Micronaut desde un ejecutable nativo y su tamaño de archivo

  7. Para terminar la aplicación, escriba CTRL+C.

GraalVM Native Image crea un ejecutable nativo con las clases de aplicación, clases de biblioteca dependientes, clases de JDK dependientes y una instantánea de la pila de aplicaciones con clases inicializadas en el momento de la creación. La ejecución de una aplicación Java como ejecutable nativo proporciona inicio instantáneo, menos consumo de CPU y memoria, lo que convierte al entorno de tiempo de ejecución de GraalVM Enterprise en un buen candidato para despliegues en la nube.

Ya ha visto la diferencia en los tiempos de inicio y ya puede finalizar esta práctica. Sin embargo, puede continuar y probar esta aplicación del servidor que se ejecuta en un explorador que requiere la configuración del firewall del host para permitir el tráfico a su instancia de VM. Continúe con la tarea 4.

Tarea 4: Configurar el firewall del host permite el tráfico a una instancia de VM (opcional)

Para probar la aplicación del servidor anterior en un explorador, debe asegurarse de que el firewall del host permita el tráfico a la máquina virtual.

  1. Conéctese a consola de OCI. Abra la página Luna Lab y haga clic en el enlace rápido Consola de OCI. Introduzca el nombre de usuario y la contraseña proporcionados en Credenciales para esta cuenta efímera de prácticas.

  2. Cuando se haya conectado a la consola de OCI, vaya a Recursos informáticos y haga clic en Instancias.

    Buscar instancias informáticas

  3. Seleccione un compartimento necesario en la lista desplegable Compartimento de la izquierda. Para buscar el nombre del compartimento, vuelva a la página Luna Lab y, a continuación, haga clic en Oracle Cloud y consulte el campo Nombre del compartimento.

  4. Busque la instancia de VM en la vista principal y ábrala.

  5. En la sección VNIC primaria, haga clic en Subred a la que está asociada la instancia.

  6. En la página de subred, haga clic en la lista de seguridad (nombre que comienza con ds-luna-seclist-).

  7. Pulse Agregar regla de entrada y rellene los siguientes datos:

    Agregar regla de entrada para permitir el tráfico entrante al puerto

    La regla permite que el tráfico de todos los orígenes utilice el puerto 8080, de modo que se pueda acceder a la aplicación desde cualquier lugar.

  8. Vuelva a la ventana de terminal y ejecute los siguientes comandos para reiniciar el firewall en la instancia de VM en ejecución.

    sudo firewall-cmd --permanent --add-port=8080/tcp
    

    sudo systemctl reload firewalld
    
  9. Reinicie la aplicación:

    Creado con Maven:

    ./target/micronautguide
    

    Creado con Gradle:

    ./build/native-image/application
    
  10. Abra la aplicación en un explorador, http://<SERVER_IP>:8080/conferences/random, donde <SERVER_IP> es la dirección IP pública de la instancia. Debido a que la anotación Micronaut @Controller está asignada a la ruta /conferences, debe agregar la ruta /conferences/random a la URL.

    http://<SERVER_IP>:8080/conferences/random
    
  11. (Opcional) Abra una nueva ventana de Termianl y envíe una solicitud GET con curl:

    curl http://<SERVER_IP>:8080/conferences/random
    

felicitaciones Ha finalizado correctamente esta práctica.

Más información

Para terminar esta sesión, haga clic en el botón End Session de la barra de herramientas.

Más recursos de aprendizaje

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

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