2013年第1四半期のFreeBSDステータスレポートが公開されました。報告されている中から、
src
- UFS/
FFS Performance Work Kirk McKusick氏がUFS2/
fsckのパフォーマンスをさらに引き上げる改善をFreeBSD 10-CURRENTへマージしました。基本的なアイディアは2013年にFAST 2013で発表された 「ffsck: The Fast File System Checker [pdf]」 という論文の内容に基づいています。この発表を聞いたKirk McKusick氏は、 そのアイディアをベースにすればさらに性能の改善が見込めることに気がつき、 興奮ぎみに昼食を取るのも忘れてすぐに100行程度の改善コードを書いたとしています。 ffsck: The Fast File System Checker [pdf]は、
Linux ext3のfsck(8)にかかる時間を短縮するために、 ファイルシステムレイアウトを少々変更するといったことをしています。結果、 fsck(8)のフルチェックにかかる時間を短縮化することに成功したものの、 一部の操作でファイルシステムのパフォーマンスが低下するという結果を招いています。 Kirk McKusick氏は根幹にあるアイディアをベースにしつつ、
ファイルシステムのレイアウトには変更を加えない方法を考案。新しいポリシーを実装することで、 100行程度の追加コードのみで性能を改善することに性能しています。どのようなアイディアで、 どういった実装をしたかは次の論文にまとまっています。 UFS2はディスクをシリンダグループと呼ばれるいくつかのグループに分けて使用します
(Linux ext3でいうところのブロックグループに相当します)。シリンダグループはさらにブロックマップやinodeマップを含むシリンダグループディスクリプタブロック、 inodeブロック、 インダイレクト/ダイレクトデータブロックにわかれます。 Kirk McKusick氏が実施した改善の主なポイントは次の3つです。
- シリンダグループごとに、
データブロックの最初の4%をメタデータの使用向けに確保する - 2段階および3段階インダイレクトブロックを、
データブロックに確保したメタデータ領域に確保する - ディレクトリデータを、
データブロックに確保したメタデータ領域に確保する
結果として、
次の性能改善が実現できたとされています。 - fsck(8)によるフルチェックのかかる時間が短縮化
- 大規模サイズのランダムアクセス性能の向上
- ディレクトリトラバース処理性能の向上
この改善のアイディアの要は、
キャッシュが効きやすくなるように関連するデータをなるべく近くにまとめておくというものです。 Kirk McKusick氏は今回の実装の教訓として、
実装レイヤとポリシーレイヤを分離しておくことが重要だと指摘しています。アイディアのベースになった論文では、 ext3の実装が実装レイヤとポリシーレイヤで分離していないため、 より多くのコードを書き換える手間が発生しており、 その結果バグも入り込みやすくなっていることを指摘しています。FreeBSD UFS2は実装レイヤとポリシーレイヤが分離しており、 ポリシーレイヤを書き換えるだけで済んでいることが指摘されています。 fsck(8)のフルチェックの処理時間を短縮する取り組みはこれまでも実施されてきましたが、
今回の性能向上はかなりドラスティックなものといえます。 - シリンダグループごとに、