「Java ZGCアルゴリズムのチューニング」

Java ZGC Algorithm Tuning

ZGCは、Javaアプリケーションで大規模なヒープの管理と一時停止の最小化に特化したガベージコレクタです。メモリ集中型のワークロードと一貫した応答時間が重要なシナリオでのガベージコレクションの課題に取り組んでいます。並行処理能力と高度なアルゴリズムを活用して、ZGCはモダンなJavaアプリケーションのパフォーマンスを最適化する効果的なソリューションを提供します。この記事では、特にパフォーマンスを向上させるためのZGCのチューニング技術を探っていきます。ただし、ガベージコレクションのチューニングの基礎をもっと学びたい場合は、このJAX Londonのカンファレンストークをご覧ください。

ZGCのチューニングパラメータ

ZGCは、Javaのガベージコレクタであり、公開されるJVMパラメータの数を最小限に抑えることでチューニングの手法を異ならせています。細かい調整が必要な従来のガベージコレクタとは異なり、ZGCは大規模なヒープサイズの管理を最適化し、効率的なガベージコレクションを提供することに重点を置いています。このシンプルなアプローチにより、開発者はチューニングにおいて主にヒープサイズという1つの重要なJVMパラメータに集中することができます。

1. ヒープサイズ(-Xmx<size>)

「ヒープサイズ」パラメータは、ZGCのチューニングにおいて重要なオプションです。これは、Javaアプリケーションの実行中にオブジェクトがメモリに格納されるJavaヒープの最大メモリ割り当て量を決定します。

ZGCのヒープサイズを設定する際には、いくつかの要素を考慮する必要があります。まず、ヒープがアプリケーションのライブセットを収容できるようにする必要があります。ライブセットには、実行時にアクティブに使用されるすべてのオブジェクトが含まれます。ヒープサイズが小さすぎると、頻繁なガベージコレクションと増加した一時停止時間が発生する可能性があります。なぜなら、ZGCはメモリを回収するためにより頻繁に実行する必要があるからです。

一方、ヒープサイズが大きすぎると、メモリリソースが無駄になる可能性があります。メモリ使用量とガベージコレクションの頻度との間のバランスを取ることが重要です。具体的な最適なヒープサイズは、アプリケーションのメモリ要件、ライブセットのサイズ、およびシステム全体のメモリの利用可能性などの要素に依存します。

ヒープサイズを指定するには、Javaアプリケーションの起動時に-Xmx<size>フラグを使用し、<size>には設定したいヒープサイズを表す値を指定します。たとえば、-Xmx32gは最大ヒープサイズを32ギガバイトに設定します。

2. 並行GCスレッド(-XX:ConcGCThreads=<number>)

ZGCのもう1つの興味深いチューニングオプションは、並行ガベージコレクション(GC)スレッドの数です。これは-XX:ConcGCThreads=<number>フラグを使用して設定することができます。ZGCには、アプリケーションの特性に基づいて最適なスレッド数を自動的に選択するヒューリスティクスが組み込まれています。ZGCのデフォルトのヒューリスティクスは、ほとんどのシナリオでうまく機能します。ただし、アプリケーションの具体的な動作や要件に応じて、並行GCスレッドの数を調整する必要がある場合もあります。このパラメータはガベージコレクタに割り当てられるCPU時間を決定します。スレッド数が多すぎると、GCによるCPU使用率が過剰になり、アプリケーションから貴重なリソースを奪い取ります。一方、スレッド数が少なすぎると、GCのパフォーマンスが低下する可能性があります。

JDK 17以降、ZGCは動的なスケーリングにより、並行GCスレッドの数を自動的に調整する機能が導入されました。これにより、このパラメータを手動でチューニングする必要が少なくなります。

3. 大きなページの有効化(-XX:+UseLargePages)

