A New GraalVM Release and New Free License!

原文はこちら。
The original article was written by Alina Yurenko (Developer Advocate for GraalVM, Oracle Labs).
https://medium.com/graalvm/a-new-graalvm-release-and-new-free-license-4aab483692f5

Oracle GraalVM

新しいディストリビューション、Oracle GraalVMをご紹介します。これはJDK17とJDK20で利用可能で、GraalVM Free Terms and Conditions(GFTC)ライセンスの下でリリースされています(FAQもご覧ください)。

GraalVM Free Terms and Conditions (GFTC) license
https://oracle.com/downloads/licenses/graal-free-license.html
FAQ
https://oracle.com/java/technologies/javase/jdk-faqs.html#GraalVM-licensing

これは、開発用と本番用の両方で、GraalVMの最大の機能をすべて無料で使用できることを意味します!

Native Imageに関しては、このリリースで以下の機能が導入されています。

  • profile-guided optimization (PGO)と、より多くのコンパイラ最適化により、最高のピーク性能を実現

Optimize a Native Executable with Profile-Guided Optimizations
https://graalvm.org/latest/reference-manual/native-image/guides/optimize-native-executable-with-pgo/

  • G1 GCにより、アプリケーションの実行で大きなヒープと最小限のポーズ時間を実現
    (訳注:以前のGraalVM Enterprise Editionではすでにサポートされていました)

Memory Management
https://graalvm.org/latest/reference-manual/native-image/optimizations-and-performance/MemoryManagement/#g1-garbage-collector

  • 圧縮されたオブジェクトヘッダーとポインターにより、さらに低いメモリフットプリントを実現
  • プロファイリング情報を自動的に推論する機械学習
  • SBOMサポートによるセキュリティ機能の追加

GraalVM Native Imageは、その起動が高速という点ですでに知られていますが、今回のリリースでは、長時間稼働するJavaアプリケーションを高いパフォーマンスで実行するための非常に効率的な方法であることを実証しています。GraalVM Native ImageでコンパイルしたJava 20のSpring PetClinicのサンプルアプリケーションでテストし、JITコンパイルと比較したところ、以下のようなパフォーマンス上の利点がありました。

Spring PetClinic Sample Application
https://github.com/spring-projects/spring-petclinic

Performance of Spring Petclinic with Oracle GraalVM Native Image, GraalVM CE Native Image, and GraalVM CE with C2 JIT

ベンチマークでは、Oracle X5-2サーバー(Intel Xeon E5-2699 v3)上で最新のSpring Petclinicを実行し、ワークロードを16CPUに制限、最大ヒープサイズを1GBに設定しました。5つの異なるエンドポイント(ペットの作成、飼い主と診療所の訪問、飼い主とペットのIDの読み取り)をラウンドロビン方式で、100秒間、600reqs/secで呼び出しながらwrkを使用して最大スループットを測定しています。

wrk – a HTTP benchmarking tool
https://github.com/wg/wrk

ピークスループットは、その後の180秒間の平均性能です。レイテンシーは、スループット実験が終了した後、wrk2を使って毎秒5000リクエストの一定負荷をかけてキャプチャしています。

A constant throughput, correct latency recording variant of wrk
https://github.com/giltene/wrk2

それでは、それぞれのパフォーマンス指標を詳しく見ていきましょう。

Native Imageはアプリケーションの起動時間が最速であることで知られています。Oracle GraalVMでコンパイラの最適化が追加されたおかげで、起動時間はさらに高速になっています。

  • GraalVM CE Native Imageに比べて、Oracle GraalVM Native Imageの起動は46.42%高速
  • JIT(GraalVM CEでのC2 JIT)で実行する場合に比べて32倍高速に起動

メモリ最適化が追加された結果、Oracle GraalVM Native Imageでビルドしたベンチマークアプリケーションのメモリ使用量は大幅に削減されました。

  • GraalVM CE Native Imageに比べて25%少ないメモリで動作
  • GraalVM CEでC2 JITを使った場合に比べて2.52倍小さなメモリで動作(訳注:換言すると、C2 JITの40%弱のメモリで済む)

