Neo4j データベースにおける Page Cache について説明します。
Neo4j データベースは、データベースマネジメントシステム(以下:DBMS)ですので、データはディスク上に保存します。ですが、ユーザーから問い合わせがある度にディスク上から読み込んでいては大変遅いです。また、書き込みの性能も出ません。
そこで、パフォーマンスを向上させるために様々な工夫が凝らされているのですが、そのうちの一つが Page Cache です。
Page Cache は、一言で言うと「メモリ上に保存されたキャッシュ」です。メモリ上に保存されているので、ディスク上にあるデータを都度読み書きするより圧倒的に早いです。
ちなみに、Neo4j においては、ノードのデータもリレーションのデータもいずれも Page Cache にキャッシュされます。
基本的にはキャッシュです。ディスク上にある全てのデータをメモリ上に保持することはサイズの都合上不可能ですので、キャッシュが溢れたときに、既存の使われないエントリーを Eviction させる必要が出てきます。
発生した Eviction の数は、後述するメトリクスのうち <prefix>.page_cache.evictions
で計測可能です。どれくらいのキャッシュがヒットしたかを示す別のメトリクス <prefix>.page_cache.hit_ratio
などと合わせて計測すると、Page Cache がどれくらい有効活用されているかについて理解することができます。
Page Cache のサイズは、dbms.memory.pagecache.size
で設定可能です。
例えば、4GB
のメモリを Page Cache に割り当てたい場合は、以下のように設定します。
dbms.memory.pagecache.size=4GB
Page Cache を利用している時に気になってくるのが、どれくらいメモリ上のキャッシュが有効活用されているかです。
Neo4j データベースでは、Page Cache に関するメトリクス を取得可能です。
主なものとしては、どれくらいのキャッシュがヒットしたかを示す <prefix>.page_cache.hit_ratio
を確認すると良いでしょう。
合わせて、Eviction の発生件数を示す <prefix>.page_cache.evictions
も利用できます。
IOPS の状況については、<prefix>.page_cache.iops
メトリクスで取得可能です。
Page Cache は、Copy-On-Write 方式です。つまり、実際にそのデータに問い合わせがあったタイミングで初めて、オンデマンドでディスク上から読み込み、メモリ上にある Page Cache に移します。
ということは、Neo4j データベースが起動した直後は、Page Cache は空の状態です。従って、最初の方に届いた読み込みリクエストは、Page Cache が暖まるまではディスク上からの読み込みになるので、レイテンシーに悪影響が出ます。
これが問題となるような要件のアプリケーションでは、事前に別プロセスから偽の読み込みクエリを実行するなどして、Page Cache を暖めておくのも手の一つです。
NOTE: Enterprise Edition では
dbms.memory.pagecache.warmup.enable
という設定が可能です。
以上、Neo4j データベースにおける Page Cache の概要、および設定方法や取得可能なメトリクスについて紹介しました。