ZGCを大きなページを利用するように構成すると、スループットが向上し、レイテンシが低下し、起動時間が改善されます。大きなページは、Linux/x86システムで2MBのサイズを持つものです。大きなページは、標準のページサイズよりも大きいメモリページです。メモリ管理のオーバーヘッドを削減し、メモリアクセスの効率を向上させるなどの利点があります。

ZGCで大きなページを有効にするには、JVMで-XX:+UseLargePagesオプションを構成する必要があります。

注意:大きなページを有効にするには、オペレーティングシステムレベルで特定の設定が必要です。この記事の範囲外である、大きなページプールへのメモリの割り当てやhugetlbfsファイルシステムの設定などの設定が必要です。

4. 透過的な有効化(-XX:+UseTransparentHugePages)

大きなページを明示的に使用する代わりに(上記で説明した方法とは異なり)、Transparent Huge Pages(THP)を使用することもできます。THPは、Linuxカーネルの機能であり、標準のメモリページをより効率的な大きなページに自動的に集約します。THPは、個々のページを管理するためのオーバーヘッドを減らすことで、メモリ管理の改善を目指しています。複数の標準ページを単一の巨大ページ(通常は2MBのサイズ)にグループ化することにより、THPはパフォーマンスを向上させる可能性があります。

JVMでTransparent Huge Pagesを有効にするには、-XX:+UseTransparentHugePagesオプションを使用します。これにより、Javaアプリケーションはオペレーティングシステムが管理する大きな集約メモリページを利用することができます。ただし、THPは特定のシナリオでレイテンシのスパイクを引き起こす可能性があり、レイテンシに敏感なアプリケーションには適していないことに注意してください。THPを有効にする前に、特定のワークロードとパフォーマンス要件への影響を評価することをおすすめします。

注意:カーネルレベルでTransparent Huge Pagesを設定および管理する場合、追加の手順が必要となる場合があります。具体的な詳細は、この記事の範囲外です。

5. NUMAサポートの有効化(-XX:+UseNUMA)

ZGCにはNUMAサポートがあり、Javaヒープの割り当てをNUMAローカルメモリに向けるように最善を尽くします。NUMAは、マルチソケットシステムで使用されるアーキテクチャ設計を指し、非一様なメモリアクセスを意味します。NUMAシステムでは、メモリが複数のメモリノードに分割され、各ノードが特定のプロセッサまたはソケットに関連付けられます。各プロセッサは、リモートメモリノードへのアクセスよりも独自のローカルメモリノードへのアクセスが速くなります。

ZGCはデフォルトでNUMAサポートを有効にし、NUMAアーキテクチャの利点を活用します。ローカルメモリノードを自動的に検出して利用し、メモリアクセスを最適化しパフォーマンスを向上させます。ただし、JVMが単一のNUMAノードでメモリを使用することに制約されている場合、NUMAサポートは無効になります。

ほとんどの場合、明示的にNUMAサポートを設定する必要はありません。ただし、JVMの決定を上書きする場合は、次のオプションを使用できます:

NUMAサポートを明示的に有効にするには:-XX:+UseNUMA

NUMAサポートを明示的に無効にするには:-XX:-UseNUMA

注意:NUMAサポートは、マルチソケットのx86マシンや他のNUMAアーキテクチャを持つシステムで特に関連があります。単一ソケットまたは非NUMAシステムでは、パフォーマンスには大きな影響を与えない場合があります。

6. 未使用のメモリをオペレーティングシステムに返す(-XX:+ZUncommit)

ZGCは、大きなヒープサイズを効率的に管理するように設計されています。アプリケーションがそれを必要としない場合に大きなヒープサイズを割り当てると、効率の悪いメモリ使用量になる可能性があります。デフォルトでは、ZGCは未使用のメモリをアンコミットしてオペレーティングシステムに返します。この機能は、-XX:-ZUncommitを使用して無効にすることができます。