Oracle GraalVM Native Imageのピークスループットは、GraalVM CEに比べて1.6倍高い値を示しました。この特定のアプリケーションでは、スループットはまだJITをわずかに下回っています。SpringやQuarkus、Micronautで他のベンチマークを実行すると、多くの場合、ピークスループットでAOTがJITを上回ることもあります。

アプリケーションを評価する上で重要なもう一つの指標は、効率性です。つまり、「与えられた時間とリソースでどれだけのパフォーマンスを得ることができるか」ということです。これは、リソースと使用時間に対して対価を支払うクラウドでは特に重要ですが、オンプレミスでもインフラを効率的に使いたいものです。これを評価するために、アプリケーションが1秒間に1GBのメモリあたりどれだけのリクエストを処理できるかを見てみましょう(上のグラフを参照)

  • Oracle GraalVM Native Imageは、14,780リクエスト/GB/secを処理できます。この値はCE Native ImageとC2 JITの両方の値に比べてほぼ2倍です。

つまり、Oracle GraalVM Native Imageを使えば、手持ちのインフラに対して最高のピークスループットを得ることができ、リソースに制約のある環境でも良好なパフォーマンスで実行できるのです。

次に、レイテンシ分布について見てみましょう。レイテンシは、アプリケーションのすべてのリクエストの応答性を反映する重要な指標です。最も遅いリクエストは、レイテンシ分布の最後に現れ、サービス品質に大きな影響を及ぼします。通常、ビジネス要件では、ほとんどのリクエストに対して特定のレイテンシ制限(通常99%、すなわちP99レイテンシ)が義務付けられています。

この例では、95パーセンタイルまでのOracle GraalVM Native ImageとCEでC2 JITを利用した場合の応答時間は3ms未満で、非常に近い特性を持っていることがわかります。これは、Native ImageでもJITと同様のアプリケーションの応答性が期待できることを意味します。しかし、JITでは95パーセンタイル以後で大幅にレイテンシが悪くなるのに対し、Native Imageではレイテンシの悪化が低い水準にとどまっています。このアプリケーションでは、Native ImageによってP99のレイテンシが大幅に改善され、その結果、サービスの応答性が改善されました。

まとめると、Oracle GraalVM Native Imageは、高速起動と少ないリソース利用に加えて、長時間稼働するアプリケーションに優れた性能特性を提供します。

また、今回のリリースでは、多くの新機能に取り組んでいます。あまりに多くのアップデートがあるため、2つのブログ記事を用意しました。このエントリではGraalVM JDKとNative Imageに焦点を当て、もう1つはGraalVM言語とTruffleのアップデートを紹介しています。

What’s New in GraalVM Languages
https://medium.com/graalvm/whats-new-in-graalvm-languages-161527df3d76
https://logico-jp.io/2023/06/14/whats-new-in-graalvm-languages/

では、このリリースで他に何が新しくなったのか見てみましょう。

GraalVM for JDK 17 and JDK 20

GraalVMは、JDKのバージョンスキームに沿った新しい命名方式に変わりました。例えば、このリリースはGraalVM for JDK 17とGraalVM for JDK 20の、2つのGraalVMバージョンが含まれています。どちらのバージョンもメインブランチに基づいており、新機能が含まれているので、利用者に最適なJDKバージョンを選択できます。しかしながら、我々はJDK 20に移動されることをお勧めします。少し前に発表したように、我々は新しいリリーススケジュールに移行していて、その中で(Oracle JDKがそうであるように)最新のJavaバージョン用のGraalVMをリリースしていきます。この方法では、最新のJavaとGraalVMの機能をすべて一緒に使用することもできます。

GraalVM, Galahad, and a New Release Schedule
https://medium.com/graalvm/graalvm-galahad-and-a-new-release-schedule-d081d1031bba
https://logico-jp.io/2022/12/28/graalvm-galahad-and-a-new-release-schedule/

