こんにちは、みんな! これは Quarkus に関するシリーズの XNUMX 番目の投稿です。今日はネイティブ コンパイルについて話します。
また、以下で説明するようにネイティブ コンパイルは重要ですが、スタック全体に実装したパフォーマンスの向上のおかげで、Quarkus は最も一般的な Java マシンである OpenJDK Hotspot 上で非常にうまく動作することに注意してください。 したがって、ネイティブ コンパイルは、必要に応じて使用できる追加のボーナスとして考慮する必要があります。 実際、Quarkus はネイティブ イメージに関して OpenJDK に大きく依存しています。 また、開発者に広く受け入れられている開発モードでは、ホットスポットに実装された動的コード実行の高度な機能により、ほぼ瞬時に変更をテストできます。 さらに、ネイティブ GraalVM イメージを作成するときは、OpenJDK クラス ライブラリと HotSpot 機能が使用されます。
すべてがすでに完全に最適化されているのに、なぜネイティブ コンパイルが必要なのでしょうか? 以下ではこの質問に答えていきます。
明らかなことから始めましょう: Red Hat には、プロジェクト開発中に JVM、スタック、フレームワークを最適化した豊富な経験があります
- プラットフォーム上のクラウドで動作する最初のアプリケーション サーバー
Red Hat OpenShift . - コンピュータ上で実行される最初のアプリケーション サーバー
PCを接続する . - 最初に実行するアプリケーション サーバー
ラズベリーパイ . - デバイス上で実行されるさまざまなプロジェクト
Android .
私たちは長年にわたって、クラウドやリソースに制約のあるデバイス (IoT) で Java アプリケーションを実行するという課題に取り組んできて、パフォーマンスとメモリの最適化の点で JVM を最大限に活用する方法を学びました。 他の多くの人と同様に、私たちは長い間 Java アプリケーションのネイティブ コンパイルに取り組んできました。
これらの長所と短所を考慮することがなぜ重要なのでしょうか? 場合によっては、それらの比率が決定的なものになるためです。
- たとえば、サーバーレス/イベント駆動型環境では、
サービスは開始するだけで済みます イベントに応答する時間を確保するために、(ハードまたはソフト)リアルタイムで。 存続期間の長い永続サービスとは異なり、ここではコールド スタートの期間により、リクエストに対する応答時間が大幅に増加します。 JVM の起動には依然としてかなりの時間がかかります。場合によっては純粋なハードウェア方法で短縮できますが、5 秒と XNUMX ミリ秒の差が生死を分ける可能性があります。 はい、ここで Java マシンのホット リザーブの作成を試すことができます (たとえば、OpenWhisk を Knative に移植 ) しかし、これ自体は、負荷が増加したときにリクエストを処理するのに十分な JVM があることを保証するものではありません。 そして経済的な観点から見ると、これはおそらく最も正しい選択肢ではありません。 - さらに、よく現れる別の側面として、マルチテナントがあります。 JVM はその機能においてオペレーティング システムに非常に近づいているにもかかわらず、Linux で慣れ親しんでいるプロセスの分離を行うことはまだできません。 したがって、XNUMX つのスレッドに障害が発生すると、Java マシン全体がダウンする可能性があります。 多くの人は、障害の影響を最小限に抑えるために、各ユーザーのアプリケーションに個別の JVM を専用にすることで、この欠点を回避しようとします。 これは非常に論理的ですが、スケーリングにはあまり適合しません。
- さらに、クラウド指向アプリケーションの場合、ホスト上のサービスの密度が重要な指標となります。 方法論への移行
12 のアプリケーション要素 、マイクロサービス、Kubernetes により、アプリケーションごとの Java マシンの数が増加します。 つまり、一方では、これらすべてが弾力性と信頼性を提供しますが、同時にサービスの観点からベースメモリの消費も増加し、これらの費用の一部は必ずしも厳密に必要であるとは限りません。 ここで、静的にコンパイルされた実行可能ファイルは、最終イメージにサービスが実際に使用するフレームワークの部分 (JDK 自体を含む) のみが含まれる場合、低レベルのデッドコードの除去などのさまざまな最適化手法によって恩恵を受けます。 したがって、Quarkus ネイティブ コンパイルは、セキュリティを損なうことなくサービス インスタンスをホスト上に高密度に配置するのに役立ちます。
実際、Quarkus プロジェクト参加者の観点からネイティブ コンパイルの正当性を理解するには、上記の議論だけで十分です。 しかし、技術的ではない、しかし重要な理由がもう XNUMX つあります。近年、多くのプログラマーや開発会社が Java を放棄し、新しいプログラミング言語を選択しています。これは、Java は、その JVM、スタック、フレームワークとともに、あまりにも重要なものになったと考えられています。メモリを大量に消費する、遅すぎるなど。
ただし、問題を解決するために同じツールを使用する習慣は、
出所: habr.com