VirtualBox のストレージは本当に遅いのか? vs VMware Fusion

ネットをただよっていると、VirtualBox のディスクは VMware と比べて数倍遅いとか、いやいや固定ディスクにすると速いとか、いろんな意見が出てきます。最近、高いI/Oスループットが必要なツールを作っていることもあり、興味が出たのでベンチマークを取ってみました。

測定条件

  • ベンチマークソフト : fio 2.x
  • 各テストケースを5回実行し中央値を採用
  • 測定マシン: Mac Pro mid 2010
    • OS : macOS Sierra
    • RAM: 20GB
    • Disk : crucial M550 (ただしSATA2.0接続) (システムディスク兼用)
  • VMware : Mac 上で動作する VMware Fusion 8.5 で測定
    • CPU : 4コア
    • RAM : 4GB
    • 仮想ディスク : 32GB
      • ディスク関連の設定はデフォルト
    • ゲストOS : Fedora 24 64bit
  • VirtualBox : Mac 上で動作する VirtualBox 5.1 で測定
    • CPU : 4コア
    • RAM : 4GB
    • チップセット: ICH9
    • ディスクコントローラ: SATA
      • ホストのI/Oキャッシュを使うオプション : オン / オフ それぞれで測定
    • 仮想ディスク : 32GB
      • ディスクタイプ : 可変VDI / 固定VDI それぞれで測定
      • 仮想ディスクの SSD フラグをON
    • ゲストOS : Fedora 24 64bit

テストケースは次のとおり。

テストケース テストモード テストサイズ ブロックサイズ 並列度
Single Sequential Read read 8GB 1MB QD1
Single Sequential Write write 8GB 1MB QD1
Multi Sequential Read read 8GB 128KB QD32
Multi Sequential Write write 8GB 128KB QD32
Single Random Read randread 4GB 4KB QD1
Single Random Write randwrite 4GB 4KB QD1
Multi Random Read randread 4GB 4KB QD32
Multi Random Write randwrite 4GB 4KB QD32
Multi Random R/W randrw 4GB 4KB QD32

実際には次のスクリプトを作成し実行しています。

#!/bin/bash

for i in {0..4}
do
    fio -direct=1 -invalidate=1 -name=SingleSeqRead -filename=fio.tmp -size=8G -bs=1M -iodepth=1 -rw=read >> 21-SingleSeqRead-O_DIRECT.log
    fio -direct=1 -invalidate=1 -name=SingleSeqWrite -filename=fio.tmp -size=8G -bs=1M -iodepth=1 -rw=write >> 22-SingleSeqWrite-O_DIRECT.log
    fio -direct=1 -invalidate=1 -name=MultiSeqRead -filename=fio.tmp -size=8G -bs=128K -iodepth=32 -rw=read >> 23-MultiSeqRead-O_DIRECT.log
    fio -direct=1 -invalidate=1 -name=MultiSeqWrite -filename=fio.tmp -size=8G -bs=128K -iodepth=32 -rw=write >> 24-MultiSeqWrite-O_DIRECT.log
    fio -direct=1 -invalidate=1 -name=SingleRandRead -filename=fio.tmp -size=4G -bs=4K -iodepth=1 -rw=randread >> 25-SingleRandRead-O_DIRECT.log
    fio -direct=1 -invalidate=1 -name=SingleRandWrite -filename=fio.tmp -size=4G -bs=4K -iodepth=1 -rw=randwrite >> 26-SigleRandWrite-O_DIRECT.log
    fio -direct=1 -invalidate=1 -name=MultiRandRead -filename=fio.tmp -size=4G -bs=4K -iodepth=32 -rw=randread >> 27-MultiRandRead-O_DIRECT.log
    fio -direct=1 -invalidate=1 -name=MultiRandWrite -filename=fio.tmp -size=4G -bs=4K -iodepth=32 -rw=randwrite >> 28-MultiRandWrite-O_DIRECT.log
    fio -direct=1 -invalidate=1 -name=MultiRandRW -filename=fio.tmp -size=4G -bs=4K -iodepth=32 -rw=randrw >> 29-MultiRandRW-O_DIRECT.log
done
rm fio.tmp

測定結果

f:id:miyahan:20161111000023p:plain

まずはシーケンシャルアクセス。リード性能はホストOSのキャッシュが効いているためか、VMwareVirtualBox(ホストキャッシュON) ともに物理マシンより高い値が出ています。特に固定ディスクVirtualBox では異常なまでのハイスコアです。ちょっとリードテストの結果はまゆつばですな。

  • VirtualBox より VMware のほうが 16% (ブレ幅の大きかったSingle Sequential Read の結果を除くと8%) ほど高速
  • VirtualBox のホストキャッシュを切ると、リード性能が50%、ライト性能が12%低下する
  • VirtualBox の可変ディスクを固定ディスクにすると、リード性能が130%(まゆつば)、ライト性能が9%向上する

f:id:miyahan:20161111000024p:plain

つぎにランダムアクセス。ランダムR/Wの結果を見ると、どのVMも物理マシンの半分以下のパフォーマンスしか出せていないことがわかります。細かい読み書きを行うデータベースサーバーを仮想マシンで運用するのは厳しいということですね。

  • VirtualBox より VMware のほうが27%高速(特にリードが得意で、45%高速)
  • VirtualBox のホストキャッシュを切ると、リード性能が38%低下するが、ライト性能は15%向上した(!?)
  • VirtualBox の可変ディスクを固定ディスクにすると、リード性能が16%向上する(ライト性能は変わらず)

所感

VirtualBox vs VMware

総じて VMwareVirtualBox よりも速く、特にリードが得意でした。システムのパフォーマンスに影響するランダムR/Wの結果から、 VirtualBoxVMware より2割くらい遅いと言えるのではないでしょうか。VMware Fusion は有償ですし、VMware Workstation Player は商用利用(会社内での自学自習・お遊びを含む)できませんし、「タダなんだから仕方ない」で済む範囲内ですかね。

ホストキャッシュON vs OFF

場合によりけりだと思います。ただ前提として、ホストキャッシュを切るとパフォーマンスが半分以下になってしまう場合があると覚えておきましょう。ちなみに、今回はSSD環境でしたがランダムアクセスが弱いHDDだとライトバッファ(遅延書き込み)を利用することでライト性能も大きな効果があると思います。

ホストキャッシュをOFFにしたほうがよいケース

  • メモリサイズに余裕が無い場合
  • 不意にホストが死んでもデータロストが起きないことを保証しなくてはいけない場合
  • 仮想マシンを動かしながら、ホストOS側でもヘビーな作業を行う場合

ホストキャッシュをONにしたほうがよいケース

  • HDDのノートパソコンなど、ホストのディスクが遅い場合
  • 仮想マシンの動作中、ホストOS側であまり作業を行わない場合
  • データベースサーバーなど高いI/Oスループットが要求される場合

可変ディスク vs 固定ディスク

固定ディスク/キャッシュONでのシーケンシャルリードの結果がぶっちぎれているように、固定ディスクにするとホストキャッシュの効果を受けやすくなるようです。ただこれはベンチマークの性質上の話で、実際には固定ディスクにすると1割くらい高速になるかもしれない程度に考えておくのがよいでしょう。仮想ディスクのサイズ変更は面倒なので、余裕を持って多めに割り当てるのが一般的だと思いますが、それを固定ディスクで作ってしまうとディスクスペースを圧迫してしまい、バックアップも大変です。個人的にはこの程度の恩恵であれば可変ディスクでよいと思います。

おわりに

今回システム(macOS)が稼働しているSSD上にVMの仮想ディスクファイルを置いたため、テスト中にさまざまなバックグラウンド処理が走り結果が乱れてしまい苦労しました。

また最初は1GBでテストしたのですが、tempファイルがすべてメモリに乗ったためか数GB/s とかいうあり得ないスコアが出たので、多めにしてテストを全部やり直したりもしました。(それでも若干怪しい数字が出てしまいました・・・。)とくにかく時間もかかりますし、ベンチマークって大変だなあと思いました。(小並感)