Hinweis:

Anwendungen in Oracle Cloud mit GraalVM Enterprise beschleunigen

Einführung

GraalVM Enterprise ist eine leistungsstarke JDK-Distribution, die auf vertrauenswürdigem und sicherem Oracle Java SE basiert und signifikante Verbesserungen bei der Anwendungsausführung und -effizienz ermöglicht.

GraalVM Enterprise ist im Oracle Java SE Subscription enthalten und ist kostengünstig auf Oracle Cloud Infrastructure (OCI) verfügbar

GraalVM Enterprise bietet zwei Möglichkeiten zur Ausführung von Java-Anwendungen: auf der JVM HotSpot oder als im Voraus kompilierte, native Exectuable. Bei der Ausführung auf der HotSpot JVM setzt GraalVM Enterprise den Graal-Compiler als Top-Tier-JIT-Compiler ein. Der Compiler führt eine erweiterte Optimierung durch und wendet aggressive Inlining-Techniken an, um die Performance von Anwendungen ohne Codeänderungen zu beschleunigen. Die Ausführung als native exectuable GraalVM Enterprise verwendet Native Image, um eine Java-Anwendung in eine eigenständige, native ausführbare Datei zu transformieren, die keine JVM für die Ausführung, den sofortigen Start und die Spitzenleistung ohne Aufwärmzeit erfordert.

In dieser Übung führen Sie Demoprojekte auf einer JVM und als native Exectuables aus, um die Performance zu vergleichen und zu sehen, wie GraalVM Enterprise Anwendungen auf OCI beschleunigen kann. Schnellere Anwendungen mit geringeren Ressourcenanforderungen führen zu weniger oder weniger Servern, wodurch die Cloud-Kosten gesenkt werden.

Laborinhalt

In dieser Übung führen Sie folgende Schritte aus:

Geschätzte Labordauer: 30 Minuten

HINWEIS: Wenn das Laptopsymbol angezeigt wird, müssen Sie eine Aktion ausführen, wie z.B. die Eingabe eines Befehls oder die Bearbeitung einer Datei.

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

Um einen Befehl zu kopieren, bewegen Sie den Mauszeiger über das Feld, und klicken Sie dann auf das Symbol "In Zwischenablage kopieren".

Um einen kopierten Befehl in ein Terminalfenster einzufügen, klicken Sie mit der rechten Maustaste, und wählen Sie die Option Paste aus dem Kontextmenü. Wenn Sie stattdessen Tastenkombinationen verwenden möchten, verwenden Sie CTRL+SHIFT+V.

Aufgabe 1: Verbindung zu einer VM-Instanz in Oracle Cloud herstellen

Beim Start der Übung werden die erforderlichen Ressourcen im Hintergrund bereitgestellt: Virtuelles Cloud-Netzwerk (VCN), Compute-Instanz beim vorkonfigurierten Oracle Linux 8-Image. Das Ressourcen-Provisioning umfasst auch die Installation und Konfiguration der GraalVM Enterprise-Laufzeitumgebung mit Native Image. So bleiben Sie in dieser Übung kurz und sparen Zeit. Das Provisioning kann etwa 5 Minuten dauern. Auf der Luna Lab-Webseite können Sie feststellen, wann die Ressourcen vollständig bereitgestellt und bereit sind (siehe Schritt 1 unten).

  1. Doppelklicken Sie auf dem Desktop auf das Symbol Luna Lab, um den Browser zu öffnen.

    Warten Sie, bis das animierte Getriebe neben Ressourcen zu einem Häkchen wird. Das bedeutet, dass alle erforderlichen Compute- und Netzwerkressourcen bereitgestellt werden, und Sie können fortfahren.

  2. Klicken Sie auf der Seite "Luna Lab" auf die Registerkarte Ressourcen. Auf der Seite "Ressourcen" werden der Name und die öffentliche IP-Adresse einer für Sie bereitgestellten VM-Instanz angezeigt.

  3. Kopieren Sie die öffentliche IP-Adresse aus dem Feld SERVER_IP. Sie müssen auf View Details klicken. Um den Mauszeiger über das Feld zu kopieren, und klicken Sie auf das Symbol In Zwischenablage kopieren.

  4. Minimieren Sie das Browserfenster, damit Sie den Luna Desktop sehen können. Klicken Sie auf das Menü Anwendungen, und öffnen Sie einen Terminalemulator.

  5. Geben Sie einen SSH-Verbindungsbefehl ein, bei dem die öffentliche IP-Adresse Ihrer VM-Instanz ist:

    ssh opc@<SERVER_IP>
    

    Akzeptieren Sie den ECDSA-Schlüssel-Fingerprint, indem Sie in der Eingabeaufforderung yes eingeben.

