OpenZFSの重複排除とは何か?
- 重複排除の定義: OpenZFSでは、データをディスクに書き込む前に、そのデータがすでにディスク上に存在するかを確認し、存在する場合は新たに書き込まず、既存のコピーへの参照を追加する仕組み。
- 重複排除の課題: データがすでにディスク上にあるかどうかを確認し、その場所を把握するのは難しい。これには追加の入出力(IO)が必要で、その結果として性能低下が起こりうる。
重複排除はどのように動作するのか?
- 動作方式: 重複排除が有効になると、データブロックが準備され、チェックサムが計算される。従来はメタスラブアロケータが領域を割り当てていたが、重複排除が有効な場合はチェックサムを重複排除テーブルで検索する。
- 重複排除テーブル: チェックサムをキーとし、ディスク上の位置と参照数を値とするハッシュテーブル形式で保存される。これはプールメタデータの一部と見なされる。
従来の重複排除の問題点
- 重複排除テーブルの問題: 従来の重複排除は、OpenZFSのディスクハッシュテーブルオブジェクトを使って実装されている。これは複雑な構造で、重複排除のような用途には適していない。
- メモリ使用量: 重複排除テーブルの読み込みはARCにキャッシュされるため、十分なRAMがあればテーブル更新時の読み取り部分を減らせる。
- ユニーク項目の問題: 重複排除テーブル内でユニークな項目を追跡するための領域が問題となる。参照数が1のブロックも重複排除テーブル内で容量を占有し、同じデータが再び書き込まれなければそのコストを回収できない。
FastDedupはどのように問題を解決するのか?
- ライブ項目リストの縮小: メモリ使用量を減らすため、ライブ項目リストのメモリフットプリントを小さくする。新しい重複排除テーブルでは、項目の「値」部分が72バイトまで削減された。
- 重複排除ログ: ライブ項目リストの代わりにログを使って変更を記録し、クラッシュ復旧時にはログを再生する。ログはメモリ上に保存され、高速な検索を可能にする。
- 増分ログフラッシュ: ログサイズを管理するため、毎トランザクションごとにログの一部をZAPへ書き込む。メモリ圧迫時にはログフラッシュを加速する。
GN⁺のまとめ
- OpenZFSの新しい「FastDedup」機能は、従来の重複排除が抱えていた問題を解決するために開発された。メモリ使用量を抑えつつ、ログによって効率的なデータ管理を可能にする。
- 重複排除は特定のワークロードでのみ有効であり、一般用途では依然として非効率な場合がある。これは重複排除テーブルの管理オーバーヘッドが大きいため。
- 類似機能を持つ別のプロジェクトとしてはBtrfsの重複排除機能があり、他のファイルシステムにおける代替手段となりうる。
1件のコメント
Hacker Newsの意見
タイトルに惹かれてクリックしたが、ZFSには関心がなかったにもかかわらず、ほぼすべての記事を読んでしまった。文章は明快に説明されており、特にモバイル向けのCSSテーマが気に入った。簡潔な要約は記事の下部にある。
copy_file_rangeの議論に加えて、ファイルシステムで同一ハッシュを持つ1MB以上のファイルを見つけ、選択的に重複排除を適用できるとよい。従来の重複排除の問題はオーバーヘッドが大きすぎて、特定のワークロードを除いては効果を得にくいことだ。PureやDell/EMCのアレイで、VMWareワークロードに対して3:1の重複排除/圧縮削減効果を見たことがある。
重複排除の効果は、ハッシュ化されるブロックのサイズに大きく左右される。ブロックが小さいほど一致するブロックが存在する可能性が高くなる。個人的には4KBのブロックサイズを好む。
「オフライン」の重複排除や「遅延」重複排除を望む。重複排除が有効になると、すべての書き込みと解放処理で重複排除テーブルへの参照と書き込みが必要になる。データ書き込み時には素早く完了してほしい。
高速な重複排除に大いに期待している。ArchiveBoxデータでZFS重複排除を使いたかった。多数のURLをアーカイブし、ファイルシステムがすべてを圧縮することが可能になりそうだ。
個人アーカイブでZFS重複排除を使ってきたが、現在ディスク容量を3分の1に減らせている。ZFSは信頼性の面で非常によく機能しており、データ損失の防止に役立った。
一般的な重複排除は理論上は優れているが、実際にはうまく機能しない。IPFSは可変サイズのチャンクを使ってデータの重複排除を試みているが、実際には差がなく、複雑さが増すだけだ。
ディスクコントローラの専用ハードウェアが、ECCのような計算のためにブロックのハッシュをシステムへ公開できるよう改善されるとよい。
ファイルシステムのAPIがまったく別の形であってほしい。すべてのOSのファイルシステムAPIは、互換性のために固定化されている。
書き込み性能が重要なら、書き込み時に重複排除を行う必要はない。重複排除は後から、並行して、低優先度で実行すればよい。