仮想マシンのストレージ形式について、一般的にはイメージファイルよりもzvolの方が適していると言われている。ホストのファイルシステムレイヤを通過したファイル上にゲストのFSレイヤを通したFSを構築するよりかは、zvol(の薄いレイヤしか通らない)のブロックデバイスをゲストのFSレイヤに渡した方が効率が良さそう、ってのは理屈としても合っている。
以前から実際に速度比較しようと思いつつ、ようやく実行に移せた。環境は以下の通り。
ゲストのストレージを、同一内容のイメージファイルとzvolデバイスとで切り替えてCrystalDiskMark 6.0.0で速度を計測した。なお、イメージファイルからzvolへの変換は以下のコマンドで行った。
VBoxManage clonehd /path/to/vms/Windows/HDD.vmdk /path/to/vms/HDD.raw --format RAW zfs create -V 40G zvm/zvols/Windows dd if=/path/to/vms/Windows/HDD.raw of=/dev/zvol/zvols/Windows bs=4096 VBoxManage internalcommands createrawvmdk -filename /path/to/vms/Windows/zvol.vmdk -rawdisk /dev/zvol/zvols/Windows
おろ、殆ど変わらんがな…(´・ω・`)。シーケンシャルR/W共にSATA 3の上限ぶっちぎっちゃってるし、ホストのキャッシュが効いちゃってる?
というわけで、VirtualBoxの「ホストのI/Oキャッシュを使う」オプションを切って再計測。
すごく、、、速いです………。こりゃZFSのキャッシュが効いてるなー。確認してみるとARCで4.8GB持ってるしなー。ベンチ中にtopで見てるとARCがもりもり増えてくし。
ついでにイメージファイルをHDDに置いた時のベンチも取ってみた。
うっは2.5インチHDDとは思えぬ速さwwwww
zpool iostatの結果を見るに、ランダムライトはZFS側でまとめられ、ほぼシーケンシャルライトとしてHDDに書き出されているようだ。
capacity operations bandwidth pool alloc free read write read write ---------- ----- ----- ----- ----- ----- ----- zhome2 1.33T 1.38T 1 922 153K 105M mirror 1.33T 1.38T 1 922 153K 105M ada3p1 - - 0 861 25.5K 105M ada2p1 - - 0 875 127K 107M logs - - - - - - mirror 40K 3.97G 0 0 0 0 ada0p4 - - 0 0 0 0 ada1p4 - - 0 0 0 0 ---------- ----- ----- ----- ----- ----- ----- capacity operations bandwidth pool alloc free read write read write ---------- ----- ----- ----- ----- ----- ----- zhome2 1.33T 1.38T 2 932 277K 111M mirror 1.33T 1.38T 2 932 277K 111M ada3p1 - - 0 919 50.4K 114M ada2p1 - - 1 890 227K 110M logs - - - - - - mirror 40K 3.97G 0 0 0 0 ada0p4 - - 0 0 0 0 ada1p4 - - 0 0 0 0 ---------- ----- ----- ----- ----- ----- ----- capacity operations bandwidth pool alloc free read write read write ---------- ----- ----- ----- ----- ----- ----- zhome2 1.33T 1.38T 0 962 102K 119M mirror 1.33T 1.38T 0 962 102K 119M ada3p1 - - 0 941 102K 117M ada2p1 - - 0 965 0 120M logs - - - - - - mirror 40K 3.97G 0 0 0 0 ada0p4 - - 0 0 0 0 ada1p4 - - 0 0 0 0 ---------- ----- ----- ----- ----- ----- ----- capacity operations bandwidth pool alloc free read write read write ---------- ----- ----- ----- ----- ----- ----- zhome2 1.34T 1.38T 1 940 153K 113M mirror 1.34T 1.38T 1 940 153K 113M ada3p1 - - 0 918 76.7K 113M ada2p1 - - 0 906 76.7K 112M logs - - - - - - mirror 40K 3.97G 0 0 0 0 ada0p4 - - 0 0 0 0 ada1p4 - - 0 0 0 0 ---------- ----- ----- ----- ----- ----- -----
結論としては、イメージファイルでもzvolでも大差なさそう。ストレージ形式の差よりも、ZFSそのものの動作環境やチューニングの差の方が覿面に影響しそう。なので、好きな方を使えばいいんじゃないかな。俺は扱いやすいイメージファイルの方を選ぶんだぜ。
とりあえずZFSパネェ…。
(2017-11-25 追記)
ついでにbhyveでもやってみた。
ストレージは同一SSDだけど、計測環境は新規インストールのWindows 10なので厳密な比較にはならんけど。なお、ストレージはahci-hdで繋いでる。virtio-blkはWindowsでは現状未対応らしい。
ベンチ結果は左から、gzip-5のZFS上のイメージファイル、同zvol、lz4なzvol。