ZFSインテントログ(ZIL)
Solaris ZFSのZILについて調べた。参考にしたのはSunのソフトウェアエンジニアのブログ記事である。
ZFS: The Lumberjack( Neil Perrin's Weblog)
http://blogs.sun.com/perrin/#the_lumberjack
slog blog (or blogging on slogging)
http://blogs.sun.com/perrin/entry/slog_blog_or_blogging_on
The ZFS Intent Log(Neelakanth Nadgir's blog)
http://blogs.sun.com/realneel/entry/the_zfs_intent_log
ZFSの書き込みは、ディスク上で常に一貫性を保つように、DMUトランザクションとして扱われる(DMU = Data Management Unit)。DMUトランザクションは、全て反映されるか全く反映されないかのどちらか一方しかない(アトミック性)。
DMUトランザクションは主メモリ上でトランザクショングループにまとめられる。トランザクショングループがコミットされるのは、おおむね数秒間隔である。トランザクションをそのままディスクに反映せずにトランザクショングループにまとめるのは、書き込み性能を向上させるためである。
ファイルシステムをO_DSYNCでオープンしたり、fsync()を実行したりして同期書き込みを行うことがある。典型的なアプリケーションはデータベースである。同期書き込みは、更新データがstable storageに書き込まれたあとでアプリケーションにreturnすることを要請する。トランザクショングループがコミットされるまで待つと性能が悪化してしまう。これを解決するのがZFS Intent Log(ZIL、ZFSインテントログ)である。
ZILはディスク(HDDもしくはSSD)に置く。すなわちstable storageである。ZILに書き込まれるのは未コミットのトランザクションである。コミットされたトランザクションはZILから削除される。上記の同期書き込みのシナリオで考えると、トランザクションをZILに書き込んだ時点でstable storageに格納したと考えることができるので、すぐにアプリケーションにreturnしてよい。これにより同期書き込みの性能を向上させる。
64KB以下の書き込みは、データ自体がZILのログレコードに書き込まれる。64KBを超えるサイズの書き込みデータは、ディスクに同期したあとで、同期したデータへのポインタだけがログレコードに書き込まれる。
ZILは通常、メインプールの中に動的に割り当てられる。これを別デバイスに配置することができる(zpool add <pool> log <log devices>)。SSDのような高速デバイスに配置すると性能向上が期待できる。非ミラー構成のSSD ZILデバイスが故障したり、slogデバイスが満杯になったら、メインプールの領域を使う。
| 固定リンク
この記事へのコメントは終了しました。
コメント