BSD界隈四方山話

第20回ZFSデバイスファイルで仮想ディスクの性能アップ!

仮想ディスクにZFSデバイスファイルを使って性能アップ

これまで2回に渡ってFreeBSD 10で導入されたハイパーバイザbhyveの使い方を紹介してきました。今回は仮想ディスクにZFSデバイスファイルを使うことで仮想ディスクI/Oの性能を引き上げる方法を紹介します。

説明が重複するので、コマンドのオプションやネットワークインターフェースに関する説明は上記記事をご覧ください。今回はこれまでの内容を踏まえて作業内容と性能差について取り上げます。

ホスト側のセットアップ

ホスト側でbhyveを使うための設定を行います。システムを再起動しても有効にしておくために設定ファイルにも必要な設定を書き込んでおきます。

図1 ホスト側の準備
# kldload vmm
# ifconfig tap0 create
# ifconfig tap1 create
# sysctl net.link.tap.up_on_open=1
net.link.tap.up_on_open: 0 -> 1
# ifconfig bridge0 create
# ifconfig bridge0 addm bge0 addm tap0 addm tap1 up
# cat /boot/loader.conf
vmm_load="YES"
# cat /etc/rc.conf | grep bridge0
cloned_interfaces="bridge0 tap0 tap1"
ifconfig_bridge0="addm bge0 addm tap0 addm tap1"
# cat /etc/sysctl.conf
net.link.tap.up_on_open=1
# 

