Skip to content

Journal Region

Takeru Ohta edited this page Oct 22, 2018 · 4 revisions

Overviewに記載の図を見て貰えば分かる通り、CannyLSの永続化領域は、大まかにはジャーナル領域データ領域に区分されている(Storage Formatも参考となる)。

ジャーナル領域は、リングバッファ形式で表現されており、ストレージに対する更新系操作(e.g., PUT、DELETE)が発行される度に、対応する実行ログ(レコード)がリングバッファの末尾に追記されていくことになる。 データ領域にはPUTされたlumpのデータのみが格納されるが、その格納位置の情報は、ジャーナル領域に追記されるPUTレコード内に保持されている。ただし埋め込みlumpの場合には、例外的にlumpの全ての情報がジャーナル領域に保持されることになる。

ジャーナル領域内のリングバッファに対しては、通常処理を阻害しない範囲でインクリメンタルなGCが定期的に実行される(詳細はJournal Region GCを参照)。 また性能向上目的で、追記対象のレコード群が直接ディスクに書き出されるのではなく、一時的にメモリ上のバッファに蓄積されることがある(詳細はJournal Memory Bufferを参照)。

ジャーナル領域とデータ領域が分かれている理由

いわゆるログ構造ファイルシステムのナイーブな実装では、CannyLSのデータ領域相当のものが存在せず、保存対象データのジャーナルに追記していくことが多い。

この(データ領域が存在しない)方式には、PUT時のディスクアクセス回数を減らせる(一回だけで良い)という利点はあるが、反面ジャーナル領域のGCの際に移動するデータのサイズが大きくなってしまうため、GCのコストが高くなる、という問題がある。特にCannyLSの場合は、もともと大き目のデータサイズを想定していることもあり、この影響は無視できないものとなる。

そのためCannyLSでは、ジャーナル領域とは別に、データ領域というlumpデータ格納用の専用領域を用意することで、ジャーナル領域のGCのコストを軽減し、それが他の通常操作の実行を阻害しないようにしている。

この選択によって、CannyLSではlumpのPUT時に二回のディスクアクセスが必要となってしまっている。ただし、データサイズが小さいlumpに関しては埋め込みlumpを使用することで、ディスクアクセス回数を一回に減らすことが可能となっている。またジャーナルメモリバッファを有効にすれば、大抵のジャーナル領域へのレコード追記はメモリ上で完結することになるため、実質上、更新系操作実行時のディスクアクセス回数を一回減らせることになる。