このリリースのもう一つの大きな更新は、GraalVM JDKのダウンロードにNative Imageが含まれるようになったことです!Native Imageを別のコンポーネントとしてダウンロードしたり、gu install native-imageを実行する必要はなくなりました。最初から準備ができています。

そして、Oracle GraalVMのダウンロードも簡単になりました。安定したスクリプトで利用可能なダウンロードURLがあるので、それを使って直接ダウンロードしたり、スクリプトやDockerファイルでダウンロードできます。

scriptable download URLs
https://oracle.com/java/technologies/jdk-script-friendly-urls/

例えば、Linux x86-64で動作するOracle GraalVM for JDK 20を入手するには、次のコマンドを実行してください。

wget https://download.oracle.com/graalvm/20/latest/graalvm-jdk-20_linux-x64_bin.tar.gz

Machine Learning for Compiler Optimizations

Oracle GraalVMで利用できる非常に便利な機能の1つに、profile-guided optimization(プロファイル誘導型最適化、PGO)があります。

Optimize a Native Executable with Profile-Guided Optimizations
https://graalvm.org/latest/reference-manual/native-image/guides/optimize-native-executable-with-pgo/

PGOは、実行時にアプリケーションのプロファイリング情報を収集し、それをNative Imageと共に使用して、結果として得られるネイティブ実行ファイルのパフォーマンスを最適化できるというもので、これにより、AOT最適化とランタイムプロファイリングの両方の長所を併せ持つことができます。

今回のリリースでは、機械学習ベースのプロファイル推論というエキサイティングな新機能が追加されました。Native Imageでは、制御フローグラフの分岐の確率を予測するために、事前に訓練されたMLモデルを使用するようになりました。そして、予測された確率を使用してPGOを実行します。Renaissance、Da Capo、Da Capo con Scalaなどの包括的なベンチマークセットでの測定では、予測されたプロファイルを利用したPGOは、Native Imageのデフォルト設定と比較して~6%のランタイム高速化を実現しています。MLベースのプロファイル推論はOracle GraalVMで利用可能で、デフォルトで有効です。皆様からのフィードバックやパフォーマンス報告をお待ちしています。

ただし、MLプロファイル推論は、ネイティブ実行ファイルのサイズを1~2%程度、わずかに増加させる可能性があることを忘れないでください。

Even More Performance in Native Image

コンパイラがより良いパフォーマンスを提供する方法の1つに、デプロイメントプラットフォームのアーキテクチャ固有の機能を活用することがあります。これらの特定の機能を使用することは、パフォーマンスには最適ですが、これらの特定の命令がないマシンにデプロイする場合、互換性の問題が発生する可能性があります。gcc に似た新しい-marchオプションを導入し、プラットフォーム固有の性能と互換性を柔軟に選択できるようにしました。-march=compatibilityは最高の互換性を、-march=nativeはネイティブ実行ファイルが同じマシンアーキテクチャまたは同じ CPU 機能のマシンで展開される場合に最高の性能を発揮します。利用可能なすべてのマシン・アーキテクチャをリストアップするには、-march=listを使用します。

PGOにも変更を加えています。

アプリケーションに最高のピーク性能を提供するためには、PGOが完全なプロファイリング情報を持っていることが重要です。つまり、すべてのユースケースのプロファイルを確認するために、異なるワークロードでアプリケーションを数回実行する必要がある場合があります。今回、複数の PGO を実行した際に収集したプロファイルを native-image-configure でマージすることができるようになりました。

コールスタックを収集する新しいサンプリングプロファイラがPGOに追加されました。このデータは、.iprofファイルに含まれます。PGO設定済み実行ファイルをビルドすると、サンプリングプロファイラがデフォルトで有効化されます(ただし、必要に応じて無効にすることができます)。良いプロファイル、ひいては良いピーク性能を得るためには、関連するワークロードを実行し、アプリケーションを適切にウォームアップする必要があることを心に留めておいてください。

