はじめに
新しくNASを立ち上げようと考えているのですが、構成に迷っています。RAMが128GBあるので120Gくらいはキャッシュに割り当てることができます。そのためwrite-backなキャッシュをRAM上において超高速で読み”書き”できるようにしたいです。これを実現するにはbcacheを使えば確実にできそうな感じですが、ZFSでできるのかはパット調べた感じ、わからなかったのでここにまとめます。
ZFSのキャッシュ・バッファの種類
ZFSにはARC、L2ARC、ZIL、SLOGのような複数種類のキャッシュ的なものが存在します。
ARC (Adaptive Replacement Cache)
メモリ上に置かれる読み書き用のキャッシュです。
L2ARC (Level 2 Adaptive Replacement Cache)
SSD等に配置するARCの拡大用のキャッシュです。
ZIL (ZFS Intent Log)
同期書き込み時に使用されるジャーナル的なものです。ストレージプール中に配置されます。ここへの書き込みが完了した時点で同期書き込みは終了となります。障害が発生してTXGが失われても不揮発性のZILは保管されるので同期書き込みは完遂されたこととなります。TXGの書き込みがされるとZILからその書き込まれたデータ分の情報は削除されます。
SLOG (Seperate Intent Log)
ZILをzpool外に配置した時の呼び方です。ストレージプールがHDDでSLOGがSSD等だと同期書き込みの速度向上が期待できます。アルゴリズムも変わってより高速になるようです。
TXG (Transaction Group)
ファイルの変更の情報のパケットみたいなものです。メモリ上に配置されます。まとまった大きさor時間経過で実際にディスクに書き込みます。
同期書き込み/非同期書き込み
すべて同期書き込み、すべて非同期書き込み、要求によって変更、の3種類から選べるようです。
同期書き込みの流れ
同期書き込みは実際にディスクに書き込まれたことを確認する書き込み方法です。
書き込み要求
↓
ARC(揮発性)
↓
ZIL作成(不揮発性)
↓
書き込み完了を通知する
↓
TXG作成(揮発性)
↓
ディスクに書き込み(不揮発性)
↓
ZILを削除
非同期書き込みの流れ
書き込み要求
↓
ARC(揮発性)
↓
書き込み完了を通知
↓
TXG作成(揮発性)
↓
ディスクに書き込み(不揮発性)
ARCは読み込み専用なのか、読み書きなのか?
調べているとRead専用と書かれていることが多かったので、本当にそうなのか、ソースコードレベルで調べてみました。
zfs_vnops.c中のzfs_write()の中身です。
dmu_request_arcbuf() ← ARC buffer確保(abuf)
zfs_uiocopy() ← ユーザー空間からARCにコピー
dmu_tx_create() / assign() ← TX作成
dmu_assign_arcbuf_by_dbuf() ← ARC buffer(abuf)をデータバッファ(dbuf)に接続
zfs_log_write() ← ZILログ記録(sync用)
dmu_tx_commit() ← TXコミット
dbufがdiryだとtxgが作成されるようです。
Direct I/Oモードもありますが、データーベースのようなアプリケーション側でキャッシュを持っている場合などに使用されるものらしいです。
おわりに
書き込みにARCを使うことが分かったうえに、かなりよさそうな雰囲気なので、ZFSを使ってみようと思います。