Hinweis:
- Dieses Tutorial steht in einer von Oracle bereitgestellten kostenlosen Übungsumgebung zur Verfügung.
- Er verwendet Beispielwerte für Oracle Cloud Infrastructure-Zugangsdaten, Mandanten und Compartments. Ersetzen Sie diese Werte beim Durchführen Ihrer Übung durch spezifische Werte für Ihre Cloud-Umgebung.
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:
- Stellen Sie eine Verbindung zu einer VM-Instanz in Oracle Cloud her, in der Sie die Übung mit GraalVM Enterprise ausführen, das bereits verfügbar ist
- JMH-Leistungsbenchmark ausführen
- Generieren Sie eine native ausführbare Datei für eine Micronaut-Anwendung, und führen Sie sie aus
- Konfigurieren Sie die Hostfirewall, um den Traffic zu Ihrer VM-Instanz zuzulassen (optional)
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).
-
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.
-
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.
-
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. -
Minimieren Sie das Browserfenster, damit Sie den Luna Desktop sehen können. Klicken Sie auf das Menü Anwendungen, und öffnen Sie einen Terminalemulator.
-
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.
-
Navigieren Sie im Terminalfenster, das mit der VM-Instanz verbunden ist, zum Demoverzeichnis:
cd java-simple-stream-benchmark
-
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 mityum
:sudo yum install maven
-
Erstellen Sie das Projekt:
mvn package
-
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. -
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.
-
Zurück zum Home-Verzeichnis:
cd
-
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
-
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.
-
Beenden Sie die Anwendung, indem Sie
CTRL+C
eingeben. -
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 Namenapplication
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.
-
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.
-
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.
-
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.
-
Wenn Sie bei der OCI-Konsole angemeldet sind, navigieren Sie zu Compute, und klicken Sie auf Instanzen.
-
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.
-
Suchen Sie Ihre VM-Instanz in der Hauptansicht, und öffnen Sie sie.
-
Klicken Sie im Abschnitt Primäre VNIC auf Subnetz, an das Ihre Instanz angehängt ist.
-
Klicken Sie auf der Subnetzseite auf die Sicherheitsliste (Name, der mit ds-luna-seclist- beginnt).
-
Klicken Sie auf Ingress-Regel hinzufügen, und geben Sie die folgenden Daten ein:
Die Regel ermöglicht es Traffic von allen Quellen, Port 8080 zu verwenden, sodass die Anwendung von überall aus erreicht werden kann.
-
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
-
Starten Sie die Anwendung neu:
Mit Maven erstellt:
./target/micronautguide
Mit Gradle erstellt:
./build/native-image/application
-
Ö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
-
(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
- In dieser Übung erfahren Sie, wie Sie GraalVM Enterprise und die zugehörigen Funktionen unter Oracle Linux selbst installieren.
- Testen Sie praktische Übungen mit GraalVM Native Image, und erstellen Sie cloud-native Java-Anwendungen mit der Übung GraalVM Native Image Quick Start.
- Weitere Informationen finden Sie in der GraalVM Enterprise-Dokumentation.
- Besuchen Sie die Produktseite unter oracle.com
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.
Accelerate Applications in OCI with GraalVM Enterprise
F54869-01
March 2022
Copyright © 2022, Oracle and/or its affiliates.