Sie sind jetzt mit einer VM-Instanz in Oracle Cloud verbunden. Ihre VM-Instanz ist bereits mit GraalVM Enterprise und dem für diese Übung erforderlichen Native Image Tooling vorkonfiguriert. Sie können dies einfach prüfen, indem Sie die folgenden Befehle ausführen:

java -version

native-image --version

Wenn Sie lernen möchten, wie Sie GraalVM Enterprise und seine Features auf Oracle Linux selbst installieren, führen Sie nach Abschluss dieser Übung die Übung Erste Schritte mit GraalVM unter Oracle Linux aus.

Sie können mit der nächsten Aufgabe fortfahren.

Aufgabe 2: Demos ausführen: Java Microbenchmark Harness (JMH)

In diesem Teil führen Sie eine Java-Benchmark aus, um die Performance des GraalVM Enterprise JIT-Compilers im Vergleich zum C2 JIT-Compiler zu vergleichen. Der Graal-Compiler, der standardmäßig in GraalVM Enterprise aktiviert ist, bietet eine optimierte Performance für Programme, die auf der JVM ausgeführt werden, durch einzigartige Methoden zur Codeanalyse, erweiterte Optimierungen und führt einen sehr aggressiven Inlining-Algorithmus für tiefgreifende und umfassende Klassenhierarchien durch.

Die Benchmark, die Sie ausführen möchten, wird mit Java Microbenchmark Harness (JMH) geschrieben und verwendet Java Stream API. Sie veranschaulicht Inlining- und partielle Escape-Analysen, die der Compiler in Verbindung mit einer deutlichen Performancesteigerung zur Laufzeit ausführt.

Der Demozellcode ist im Verzeichnis java-simple-stream-benchmark verfügbar.

Der Mikrobenchmark erstellt einen Stream aus Array-Elementen und ordnet jede Zahl mit mehreren Mapping-Funktionen zu:

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);
  }
}

Die JavaSimpleStreamBenchmark.testMethod wird mit 3 Iterationen ausgeführt, damit der JIT-Compiler erwärmt werden kann, bevor die Performance gemessen wird. Die Benchmark-Ergebnisse werden auf der Konsole gedruckt und liegen in Nanosekunden pro Betrieb vor, was bedeutet, dass niedrigere Zahlen besser sind.

  1. Navigieren Sie im Terminalfenster, das mit der VM-Instanz verbunden ist, zum Demoverzeichnis:

    cd java-simple-stream-benchmark
    
  2. Das Benchmarkprojekt wurde mit Maven erstellt, enthält aber keinen Maven Wrapper (.mvnw), und Oracle Linux enthält standardmäßig keinen Maven-Service. Installieren Sie Maven mit yum:

    sudo yum install maven
    
  3. Erstellen Sie das Projekt:

    mvn package
    
  4. Führen Sie die Benchmark mit dem GraalVM Enterprise JIT-Compiler aus:

    java -jar target/benchmarks.jar
    

    Durch Aufrufen des Befehls java verwenden Sie standardmäßig den optimierten Graal JIT-Compiler, der in GraalVM Enterprise aktiviert ist.

  5. Führen Sie die Benchmark auf derselben JVM (GraalVM Enterprise) aus, verwenden Sie aber den C2-Compiler anstelle des Graal-Compilers, indem Sie die Option -XX:-UseJVMCICompiler anwenden:

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

Vergleichen Sie die Benchmarkergebnisse, nachdem Sie die Schritte 4-5 ausgeführt haben. Die Ergebnisse hängen natürlich von der Anzahl der Prozessoren und dem Arbeitsspeicher der VM-Instanz ab. Nachfolgend finden Sie die Zahlen für eine Compute-Instanz mit der Ausprägungen VM.Standard.2-2 und 30 GB Arbeitsspeicher:

Graal JIT Compiler:

[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

C2-JIT-Compiler:

[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

Das durchschnittliche Ergebnis des Graal JIT-Compilers liegt über 5-mal schneller als bei den C2-Lösungen auf derselben Benchmark.

Sie können mit der nächsten Aufgabe fortfahren.

Aufgabe 3: Demos ausführen: Ausführbare Datei "Mikronaut Native Linux"

Bei dieser Aufgabe werden die Startzeiten beim Ausführen eines Java-Microservice auf einer JVM und als native ausführbare Datei verglichen. In beiden Fällen wird der Microservice auf GraalVM Enterprise ausgeführt, wird aber in verschiedenen Modi ausgeführt: Just-in-time oder im Voraus kompiliert, um den Startup-Boost aufzuzeigen.

Dieser Microservice verfügt über Micronaut, ein Full-Stack-Java-Framework, das für die Erstellung von Microservices und serverlosen Anwendungen geeignet ist. Dies ist eine einfache serverseitige Rendering-Anwendung, in der der der Service ConferenceService.java eine Liste von Konferenzen enthält und eine zufällige Konferenz zurückgibt. Der Controller wird mit der Annotation @Controller definiert und dem Pfad /conferences zugeordnet, um einen zufälligen Konferenznamen zu erhalten. Micronaut konvertiert sie in der Antwort automatisch in JSON.

  1. Zurück zum Home-Verzeichnis:

    cd
    
  2. Erstellen Sie eine Micronaut-Anwendung mit Maven- oder Gradle-Build-Tools, laden Sie die Anwendungsquellen herunter, dekomprimieren Sie das Archiv, und navigieren Sie zu ihr.

    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
    

    Die Micronaut-Version 3.0.x wird heruntergeladen.

    unzip micronaut-creating-first-graal-app.zip
    
  3. Erstellen und führen Sie die Anwendung mit Gradle oder Maven Wrapper auf der JVM (GraalVM Enterprise) aus.

    Maven:

    ./mvnw mn:run
    

    Gradle:

    ./gradlew run
    

    Die Anwendung wird auf Port 8080 gestartet. Beachten Sie die Zeit, die für den Start dieses einfachen Micronaut-Microservice benötigt wird.

    Sehen Sie sich die Zeit für den Start eines einfachen Mikronaut-Microservice in JIT an

  4. Beenden Sie die Anwendung, indem Sie CTRL+C eingeben.

  5. Generieren Sie eine eigenständige, native Linux-Programmdatei mit nativem Image. Sie können eine native ausführbare Datei mit Gradle oder Maven erstellen.

    Maven durch Angabe des native-image-Packagingformats:

    ./mvnw package -Dpackaging=native-image
    

    Gradle durch Ausführung der Aufgabe nativeImage des Micronaut-Projekts:

    ./gradlew nativeImage
    

    Wenn Sie Maven verwendet haben, wird die ausführbare Datei mit dem Namen micronautguide standardmäßig in das Projektverzeichnis target/ oder in das Verzeichnis build/native-image/ mit dem Namen application geschrieben, wenn Sie Gradle verwendet haben.

    Hinweis: Die Zeit zum Erstellen einer ausführbaren Datei hängt von der Anwendungsgröße und -komplexität ab und kann bei VMs mit niedriger Performance etwas länger dauern.

  6. Rufen Sie die ausführbare Datei auf.

    Mit Maven erstellt:

    ./target/micronautguide
    

    Mit Gradle erstellt:

    ./build/native-image/application
    

    Notieren Sie sich erneut die zum Starten dieses Microservice benötigte Zeit als native ausführbare Datei. Es wird viel schneller gestartet, da die ausführbare Datei eine eigenständige Binärdatei ist und kein JDK zur Ausführung benötigt, sodass Anwendungen auf einfache Weise verteilt werden können. Die Dateigröße ist auch ziemlich klein.

    Sehen Sie sich die Zeit zum Starten eines Micronaut-Microservice von einer nativen ausführbaren Datei und ihrer Dateigröße an

  7. Beenden Sie die Anwendung, indem Sie CTRL+C eingeben.

Mit GraalVM Native Image wird eine native ausführbare Datei mit den Anwendungsklassen, abhängigen Bibliotheksklassen, abhängigen JDK-Klassen und einem Snapshot des Anwendungsheaps mit Klassen erstellt, die bei der Erstellungszeit initialisiert wurden. Die Ausführung einer Java-Anwendung als native ausführbare Datei ermöglicht eine sofortige Inbetriebnahme, geringere CPU- und Speicherbelegung, wodurch die GraalVM Enterprise-Laufzeitumgebung für Cloud-Deployments geeignet ist.

Sie haben bereits den Unterschied in den Startzeiten erkannt und können diese Übung bereits beenden. Sie können diese serverseitige Anwendung jedoch fortsetzen und testen, die in einem Browser ausgeführt wird. Hierzu muss die Hostfirewall konfiguriert werden, um den Traffic zu Ihrer VM-Instanz zuzulassen. Fahren Sie mit Aufgabe 4 fort.

Aufgabe 4: Hostfirewall lässt Traffic zu einer VM-Instanz zu (optional)

Um die oben genannte serverseitige Anwendung in einem Browser zu testen, müssen Sie sicherstellen, dass die Hostfirewall den Datenverkehr zu Ihrer virtuellen Maschine ermöglicht.

  1. Melden Sie sich bei OCI Console an. Öffnen Sie die Seite Luna Lab, und klicken Sie auf den Schnelllink der OCI-Konsole. Geben Sie Benutzernamen und Kennwort ein, die unter Zugangsdaten für diesen ephemeren Übungsaccount verfügbar sind.

  2. Wenn Sie bei der OCI-Konsole angemeldet sind, navigieren Sie zu Compute, und klicken Sie auf Instanzen.

    Compute-Instanzen suchen

  3. Wählen Sie in der Dropdown-Liste Compartment auf der linken Seite ein erforderliches Compartment aus. Um den Compartment-Namen zu suchen, kehren Sie zur Seite Luna Lab zurück, klicken Sie auf Oracle Cloud, und zeigen Sie das Feld Compartment-Name an.

  4. Suchen Sie Ihre VM-Instanz in der Hauptansicht, und öffnen Sie sie.

  5. Klicken Sie im Abschnitt Primäre VNIC auf Subnetz, an das Ihre Instanz angehängt ist.

  6. Klicken Sie auf der Subnetzseite auf die Sicherheitsliste (Name, der mit ds-luna-seclist- beginnt).

  7. Klicken Sie auf Ingress-Regel hinzufügen, und geben Sie die folgenden Daten ein:

    Ingress-Regel hinzufügen, um eingehenden Traffic an den Port zuzulassen

    Die Regel ermöglicht es Traffic von allen Quellen, Port 8080 zu verwenden, sodass die Anwendung von überall aus erreicht werden kann.

  8. Kehren Sie zum Terminalfenster zurück, und führen Sie die folgenden Befehle aus, um die Firewall in der ausgeführten VM-Instanz neu zu starten.

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

    sudo systemctl reload firewalld
    
  9. Starten Sie die Anwendung neu:

    Mit Maven erstellt:

    ./target/micronautguide
    

    Mit Gradle erstellt:

    ./build/native-image/application
    
  10. Öffnen Sie die Anwendung in einem Browser, http://<SERVER_IP>:8080/conferences/random, wobei <SERVER_IP> Ihre öffentliche IP-Adresse der Instanz ist. Da die Micronaut-Annotation @Controller dem Pfad /conferences zugeordnet ist, müssen Sie den Pfad /conferences/random an die URL anhängen.

    http://<SERVER_IP>:8080/conferences/random
    
  11. (Optional) Öffnen Sie ein neues termianl-Fenster, und senden Sie eine GET-Anforderung mit curl:

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

Vielen Dank! Sie haben diese Übung erfolgreich abgeschlossen.

Weitere Informationen

Um diese Session zu beenden, klicken Sie in der Symbolleiste auf die Schaltfläche "Session beenden".

Weitere Lernressourcen

Sehen Sie sich andere Übungen zu docs.oracle.com/learn an, oder greifen Sie auf weitere Inhalte für kostenloses Lernen im Oracle Learning YouTube-Kanal zu. Außerdem besuchen Sie education.oracle.com/learning-explorer, um Oracle Learning Explorer zu werden.

Produktdokumentation finden Sie im Oracle Help Center.