ZGCは、ヒープサイズが指定された最小ヒープサイズ(-Xms)よりも小さくならないように、メモリをアンコミットしないようにします。そのため、最小ヒープサイズが最大ヒープサイズ(-Xmx)と一致するように設定されている場合、アンコミット機能は暗黙的に無効になります。

未コミットメモリの管理に柔軟性を提供するために、ZGCではデフォルトで300秒のアンコミット遅延を設定できる-XX:ZUncommitDelay=<seconds>オプションがあります。この遅延は、メモリが未使用のままになる期間を指定し、アンコミットの対象になるまでの時間を決めます。

注意:アプリケーションが実行中にZGCがメモリをコミットおよびアンコミットすることは、アプリケーションの応答時間に影響を及ぼす可能性があります。ZGCを使用する際に非常に低いレイテンシを実現することが主な目標である場合は、最大ヒープサイズ(-Xmx)と最小ヒープサイズ(-Xms)の両方に同じ値を設定することをおすすめします。さらに、-XX:+AlwaysPreTouchオプションを利用すると、アプリケーションが開始する前にメモリを事前にページングするため、パフォーマンスが最適化され、レイテンシが低減されます。

ZGCの動作の調整

ZGCのパフォーマンス特性を学ぶためには、GCログの分析が最適です。GCログには、ガベージコレクションイベント、メモリ使用状況、その他の関連メトリクスに関する詳細な情報が含まれています。GCeasy、IBM GC&Memoryビジュアライザ、HP Jmeter、Google Garbage Catなど、GCログの分析を支援するためのさまざまなツールが利用可能です。これらのツールを使用することで、メモリ割り当てパターンを視覚化し、潜在的なボトルネックを特定し、ガベージコレクションの効率を評価することができます。これにより、最適なパフォーマンスを実現するためにZGCを微調整するための情報を得ることができます。

結論

まとめると、この投稿では、JavaアプリケーションでZGCのパフォーマンスを最適化するためのさまざまなJVMチューニングパラメータについて説明しました。これらのチューニングオプションを活用することで、開発者は特定の要件に基づいてZGCのパフォーマンスを最適化することができます。また、GCログを詳細に分析し、ZGCの動作を監視することで、パフォーマンス特性に関する貴重な情報を得ることができます。これらのチューニングパラメータを実験し、GCログを細かく監視することで、開発者はZGCのフルポテンシャルを引き出し、Javaアプリケーションの効率的なガベージコレクションを確保することができます。

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

AI研究

「ジョンズ・ホプキンス大学の研究者たちは、がんに関連するタンパク質フラグメントを正確に予測することができる深層学習技術を開発しました」

ジョンズ・ホプキンス大学のエンジニアとがん研究者は、最先端の深層学習技術を駆使して、個別のがん治療における画期的な突...

機械学習

マイクロソフトAIは、高度なマルチモーダルな推論と行動のためにChatGPTとビジョンエキスパートを組み合わせたシステムパラダイム「MM-REACT」を提案しています

大規模言語モデル(LLM)は急速に進化し、経済や社会の変革に貢献しています。インターネット上には多くの人工知能(AI)ツー...

機械学習

「POCOと出会う:3D人体姿勢と形状推定のための画期的な人工知能フレームワーク」

写真や動画から3D人体のポーズと形状(HPS)を推定することは、現実世界の設定で人間のアクションを再構築するために必要です...

データサイエンス

第四次産業革命:AIと自動化

イントロダクション 人類の絶え間ない未知の探求は、技術の進歩をもたらしてきました。AIと自動化から成る産業革命の到来が世...

AIニュース

「生成AIにおける高度なエンコーダとデコーダの力」

はじめに 人工知能のダイナミックな領域では、技術と創造性の融合が人間の想像力の限界を押し上げる革新的なツールを生み出し...

データサイエンス

LinkedInのフィード進化:より詳細かつパワフルな機械学習、そして依然として人間も重要

LinkedInのフィードとインフラの最新更新について読むと、人間を中心に据えた原則を技術用語と実装に繋げる方法が解説されて...