現代のソフトウェア開発のダイナミックな状況において、マイクロサービスはアーキテクチャ上のアプローチとして好まれています。この方法論には多くの利点がありますが、課題がないわけではありません。従来の JVM ベースのサービスには、メモリ使用量の多さ、起動時間の延長、CPU 使用率の高さなどの問題が伴うことがよくあります。これらの課題は技術的な側面に影響を与えるだけでなく、ソフトウェア ソリューションの実行と保守の全体的なコストに大きな影響を与える可能性がある財務上の影響も及ぼします。
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)。
図 1 – ネイティブ実行可能ファイルはほぼ瞬時に起動します (oracle.com)
GraalVM は、次の最適化を通じてメモリ フットプリントの削減に貢献します。
1.ロードされたクラスにメタデータがありません
GraalVM は、動的にロードされたクラスのメタデータを非ヒープ メモリに保存することを回避します。ビルド プロセス中に、必要なクラス情報が事前にロードされてリンクされるため、実行時の追加のメタデータの必要性が最小限に抑えられます。
2.プロファイリング データまたは JIT 最適化なし
バイトコードはすでにネイティブ コード内にあるため、GraalVM では JIT 最適化のためのプロファイリング データを収集する必要がなくなり、メモリのオーバーヘッドが削減されます。
3.絶縁技術
GraalVM は、ヒープをより小さな独立した「ヒープ」に分割するテクノロジーである Isolates を導入し、特にリクエスト処理シナリオの効率を高めます。
一般に、JVM で実行する場合と比較して、メモリ消費量が最大 5 倍少なくなります (図 2)
図 2 – Go または Java HotSpot(oracle.com) と比較したネイティブ実行可能ファイルのメモリ
結論として、GraalVM のネイティブ イメージ ユーティリティは、マイクロサービスによってもたらされる課題に対する革新的なソリューションを提供し、起動時間、メモリ フットプリント、CPU 使用率の問題に対処します。 GraalVM を採用することで、開発者は効率的で安全なだけでなく、優れたユーザー エクスペリエンスを提供するクラウドネイティブ Java アプリケーションを作成できます。
Quarkus サービスをネイティブ イメージにコンパイルするには、さまざまな方法が利用できます。この記事では、Quarkus ネイティブのビルド手順については深く掘り下げませんが、重要な手順の概要を説明します。
ネイティブ イメージの構築方法に進む前に、pom.xml ファイルに適切なネイティブ プロファイルを設定することが重要です。次のプロファイルを追加します:
<profiles> <profile> <id>native</id> <properties> <quarkus.package.type>native</quarkus.package.type> </properties> </profile> </profiles>
インストールされた 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 アプリケーションに不可欠なネイティブ イメージ機能のみに焦点を当てています。マンドレルを使用するには、次の手順に従います:
適切な Mandrel バージョンの Mandrel リポジトリを特定します
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 開発を実現する重要な要素であり、ビジネスが求めるパフォーマンス、スケーラビリティ、コスト削減の達成に役立ちます。
以上がQuarkus と GraalVM ネイティブ イメージを使用して Java マイクロサービスをターボチャージするの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。