コンテキストを考慮したインライン最適化も実装しました。この最適化では、新しいサンプリングプロファイラを使用して、ホットコードに最適化の効果をさらによりよく反映させます。これにより、2~7%小さなサイズの実行ファイルが生成され、ピークパフォーマンスが向上しています。

Native Imageのループベクトル化サポートを改善し、コンパイラがより多くのループをベクトル化して高速に実行できるようにし、AOTの特定のコードシェイプのパフォーマンスをJITと同等にすることができました。

Native Imageのループベクトル化サポートを改善しました。これにより、コンパイラがより多くのループをベクトル化して高速に実行できるようにし、AOTの特定のコードシェイプのパフォーマンスがJITと同等になりました。

Native Image Bundles

Native Image のビルドコマンド(native-image -jar MyApp.jar)は表面的にはシンプルに見えますが、環境に依存する多くの変数やプロパティを持つ複雑なビルドプロセスが開始されます。そのような条件下で、例えば、アプリケーションの更新やパッチ適用、問題の再現などのために、ビルドを複製できると非常に便利です。このような目的のために、本リリースでNative Image Bundlesが導入されました。

Native Image Bundles
https://www.graalvm.org/latest/reference-manual/native-image/overview/Bundles/

これにより、アプリケーションの JAR ファイルと、引数、環境変数、システムプロパティ設定、クラスパスおよびモジュールパスのオプションに関する情報を含むビルドバンドルを作成できます。バンドルを生成するには、ネイティブ実行ファイルをビルドするときに --bundle-create=.nib フラグを使用します。これにより、先ほどと同様に実際の実行ファイルが作成されるとともに、<imagename>.nibファイルと <imagename>.outputディレクトリが作成されます。これらのファイルが利用できるようになれば、次のように実行してビルドを再現できます:

native-image -bundle-apply=…/path/to/<imagename>.nib

バンドルにより、Native Imageのデプロイメントのアップデートがシンプルになり、問題のデバッグや再現に役立つはずです。この機能をお試しいただき、ご意見をお聞かせください!

Build reports

Native Imageは、実行ファイルの内容をよりよく理解するためのビルドレポートを生成できるようになりました。ビルドレポートは HTML 形式で提供され、以下のようなインサイトを提供します:

  • ビルド環境と使用したリソースに関する情報
  • 到達可能な型、フィールド、メソッドを含む解析結果
  • コードとヒープ領域の完全なブレイクダウン
  • ソフトウェア部品表(SBOM)
Build report summary and code area breakdown

-H:+BuildReportを指定し、この実験的機能を試してください。

AWT on Linux

Native ImageのAWTサポートを改善しました。Windowsに加え、Linuxでも動作するようになりました!

Improve AWT Support #4921
https://github.com/oracle/graal/issues/4921

これは、より多くのGUI JavaアプリケーションがNative Image上で動作するようになったことを意味します。Native Imageで動作するあなたのアプリケーションと、あなたのフィードバックを楽しみにしています。macOSのAWTサポートの改善も予定されています。

An AWT app built as a native executable for Linux with GraalVM

Native Image Developer Experience

リリースごとに、GraalVM、特にNative Imageの開発者体験をよりスムーズで合理的なものにするためのアップデートを導入しています。今回のリリースでは、いくつかの変更があります。

Native Imageビルドプロセスのメモリフットプリント改善

同じマシン上で他の多くのプロセスが実行されている場合、ビルダーは利用可能なメモリを考慮し、メモリプレッシャーを軽減するようになりました。また、多くの場合でメモリ消費量が減っているため、メモリ不足のエラーで失敗する可能性も低くなっています。同時に、Native Imageが使用できるメモリの最大量を増やしました。これは大規模なアプリケーションを構築する際に役立ちます。

WindowsでNative Imageビルド環境を自動的にセットアップ

Windowsユーザーには嬉しいニュースです!WindowsでNative Imageビルド環境を自動的にセットアップするようになり、x64 Native Tools コマンドプロンプトを使用する必要がなくなりました。また、Windowsでのデバッグも改善されました。デバッグ情報にJavaの型に関する情報が含まれるようになりました。

