2.2. JVM の設定

2.2.1. ヒープサイズと GC の構成

最適なパフォーマンスを得るには、JVM のメモリ使用を適切に構成することが不可欠です。実際、構成の不適切な JVM では、すべての CPU 時間をガベージコレクションに消費してしまうこともあります (つまり、すべてのスレッドが何も作業できない状態になります)。適切なセットアップの方法を見つけるには、遅延、総合的なスループット、および利用可能なハードウェアなど、さまざまな要件を考慮する必要があります。実働環境では、サーバーモードの JVM を使用し、マルチコア/CPU プラットフォーム上で Neo4j を実行する必要があります。

2.2.1. ヒープサイズと GC の構成

ヒープが大きければノードとリレーションのキャッシュを大きくとることができ、これはこれでよいことなのですが、その一方で、ヒープが大きいと、フルガベージコレクションに起因する遅延の問題が生じる可能性があります。Neo4j で利用可能なさまざまな高レベルキャシュの実装と、ヒープサイズとガベージコレクション (GC) を適切に構成した JVM を上手に組み合わせれば、ほとんどの作業負荷に対応できるはずです。

デフォルトキャッシュ (soft 参照ベースの LRU キャッシュ) は、ヒープを決して使い切ることがない場合、すなわち最もよく使われるノードとリレーションをキャッシュできるグラフの場合には、最適の選択肢です。ヒープを使い切ってしまうことが多い場合には、フル GC がトリガされるリスクがあり、ヒープが大きければ大きいほど、クリアすべき soft 参照を決定するのにそれだけ多くの時間がかかります。

strong 参照キャッシュを使用することは、使われる「すべての」ノードとリレーションが、利用可能なヒープに収まらなければならないことを意味します。ヒープに収まらないと、OutOfMemoryException が発生するおそれがあります。soft 参照キャッシュと strong 参照キャッシュは、全体的なスループットが重要なアプリケーションに適しています。

weak 参照キャッシュは、基本的に、アプリケーションのピークロード、具体的には、ピークロードにリクエストごとに必要とされる平均メモリを乗じたものに対応できるだけの十分なヒープが必要となります。weak 参照キャッシュは、GC による処理の中断が許容できないような低遅延要件を持つアプリケーションに適しています。

Windows 上で Neo4j を実行する場合には、メモリマップバッファがデフォルトでヒープ上に割り当てられること、したがって、ヒープサイズの決定時にメモリマップバッファのことを考慮に入れる必要があることに注意してください。

表2.1 ヒープサイズに関するガイドライン

プリミティブの数RAM サイズヒープ構成オペレーティングシステム用予約 RAM

10M

2GB

512MB

残り

100M

8GB+

1-4GB

1-2GB

1B+

16GB-32GB+

4GB+

1-2GB


実働環境で Neo4j を実行する場合に使用が推奨されるガベージコレクタは、JVM のパラメータで -XX:+UseConcMarkSweepGC を指定して有効にされる Concurrent Mark and Sweep Compactor (CMS コレクタ) です。