ログ構造ファイルシステム
ログ構造ファイルシステム[1]またはログ構造化ファイルシステム[2](英: Log-structured file system)はデータやメタデータをログと呼ばれるリングバッファにシーケンシャルに書き込むファイルシステムである[3]。1988年にはじめてJohn K. OusterhoutとFred Douglisが設計を提案し、1992年にOusterhoutとMendel RosenblumがSpriteというUnix系分散オペレーティングシステム用に実装した[4]。
論拠
[編集]従来のファイルシステムは空間的局所性を意識したファイルの配置をして、光学ディスクや磁気ディスクで高いパフォーマンスを発揮するようにデータ構造をインプレースに変更するため、シークが比較的遅くなる傾向がある。
ログ構造ファイルシステムの設計はそのような従来のファイルシステムは現代的コンピューターの増え続けるメモリ容量によってI/Oのうち読み込みはほとんどメモリキャッシュから行われ、書き込みの方が重要になることによって効率的でははくなるという仮説に基づいている。したがってログ構造ファイルシステムは記憶媒体を環状ログとして扱い、ログの先頭からシーケンシャルに書き込んでいく。
これによって主に以下のような副作用が生じる:
- 光学ディスクや磁気ディスクは大きなシーケンシャルアクセスをまとめてシークのコストを最小化するため、そのようなディスクにおいての書き込みスループットが改善する。
- 書き込みはデータとメタデータの複数かつ年代順のバージョンになる。実装によってはタイムトラベルやスナップショットと呼ばれる機能として、古いファイルバージョンに名前を付けたりアクセスしたり出来る。バージョニングファイルシステムとこの点で非常に類似している。
- クラッシュからの回復がシンプルになる。次のマウント時にファイルシステムは不整合を修正するためにデータ構造全体を見る必要はなく、ログの最後の一貫した地点から状態を再構築できる。
しかしログ構造ファイルシステムはログの先頭が一周し末尾と重なった際にスペースの再利用をする必要がある。以降のログに新しい版が存在する場合は末尾を開放することができる。新しい版が存在しない場合はデータは先頭に移動し、追加される。
このガベージコレクションによる負荷を軽減するために、多くの実装では純粋なリングバッファを使用せず、記憶媒体をセグメントに分割する。ログの先頭は隣接していない開放済みのセグメントに伸びてゆく。空き容量が必要になったときは、最も使われていないセグメントが優先して再利用される。これによりガベージコレクションのI/O負荷は減少するが、ファイルシステムの空き容量が減少し限界が近づくにつれ徐々に非効率的になってゆく。
欠点
[編集]ログ構造ファイルシステムの設計原理は大きくなり続けるメモリキャッシュがほとんどの読み込みを最適化すると仮定している。この仮定は常に有効というわけではない。
- シークが比較的高価な操作である磁気メディアでは、従来のファイルシステムがインプレースな書き込みによって連続性を維持するようなファイルを断片化させてしまうログ構造ファイルシステムの読み込みは遅くなる可能性がある。
- シーク時間の無視できるフラッシュメモリでは、書き込み断片化が書き込みスループットにほとんど影響を及ぼさないため、ログ構造ファイルシステムはパフォーマンスにあまり寄与しない。さらにログの上にログを積み重ねていくのはアラインされていないアクセスによって消去を複数回行うことになるためあまり良いことではない[5]。
関連項目
[編集]脚注
[編集]- ^ 「ログ構造ファイルシステムの設計と実現」CRID 1571417127083511424
- ^ 「ログ構造化ファイルシステムNILFSの設計と実装」CRID 1050001337894451712
- ^ Arpaci-Dusseau, Remzi H.; Arpaci-Dusseau, Andrea C. (2014), Log-structured File Systems, Arpaci-Dusseau Books
- ^ John K. Ousterhout, Mendel Rosenblum. (1991), The Design and Implementation of a Log-Structured File System, University of California, Berkeley
- ^ Swaminathan Sundararaman, Jingpei Yang (2014), Don’t stack your Log on my Log, SanDisk Corporation