11.8. パフォーマンスチューニング
11.8.1. SYNC モードでのバッチ書き込み
デフォルトでは、Index Managers は sync モードで動作します。つまり、データが Data Grid に書き込まれると、インデックス操作が同期的に実行されます。この同期性により、インデックスは常にデータと整合性が保たれます (したがって、検索で表示されます) が、インデックスへのコミットも実行されるため、書き込み操作が遅くなる可能性があります。Lucene ではコミットは非常にコストのかかる操作であるため、異なるノードからの複数の書き込みを自動的に 1 つのコミットにバッチ処理して、影響を軽減できます。
したがって、インデックスを有効にして Data Grid にデータを読み込む場合は、複数のスレッドを使用してこのバッチ処理を活用してみてください。
複数のスレッドを使用しても必要なパフォーマンスが得られない場合は、インデックスを一時的に無効にしてデータをロードし、後で 再インデックス化 操作を実行することもできます。これは、SKIP_INDEXING
フラグを使用してデータを書き込むことで実行できます。
cache.getAdvancedCache().withFlags(Flag.SKIP_INDEXING).put("key","value");
11.8.2. 非同期モードを使用した書き込み
データ書き込み間のわずかな遅延が許容可能であり、そのデータがクエリーに表示される場合は、インデックスマネージャーを非同期モードで動作するように設定できます。非同期モードでは、設定可能な間隔でコミットが行われるため、書き込みパフォーマンスが大幅に向上します。
設定:
<distributed-cache name="default"> <indexing> <!-- Index data in async mode --> <property name="default.worker.execution">async</property> <!-- Optional: configure the commit interval, default is 1000ms --> <property name="default.index_flush_interval">500</property> </indexing> </distributed-cache>
11.8.3. インデックスリーダーの非同期ストラテジー
Lucene は、内部的にインデックスのスナップショットと連携します。IndexReader
が開かれると、開いた時点までのインデックスの変更のみが表示されます。IndexReader
が更新されるまでさらにインデックスの変更は表示されません。Data Grid でデフォルトで使用されるインデックスマネージャーは、すべてのクエリーの前にインデックスリーダーが更新されているかをチェックし、必要に応じてそれらを更新します。
async
として設定された reader.strategy
設定を使用すると、このストラテジーを調整して、この更新チェックを事前設定された間隔に緩和することができます。
<distributed-cache name="default"> <indexing> <property name="default.reader.strategy">async</property> <!-- refresh reader every 1s, default is 5s --> <property name="default.reader.async_refresh_period_ms">1000</property> </indexing> </distributed-cache>
11.8.4. Lucene オプション
Lucene でチューニングオプションを直接適用することが可能です。詳細は、Hibernate Search マニュアル を参照してください。