「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Quarkus と GraalVM ネイティブ イメージを使用して Java マイクロサービスをターボチャージする

Quarkus と GraalVM ネイティブ イメージを使用して Java マイクロサービスをターボチャージする

2024 年 9 月 3 日に公開
ブラウズ:677

現代のソフトウェア開発のダイナミックな状況において、マイクロサービスはアーキテクチャ上のアプローチとして好まれています。この方法論には多くの利点がありますが、課題がないわけではありません。従来の JVM ベースのサービスには、メモリ使用量の多さ、起動時間の延長、CPU 使用率の高さなどの問題が伴うことがよくあります。これらの課題は技術的な側面に影響を与えるだけでなく、ソフトウェア ソリューションの実行と保守の全体的なコストに大きな影響を与える可能性がある財務上の影響も及ぼします。

GraalVM ネイティブ イメージとは何ですか?

GraalVM ネイティブ イメージは GraalVM の重要な機能であり、さまざまなプログラミング言語と実行モードのサポートを提供する高性能ランタイムです。具体的には、GraalVM Native Image を使用すると、Java アプリケーションを事前にコンパイルしてスタンドアロンのネイティブ実行可能ファイルにし、実行時に Java 仮想マシン (JVM) を使用する必要がなくなります。この革新的なアプローチにより、従来の JVM に比べて起動時間がほぼ瞬時に短縮され、メモリ消費量が大幅に削減された実行可能ファイルが生成されます。これらのネイティブ実行可能ファイルは細心の注意を払って作成されており、アプリケーションの機能に不可欠な必須のクラス、メソッド、および依存ライブラリのみが含まれています。 GraalVM Native Image は、その技術的能力を超えて、広範囲に影響を与える戦略的ソリューションとして浮上しています。技術的な課題を克服するだけでなく、説得力のある財務上の事例も紹介します。 GraalVM は、効率的で安全かつ即座にスケーラブルなクラウド ネイティブ Java アプリケーションの開発を促進することで、リソース使用率の最適化と費用対効果の促進に役立ちます。本質的に、これは現代の動的な環境におけるソフトウェア ソリューションのパフォーマンスと財務効率を向上させる上で極めて重要な役割を果たします。

技術的な課題と財務上の影響

1.大きなメモリ使用量

技術的影響
従来の JVM ベースのサービスでは、クラスロードとロードされたクラスのメタデータにより、多くの場合、大量のメモリ オーバーヘッドが発生します。


金融訴訟
メモリの消費量が多いと、インフラストラクチャのコストが増加します。 GraalVM では、ロードされたクラスのメタデータの削除やその他の最適化により、リソースのより効率的な使用が可能になり、潜在的なコスト削減につながります。

2.開始時間の延長

技術的影響
マイクロサービスでのコールド スタートは応答時間の増加につながり、ユーザー エクスペリエンスに影響を与え、サービスの低下を引き起こす可能性があります。


金融訴訟
開始時間の延長はユーザーの満足度に影響を与えるだけでなく、運用コストの増加にもつながります。クラスローディングのオーバーヘッドの排除やビルド中のイメージ ヒープの事前生成などの GraalVM の最適化により、起動時間が大幅に短縮され、運用コストが最小限に抑えられる可能性があります。

3. CPU 使用率が高い

技術的影響
従来の JVM は、起動時にプロファイリングやジャストインタイム (JIT) コンパイルのために CPU サイクルを消費することがよくあります。


金融訴訟
CPU 使用率が過剰になると、クラウド インフラストラクチャのコストが増加します。 GraalVM によるプロファイリングと JIT のオーバーヘッドの回避は、CPU 消費量の削減に直接貢献し、クラウド使用における潜在的なコスト削減につながります。

コールドスタート問題への取り組み

マイクロサービス、特にサーバーレスまたはコンテナ化された環境では、コールド スタート問題に直面することが多く、応答時間とユーザー エクスペリエンスに影響を与えます。 GraalVM は、いくつかの最適化を実装することでこの課題に対処します。

1.クラスロードのオーバーヘッドなし

