takaha.siの技術メモ

勉強したことをお伝えします。ちょっとでも誰かの役に立てればいいな…

zfsはcloseとwriteが遅いです

Linuxzfsの話です。zfsのI/O特性を知っておきましょう。

結論から言います。zfsは「書く量を増やせば増やすほど、それにつられてclose(2)とwrite(2)が顕著に遅くなる」という性質があります。ちなみにLVMではこれは見られません(zfsのほうが色々付加価値があるので、フェアな比較ではないことは重々承知しています)

これを検証するためにちょっとしたマイクロベンチマークを書いてみました。以下のGistにありますので見てください。

write_bench.c · GitHub

このプログラムは、指定されたファイルに対して、特定の大きさのブロック(bs)を、特定の大きさまで(total_size)for文でひたすらseekしてwriteするという単純なプログラムです。

20GBのzvolを/dev/pool/20gbに作って、書き込み量のtotal_sizeを変えながらclosewriteのレイテンシの結果を見てみましょう。ちなみに各システムコールのレイテンシはstrace -c -fで集計した値を使っています。

total_size (GB) write (usec) close (usec)
1 37 454748 (454.748 ms)
5 47 1277080 (1277.08 ms)
10 47 1693095 (1693.095 ms)
15 50 1730856 (1730.856 ms)
19 53 2232082 (2232.082 ms)

total_size (書き込み量)を増やせば増やすほど。write, closeともにレイテンシが上昇していくのが見られます。特にcloseのレイテンシの上昇はとても大きいです。

一方、LVMではこの特性は見られません。書き込み量を増やしても、大体同じぐらいのレイテンシに収まります。

total_size (GB) write (usec) close (usec)
1 93 81
5 91 3
10 98 90
15 96 79
19 92 91

若干遅くはなってますが、zfsほどではありませんね。

今回close, writeの測定しかしていませんが、fioで色々実験した限りですと、非同期I/Oのpwriteでもio_submitでも同様の傾向が見られます。

というわけで、LVMと同じI/O特性を期待してzfsを使うと痛い目を見ます。特にcloseのレイテンシの増加率はLVMに比べるととても大きいです。書き込み量を増やすときはなるべくcloseは発行しないようにしましょう。

p.s. 書き込んだ量ではなくて、汚したブロックの量(つまり同じ場所に書き込みまくったらレイテンシは変わらないのではないか?)によって変わるのではないかという疑惑ありますが、それの検証はまた今度。