JFRのサポート強化

JFRのサポートを強化しました。現在、以下のイベントもサポートされています

  • ExecutionSample
  • ObjectAllocationInNewTLAB
  • JavaMonitorInflate
メタデータを安全に合成する取り組み

新しいメタデータを追加してもビルドが壊れないように、メタデータの合成を安全にすることに取り組みました。

Safe Composition of Metadata #5173
https://github.com/oracle/graal/issues/5173

内部エラーをわかりやすく

内部エラーがわかりやすくなりました。エラー発生時、Native Imageのビルドはスタックトレースを表示するだけでなく、エラーレポートと問題を報告する方法を提供するようになりました。

RISC-V上でGraalVM Native Image

LLVMバックエンドを経由してRISC-V上でGraalVM Native Imageを使用できるようになりました。詳細は以下のエントリをご覧ください。

GraalVM Native Image meets RISC-V
https://medium.com/graalvm/graalvm-native-image-meets-risc-v-899be38eddd9
https://logico-jp.io/2023/01/17/graalvm-native-image-meets-risc-v/

New Monitoring Features in Native Image 📈

ニーズが多かったので、コミュニティと共同でJMXによるリモート管理を実装しました。

Build and Run Native Executables with Remote JMX
https://graalvm.org/latest/reference-manual/native-image/guides/build-and-run-native-executable-with-remote-jmx/

この機能は、--enable-monitoringoptionで有効化できます。

--enable-monitoring=jmxclient,jmxserver

この機能は実験的なものであることに注意してください。

Ready for Native Image ✅

「Native ImageでライブラリXを使えるかどうか知るにはどうすればいいのか」という質問を受けることが時々あります。現在、graalvm.orgでは、Native Imageで動作することが確認されているライブラリやフレームワークの一覧をご覧いただけます。

Libraries and Frameworks Ready for GraalVM Native Image
https://graalvm.org/native-image/libraries-and-frameworks/

現時点では、このリストには150以上のライブラリやフレームワークが掲載されており、それらはNative Imageで利用可能であることを検証済みです。例えばMicronaut、Spring、Quarkus、Helidon、H2、GraphQL、MariaDB、Netty、MySQL、Neo4j、PostgreSQL、Testcontainers、Thymeleafが含まれています。私たちのエコシステムが積極的にNative Imageの採用と、GraalVM reachability metadataリポジトリを通じたサポートの提供を目の当たりにして、非常にうれしく思っています。

GraalVM Reachability Metadata Repository
https://github.com/oracle/graalvm-reachability-metadata

このリポジトリはNative Build Toolsとも統合されていますので、依存関係のためにNative Imageの設定ファイルを自動的に発見して引き出すことができるようになりました。

Enabling the metadata repository
https://graalvm.github.io/native-build-tools/latest/maven-plugin.html#_enabling_the_metadata_repository

GraalVM JDK and Compiler Updates

GraalVM JITがZGCをサポートしました

ZGCは低レイテンシーのガベージコレクタで、低レイテンシーや大きなヒープを必要とするアプリケーションを対象としています(現時点では、ZGCはNative Imageではサポートされていません)。

The Z Garbage Collector
https://docs.oracle.com/en/java/javase/20/gctuning/z-garbage-collector.html

ZGCを有効にするには、コマンドラインオプション -XX:+UseZGC を使用します。このアップデートは、大規模なアプリケーションや低レイテンシーが重要な場合に有益であると期待しており、皆様からのフィードバックやパフォーマンス報告をお待ちしています。

Ideal Graph Visualizer (IGV) もオープンソース化します!🎉

IGV は、コンパイルグラフを分析し、パフォーマンスの問題を調査することができる開発者向けツールです。

Ideal Graph Visualizer
https://graalvm.org/latest/tools/igv/