ここではtap0をホストのUFS上のファイルを仮想ディスクとした仮想環境(freebsd-10.2⁠⁠、tap1をホストのZFSデバイスファイルを仮想ディスクとした仮想環境(freebsd-10.2-on-zfs)に割り当てています。

ゲスト環境の構築

FreeBSD 10.2-RELEASEのISOインストールイメージファイルを取得します。

図2 インストール用のISOイメージファイルを取得
# fetch ftp://ftp.jp.freebsd.org/pub/FreeBSD/releases/ISO-IMAGES/10.2/FreeBSD-10.2-RELEASE-amd64-disc1.iso.xz
FreeBSD-10.2-RELEASE-amd64-disc1.iso.xz       100% of  413 MB 5844 kBps 01m13s
# unxz FreeBSD-10.2-RELEASE-amd64-disc1.iso.xz

ホストのUFS上のファイルを仮想ディスクとする場合のインストール方法はこれまでと同じです。

図3 ホストのUFS上のファイルとして仮想ディスクを作成してゲストをインストール
# truncate -s 32G freebsd-10.2.img
# sh /usr/share/examples/bhyve/vmrun.sh -c 2 -m 2G -t tap0 -d freebsd-10.2.img -i -I FreeBSD-10.2-RELEASE-amd64-disc1.iso freeb
# bhyvectl --destroy --vm=freebsd-10.2
# sh /usr/share/examples/bhyve/vmrun.sh -c 2 -m 2G -t tap0 -d freebsd-10.2.img freebsd-10.2

ホストのZFSデバイスファイルを仮想ディスクとして使う場合には、次のように環境をセットアップします。

図4 ホストのZFSデバイスファイルを仮想ディスクとしてゲストをインストール
# zfs create -V 32G -o volmode=dev z/freebsd-10.2
# bhyve -A -H -P -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,tap1 -s 3:0,virtio-blk,/dev/zvol/z/freebsd-10.2 -s 4:0,ahci-cd,./FreeBSD-10.2-RELEASE-amd64-disc1.iso -l com1,stdio -c 2 -m 2G freebsd-10.2-on-zfs
# bhyvectl --destroy --vm=freebsd-10.2-on-zfs
# bhyve -A -H -P -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,tap1 -s 3:0,virtio-blk,/dev/zvol/z/freebsd-10.2 -l com1,stdio -c 2 -m 2G freebsd-10.2-on-zfs

truncate(1)コマンドでファイルを作成するのではなく、zfs(8)コマンドでデバイスファイルを作成しています。⁠z」がここで使っているプール名です。仮想ディスクとしてこのデバイスファイルと指定すると、このデバイスファイルが仮想ディスクとして使われるようになります。

bonnie++でベンチマーク

I/O性能を比較するためにbonnie++をインストールします。

図5 bonnie++をインストール
# pkg install bonnie++
Updating FreeBSD repository catalogue...
FreeBSD repository is up-to-date.
All repositories are up-to-date.
Updating database digests format: 100%
The following 1 package(s) will be affected (of 0 checked):

New packages to be INSTALLED:
        bonnie++: 1.97_3

The process will require 162 KiB more space.
57 KiB to be downloaded.

Proceed with this action? [y/N]: y
Fetching bonnie++-1.97_3.txz: 100%   57 KiB  58.7kB/s    00:01
Checking integrity... done (0 conflicting)
[1/1] Installing bonnie++-1.97_3...
[1/1] Extracting bonnie++-1.97_3: 100%
#

bonnie++は性能の一つの側面を捉えるだけですので、あくまでも参考程度に考えて欲しいのですが、ある程度の特性といったものは見えてくるところがあります。

図6 bonnie++実行結果:FreeBSD 10.2 on bhyve 仮想ディスク(ホストのUFS上のファイル)
$ bonnie++
Writing a byte at a time...done
Writing intelligently...done
Rewriting...done
Reading a byte at a time...done
Reading intelligently...done
start 'em...done...done...done...done...done...
Create files in sequential order...done.
Stat files in sequential order...done.
Delete files in sequential order...done.
Create files in random order...done.
Stat files in random order...done.
Delete files in random order...done.
Version  1.97       ------Sequential Output------ --Sequential Input- --Random-
Concurrency   1     -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
Machine        Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP  /sec %CP
trybsd.localhost 4G   831  99 76708  11 33849   6   751  57 73333  10 499.9  38
Latency             33843us    1737ms    2056ms     717ms    1537ms     120ms
Version  1.97       ------Sequential Create------ --------Random Create--------
trybsd.localhost    -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--
              files  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP
                 16 +++++ +++ +++++ +++ +++++ +++ +++++ +++ +++++ +++ +++++ +++
Latency             32708us      54us      64us   23808us      36us      36us
1.97,1.97,trybsd.localhost,1,1442308041,4G,,831,99,76708,11,33849,6,751,57,73333,10,499.9,38,16,,,,,+++++,+++,+++++,+++,+++++,+++,+++++,+++,+++++,+++,+++++,+++,33843us,1737ms,2056ms,717ms,1537ms,120ms,32708us,54us,64us,23808us,36us,36us
$
図7 bonnie++実行結果:FreeBSD 10.2 on bhyve 仮想ディスク(ホストのZFSデバイスファイル)
$ bonnie++
Writing a byte at a time...done
Writing intelligently...done
Rewriting...done
Reading a byte at a time...done
Reading intelligently...done
start 'em...done...done...done...done...done...
Create files in sequential order...done.
Stat files in sequential order...done.
Delete files in sequential order...done.
Create files in random order...done.
Stat files in random order...done.
Delete files in random order...done.
Version  1.97       ------Sequential Output------ --Sequential Input- --Random-
Concurrency   1     -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
Machine        Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP  /sec %CP
trybsd.localhost 4G   802  99 89008  15 39636   5  1008  75 87941   9 968.3  30
Latency             32745us    4053ms     999ms     507ms    1059ms   94014us
Version  1.97       ------Sequential Create------ --------Random Create--------
trybsd.localhost    -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--
              files  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP
                 16 +++++ +++ +++++ +++ +++++ +++ +++++ +++ +++++ +++ +++++ +++
Latency             44222us      44us     856us   28166us      40us      39us
1.97,1.97,trybsd.localhost,1,1442311572,4G,,802,99,89008,15,39636,5,1008,75,87941,9,968.3,30,16,,,,,+++++,+++,+++++,+++,+++++,+++,+++++,+++,+++++,+++,+++++,+++,32745us,4053ms,999ms,507ms,1059ms,94014us,44222us,44us,856us,28166us,40us,39us
$

UFSとZFSの差をbonnie++の結果だけで考えるのはちょっとあれなのですが、参考程度にホストのUFSとZFSのbonnie++の結果も掲載しておきます。

図8 bonnie++実行結果:ホストUFS
$ bonnie++
Writing a byte at a time...done
Writing intelligently...done
Rewriting...done
Reading a byte at a time...done
Reading intelligently...done
start 'em...done...done...done...done...done...
Create files in sequential order...done.
Stat files in sequential order...done.
Delete files in sequential order...done.
Create files in random order...done.
Stat files in random order...done.
Delete files in random order...done.
Version  1.97       ------Sequential Output------ --Sequential Input- --Random-
Concurrency   1     -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
Machine        Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP  /sec %CP
parancell.ongs. 16G   862  99 86112   6 41029   8  1141  93 86736  11 143.6   3
Latency             29915us    1850ms    2094ms     180ms    1384ms     219ms
Version  1.97       ------Sequential Create------ --------Random Create--------
parancell.ongs.co.j -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--
              files  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP
                 16 +++++ +++ +++++ +++ +++++ +++ +++++ +++ +++++ +++ +++++ +++
Latency             18137us      13us      20us   88359us      10us      20us
1.97,1.97,parancell.ongs.co.jp,1,1442240935,16G,,862,99,86112,6,41029,8,1141,93,86736,11,143.6,3,16,,,,,+++++,+++,+++++,+++,+++++,+++,+++++,+++,+++++,+++,+++++,+++,29915us,1850ms,2094ms,180ms,1384ms,219ms,18137us,13us,20us,88359us,10us,20us
$
図9 bonnie++実行結果:ホストZFS
$ bonnie++
Writing a byte at a time...done
Writing intelligently...done
Rewriting...done
Reading a byte at a time...done
Reading intelligently...done
start 'em...done...done...done...done...done...
Create files in sequential order...done.
Stat files in sequential order...done.
Delete files in sequential order...done.
Create files in random order...done.
Stat files in random order...done.
Delete files in random order...done.
Version  1.97       ------Sequential Output------ --Sequential Input- --Random-
Concurrency   1     -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
Machine        Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP  /sec %CP
parancell.ongs. 16G   227  99 51994   5 48555   7   617  98 146090  10 310.8   5
Latency               129ms   28525ms    1533ms     104ms     455ms     349ms
Version  1.97       ------Sequential Create------ --------Random Create--------
parancell.ongs.co.j -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--
              files  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP
                 16 27446  69 +++++ +++ +++++ +++ 20718  99 20059  99  6581 100
Latency              9705us     140us     299us   13659us     119us     463us
1.97,1.97,parancell.ongs.co.jp,1,1442243865,16G,,227,99,51994,5,48555,7,617,98,146090,10,310.8,5,16,,,,,27446,69,+++++,+++,+++++,+++,20718,99,20059,99,6581,100,129ms,28525ms,1533ms,104ms,455ms,349ms,9705us,140us,299us,13659us,119us,463us
$

ZFSデバイスファイルのほうが良い感じ

bonnie++の結果から、特にわかりやすい結果を比較すると次のようになります(ホストのUFS/ZFSは参考程度に⁠⁠。

表1 bonnie++ベンチマーク結果比較(大きいほうがよい)
SeqOut_Block SeqOut_Rewrite SeqIn_Block SeqIn_Seek
host UFS 86112 41029 86736 143.6
host ZFS 51994 48555 146090 310.8
guest UFS-virtdisk 76708 33849 73333 499.9
guest ZFS-virtdisk 89008 39636 87941 968.3

参考までにレイテンシーに関してまとめた表も掲載しておきます。こちらはmsとusの単位の結果が混在していますが、項目毎には同じ単位に揃えてあります。

表2 bonnie++ベンチマーク結果比較(レイテンシー/小さいほうがよい)
SeqOut_Block SeqOut_Rewrite SeqIn_Block SeqIn_Seek Seq_Create Seq_Read Seq_Del Rdm_Create Rdm_Read Rdm_Del
host UFS 1850 2094 1384 219 18137 13 20 88359 10 20
host ZFS 28525 1533 455 349 9705 140 299 13659 119 463
guest UFS-virtdisk 1737 2056 1537 120 32708 54 64 23808 36 36
guest ZFS-virtdisk 4053 999 1059 94 44222 44 856 28166 40 39

UFS仮想ディスクとZFS仮想ディスクでは、ZFS仮想ディスクのほうがよさげな結果が出ています。

無駄な処理をしないので速くなる

ホストのUFS上のファイルを仮想ディスクとする場合、bhyve上で動作しているゲストはホストのUFSの機能をスルッとそのまま利用することになります。UFS on UFS的な状況を考えてもらうと、その無駄感が見えてくるかと思います。

ホストのZFSデバイスファイルを仮想ディスクにすると、この無駄な部分を排除できます。ZFSの処理をスルッと利用するのでその部分は遅くなりますが、ファイルシステムとしての処理とかが入らなくなるのでUFSを通るのに比べると軽くなります。

実験していませんが、パーティションの状態で静的にディスクを分けておいて、それを指定して仮想ディスクとした場合にも、同じように性能の向上が確認できるのではないかと思います。それがどういった性能を示すかはやってみないとわかりませんけれども。でも、便利さを考えるとZFSを使ったほうが管理が簡単だと思います。

こうしたベンチマークの結果はホストの設定やゲストの設定、利用しているハードウェアにも結果が左右されますし、ベンチマークの結果が実際に求める性能になっているとは限りません。利用する状況に合わせて自ら性能を比較してみてください。

おすすめ記事

記事・ニュース一覧