従来の Java アプリケーションは、実行時のクラスロードに依存して、クラスを動的にロードしてリンクします。このプロセスでは、特に起動段階でオーバーヘッドが発生します。 GraalVM は、静的コンパイルまたは事前 (AOT) コンパイルと呼ばれるプロセスを通じて、このオーバーヘッドを最小限に抑えます。これには、アプリケーションに必要なすべてのクラスの事前ロード、リンク、および部分的な開始が含まれます。その結果、アプリケーションの起動時にランタイム クラスロードが必要なくなります。

2.解釈されたコードの削除

従来の Java 仮想マシンは、ジャストインタイム (JIT) コンパイルを適用する前に、解釈された実行モードに依存します。これにより、起動の遅延や CPU 使用率の増加が発生する可能性があります。ネイティブ実行可能ファイルには解釈されたコードが含まれていないため、起動時間の短縮にさらに貢献します。

3.プロファイリングと JIT のオーバーヘッドなし

GraalVM は、ジャストインタイム (JIT) コンパイラーを起動する必要性を回避し、起動時の CPU 使用率を削減します。

4.ビルド時のイメージ ヒープ生成

GraalVM のネイティブ イメージ ユーティリティを使用すると、ビルド プロセス中に特定のクラスの初期化プロセスを実行できます。これにより、事前に初期化された部分を含むイメージ ヒープが生成され、アプリケーションの起動が高速化されます。

Oracle GraalVM のネイティブ イメージ ユーティリティは、従来の JVM ベースのアプリケーションよりも起動時間がほぼ 100 倍速いことが実証されています。以下のグラフは、ランタイム メモリ要件の大幅な削減を示しており、HotSpot と比較した GraalVM の効率を示しています(図 1)。

Turbocharge Java Microservices with Quarkus and GraalVM Native Image

図 1 – ネイティブ実行可能ファイルはほぼ即座に起動します(oracle.com)


メモリ使用量の削減を実現

GraalVM は、次の最適化を通じてメモリ フットプリントの削減に貢献します:

1.ロードされたクラスにメタデータがありません

GraalVM は、動的にロードされたクラスのメタデータを非ヒープ メモリに保存することを回避します。ビルド プロセス中に、必要なクラス情報が事前にロードされてリンクされるため、実行時の追加のメタデータの必要性が最小限に抑えられます。

2.プロファイリング データまたは JIT 最適化なし

バイトコードはすでにネイティブ コード内にあるため、GraalVM では JIT 最適化のためのプロファイリング データを収集する必要がなくなり、メモリ オーバーヘッドが削減されます。

3.絶縁技術

GraalVM は、ヒープをより小さな独立した「ヒープ」に分割するテクノロジーである Isolates を導入し、特にリクエスト処理シナリオの効率を高めます。

一般に、JVM で実行する場合と比較して、メモリ消費量が最大 5 倍少なくなります(図 2)

Turbocharge Java Microservices with Quarkus and GraalVM Native Image

図 2 – Go または Java HotSpot(oracle.com)

と比較したネイティブ実行可能メモリ

結論として、GraalVM のネイティブ イメージ ユーティリティは、マイクロサービスによってもたらされる課題に対する革新的なソリューションを提供し、起動時間、メモリ フットプリント、CPU 使用率の問題に対処します。 GraalVM を採用することで、開発者は効率的で安全なだけでなく、優れたユーザー エクスペリエンスを提供するクラウドネイティブ Java アプリケーションを作成できます。

Quarkus を使用したネイティブ Java

Quarkus サービスをネイティブ イメージにコンパイルするには、さまざまな方法が利用できます。この記事では、Quarkus ネイティブのビルド手順については深く掘り下げませんが、重要な手順の概要を説明します。

ネイティブ イメージの構築方法に進む前に、pom.xml ファイルに適切なネイティブ プロファイルを設定することが重要です。次のプロファイルを追加します:

nativenative

インストールされた GraalVM を使用したネイティブ実行可能ファイルの作成

次のコマンドを使用して GraalVM のバージョンを確認します:

./gu info native-image

このコマンドは、インストールされている GraalVM のバージョンを表示します:

Downloading: Component catalog from www.graalvm.org
Filename : https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-22.3.0/native-image-installable-svm-java19-linux-amd64-22.3.0.jar
Name     : Native Image
ID       : native-image
Version  : 22.3.0
GraalVM  : 22.3.0
Stability: Experimental
Component bundle native-image cannot be installed
        - The same component Native Image (org.graalvm.native-image[22.3.0.0/55b341ca1bca5219aafa8ed7c8a2273b81d184dd600d8261c837fc32d2dedae5]) is already installed in version 22.3.0

ネイティブ実行可能ファイルを作成するには、次を使用します:

./mvnw install -Dnative

これらのコマンドは、ターゲット ディレクトリに *-runner バイナリを生成し、ネイティブ実行可能ファイルを実行できるようにします:

./target/*-runner

GraalVM をインストールせずにネイティブ実行可能ファイルを作成する

GraalVM をローカルにインストールすることが困難な場合は、コンテナ内ビルドを使用できます:

./mvnw install -Dnative -Dquarkus.native.container-build=true -Dquarkus.native.builder-image=graalvm

このコマンドは、Docker コンテナ内でビルドを開始し、必要なイメージ ファイルを提供します。次に、
を使用してアプリケーションを開始できます。

./target/*-runner

ネイティブ イメージの構築が困難な場合に備えて、RedHat チームは、Mandrel と呼ばれる Quarkus フレームワーク用に設計された GraalVM の特殊なディストリビューションを提供します。マンドレルの流線
GraalVM は、Quarkus アプリケーションに不可欠なネイティブ イメージ機能のみに焦点を当てています。マンドレルを使用するには、次の手順に従います:

  1. 適切な Mandrel バージョンの Mandrel リポジトリを特定します

  2. application.properties ファイルに Mandrel バージョンを設定します:

quarkus.native.builder-image=quay.io/quarkus/ubi-quarkus-mandrel-builder-image:23.0.1.2-Final-java17

3.Maven ビルド コマンドを実行します:

./mvnw clean install -Pnative

コンテナを手動で作成する

コンテナ作成よりも手動で制御したい場合は、複数段階の Docker ビルドを使用できます。

FROM quay.io/quarkus/ubi-quarkus-mandrel-builder-image:23.0.1.2-Final-java17 AS build
COPY --chown=quarkus:quarkus mvnw /app/mvnw
COPY --chown=quarkus:quarkus .mvn /app/.mvn
COPY --chown=quarkus:quarkus pom.xml /app/
USER quarkus
WORKDIR /app
RUN ./mvnw -B org.apache.maven.plugins:maven-dependency-plugin:3.6.1:go-offline
COPY src /app/src
RUN ./mvnw package -Dnative

FROM quay.io/quarkus/quarkus-micro-image:2.0
WORKDIR /app/
COPY --from=build /app/target/*-runner /app/application

RUN chmod 775 /app /app/application \
  && chown -R 1001 /app \
  && chmod -R "g rwX" /app \
  && chown -R 1001:root /app

EXPOSE 8080
USER 1001

CMD ["./application", "-Dquarkus.http.host=0.0.0.0"]

この Dockerfile は複数段階のビルドを調整し、Quarkus アプリケーションを含む Docker イメージを生成します。この Dockerfile を実行して Docker イメージを生成し、Quarkus アプリケーションを実行できるようにします。

まとめ

GraalVM Native Image は、Java マイクロサービスの開発とデプロイの方法に革命をもたらす強力なテクノロジーです。 GraalVM Native Image を採用すると、次のようなマイクロサービスを作成できます。

  • もっと早く
  • よりスケーラブル
  • 導入が簡単
  • よりコスト効率が高い

GraalVM ネイティブ イメージは、クラウド ネイティブ Java 開発を実現する重要な要素であり、ビジネスが求めるパフォーマンス、スケーラビリティ、コスト削減の達成に役立ちます。

リリースステートメント この記事は次の場所に転載されています: https://dev.to/yanev/turbocharge-java-microservices-with-quarkus-and-graalvm-native-image-2cb4?1 侵害がある場合は、[email protected] までご連絡ください。それを削除するには
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3