IGVは、GraalVM上で言語を実装している方や、高度なコンパイルの問題を調査している方にとって、特に役に立つことを期待しています。

Community Contributions

  • graalvm-reachability-metadata リポジトリには、約 200 件のコミュニティからの貢献がありました。これにより、Java ライブラリが Native Image で利用できるようになっております。特に多くの貢献をしてくれたSpringチームとMicronautチームに感謝いたします。

Repository which contains community-driven collection of GraalVM reachability metadata for open-source libraries.
https://github.com/oracle/graalvm-reachability-metadata

  • Red Hatと共同で、JFR (JDK Flight Recorder) のサポートを構築し、Windowsでのデバッグを改善し、実験的なJMXのサポートを追加しています。
  • すべてのフィードバック、パフォーマンスベンチマーク、問題報告のおかげで、毎リリースでGraalVMをさらに改善できております。

What’s New in the GraalVM Ecosystem

  • コミュニティアンケートへのご回答をもとに、GraalVMエコシステムの概要をまとめました(最も使われている機能やツール、ライブラリやフレームワークの採用状況、プログラミング言語など)

GraalVM Community Survey 2022 results
https://medium.com/graalvm/graalvm-community-survey-2022-results-328d0404d36e
https://logico-jp.io/2023/06/18/graalvm-community-survey-2022-results/

  • Native Imageに対応したSpring Bootのメジャーバージョンがリリースされました!📦

Spring Boot 3.0 Goes GA
https://spring.io/blog/2022/11/24/spring-boot-3-0-goes-ga

  • Quarkus 3がリリースされました。多くのクールな新機能が追加されています。私のお気に入りは、新しく改良された拡張性のあるDev UIです。試してみてください!

Quarkus 3 has landed
https://quarkus.io/quarkus3/
Dev UI
https://quarkus.io/guides/dev-ui

  • Java 17をベースラインとし、より高速なビルドを備えたMicronaut 4.0がまもなくリリースされる予定です。Milestone 2はすでにお試しいただけます。

Upgrade to Micronaut Framework 4
https://micronaut.io/2023/05/09/upgrade-to-micronaut-framework-4-0-0/

  • Azure Application InsightsでGraalVMとSpring Bootアプリケーションの監視ができるようになりました。
  • TestcontainerはGraalVM Reachabilityリポジトリを使ってNative Imageを利用できます。また、いくつかのフレームワークでスムーズな統合を提供しています。例として、MicronautがNative ImageとJVMモードの両方でRabbitMQとの統合をテストする方法をご覧ください。

Add native testing with GraalVM and test containers by graemerocher · Pull Request #449
https://github.com/micronaut-projects/micronaut-rabbitmq/pull/449

  • Ionut BalosinとFlorin Blanaruが、独自の(そして非常に徹底した)GraalVMとOpenJDK C2のパフォーマンス研究を発表しました。

JVM Performance Comparison for JDK 17
https://ionutbalosin.com/2023/03/jvm-performance-comparison-for-jdk-17/

  • Apache Kafka、Quarkus、GraalVMを使った興味深い実験も行われました:単一のブローカーノードが、60MBのRSSで、130ms以内で起動し実行されています。

Conclusion

この機会に、このリリースに寄せられたすべてのフィードバック、提案、貢献に対して、コミュニティに感謝したいと思います。このリリースに関する追加のフィードバックや、今後のリリースで見たい機能の提案があれば、Slack、GitHub、またはTwitterでお知らせください。

Slack invitation
https://www.graalvm.org/slack-invitation
GitHub Issues
https://github.com/oracle/graal
Twitter
https://twitter.com/graalvm

GraalVM言語およびTruffleのアップデートについては、以下のブログエントリをご覧ください。

What’s New in GraalVM Languages
https://medium.com/graalvm/whats-new-in-graalvm-languages-161527df3d76
https://logico-jp.io/2023/06/14/whats-new-in-graalvm-languages/

新しいGraalVMを試してみてください!🚀

Download GraalVM
https://graalvm.org/downloads/

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください