JVM設定
JVMを最適化することは、Solrインストールを最大限に活用するための重要な要素となる可能性があります。
JVMの設定は複雑なトピックであり、このドキュメントで完全に議論することはできません。幸いなことに、最新のJVMのほとんどは、デフォルト設定で利用可能なリソースを最大限に活用することに非常に優れています。以下のセクションでは、デフォルトがお客様の状況に最適ではない場合に役立つ可能性のあるいくつかのヒントを説明します。
Solrのパフォーマンス向上に関する一般的な情報については、Solr WikiのSolrパフォーマンス要因を参照してください。
メモリヒープ設定の選択
最も重要なJVM構成設定は、JVMに割り当てられたヒープを制御します。-Xms
は、JVMのメモリヒープの初期サイズを設定し、-Xmx
は、ヒープの最大サイズを設定します。これらの2つのオプションを同じ値に設定するのが一般的な方法です。
ヒープサイズは非常に重要であり、残念ながら「すべてのサイズに適合する」ソリューションはありません。データとアプリケーションでテストする必要があります。正しいサイズを決定する最良の方法は、ログディレクトリにあるガベージコレクション(GC)ログを分析することです。これらのログを分析し、特にGCが完了した後に使用されるメモリ量を示すのに役立つさまざまなツールがあります(GCViewerとGCEasyの2つ)。また、Solrが実行されているときにjconsole(ほとんどのJavaランタイムに付属)を接続して、メモリ消費量を確認することもできます。これにより、必要な最小限のメモリ量が絶対的に示されます。25〜50%の「ヘッドルーム」を追加するのが妥当な出発点です。
留意すべき点がいくつかあります。
-
ヒープに割り当てられた「ヘッドルーム」が少なすぎる状態でSolrを実行すると、継続的なGCによって過剰なリソースが消費される可能性があります。したがって、上記の25〜50%の推奨事項があります。
-
SolrはMMapDirectoryを広範囲に使用しており、これにより、Luceneインデックスの大部分について、JVM用に予約されていないRAMを使用します。したがって、この目的のためにオペレーティングシステムが使用できるように、できるだけ多くのメモリを確保する必要があります。
-
割り当てられたヒープは、良好なパフォーマンスを維持しながら可能な限り小さくする必要があります。8〜16GBは非常に一般的であり、より大きなヒープが使用されることもあります。ヒープがより大きなサイズに拡大する場合は、本番環境に移行する前に広範囲にテストすることが不可欠です。
-
G1GCガベージコレクターは、現在、それをサポートするJVM(Java 9以降)を使用する場合に推奨されます。
-
現代のハードウェアは、数百ギガバイトの物理RAMと多数のCPUで構成できます。このような場合、各JVMにヒープに割り当てるメモリ量を制限して、複数のJVMを実行する方が良いことがよくあります。これを実現する1つの方法は、SolrをDockerコンテナとして実行することです。
-
GCログを定期的に再分析したり、メトリクスレポートで監視したりして、アプリケーションの変更、ドキュメント数の変更などによりメモリ使用量が変化していないか確認することをお勧めします。
-
Solrは、OutOfMemoryError例外が発生した場合にJVMをクラッシュさせるオプション付きで実行されます。これにより、システムリソースが枯渇した場合に、不確定な状態で続行するのではなく、Solrを強制的に停止させます。
solr.in.sh
の値を通じて、OOME発生時にヒープダンプを要求することもできます。 -
現在のすべての(Java 11)ガベージコレクタは、「stop the world」コレクションにヒットする可能性があり、完了するまでJVMを中断します。モニタリングを通じて、これらのガベージコレクションが頻繁であり、アプリケーションが許容できる範囲を超えている場合は、追加のチューニングを検討する必要があります。「stop the world」のポーズが5秒を超えることはまれにしか許容されず、1秒未満にすることが望ましいです。
特定のケースにおける詳細については、JVMベンダーのドキュメントを参照してください。上記は開始点として意図されています。
Server HotSpot VMを使用する
SunのJVMを使用している場合は、Solrを起動するときに-server
コマンドラインオプションを追加します。これは、長期間実行されるサーバープロセスに最適化する必要があることをJVMに指示します。システム上のJavaランタイムが、完全なJDKディストリビューション(javac
やその他の開発ツールを含む)ではなく、JREである場合、-server
JVMオプションをサポートしていない可能性があります。これをテストするには、java -help
を実行し、表示された使用メッセージで-server
が利用可能なオプションとして存在するかどうかを確認します。