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 で測定
テストケースは次のとおり。
テストケース | テストモード | テストサイズ | ブロックサイズ | 並列度 |
---|---|---|---|---|
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
測定結果
まずはシーケンシャルアクセス。リード性能はホストOSのキャッシュが効いているためか、VMware・VirtualBox(ホストキャッシュON) ともに物理マシンより高い値が出ています。特に固定ディスクの VirtualBox では異常なまでのハイスコアです。ちょっとリードテストの結果はまゆつばですな。
- VirtualBox より VMware のほうが 16% (ブレ幅の大きかったSingle Sequential Read の結果を除くと8%) ほど高速
- VirtualBox のホストキャッシュを切ると、リード性能が50%、ライト性能が12%低下する
- VirtualBox の可変ディスクを固定ディスクにすると、リード性能が130%(まゆつば)、ライト性能が9%向上する
つぎにランダムアクセス。ランダムR/Wの結果を見ると、どのVMも物理マシンの半分以下のパフォーマンスしか出せていないことがわかります。細かい読み書きを行うデータベースサーバーを仮想マシンで運用するのは厳しいということですね。
- VirtualBox より VMware のほうが27%高速(特にリードが得意で、45%高速)
- VirtualBox のホストキャッシュを切ると、リード性能が38%低下するが、ライト性能は15%向上した(!?)
- VirtualBox の可変ディスクを固定ディスクにすると、リード性能が16%向上する(ライト性能は変わらず)
所感
VirtualBox vs VMware
総じて VMware は VirtualBox よりも速く、特にリードが得意でした。システムのパフォーマンスに影響するランダムR/Wの結果から、 VirtualBox は VMware より2割くらい遅いと言えるのではないでしょうか。VMware Fusion は有償ですし、VMware Workstation Player は商用利用(会社内での自学自習・お遊びを含む)できませんし、「タダなんだから仕方ない」で済む範囲内ですかね。
ホストキャッシュON vs OFF
場合によりけりだと思います。ただ前提として、ホストキャッシュを切るとパフォーマンスが半分以下になってしまう場合があると覚えておきましょう。ちなみに、今回はSSD環境でしたがランダムアクセスが弱いHDDだとライトバッファ(遅延書き込み)を利用することでライト性能も大きな効果があると思います。
ホストキャッシュをOFFにしたほうがよいケース
- メモリサイズに余裕が無い場合
- 不意にホストが死んでもデータロストが起きないことを保証しなくてはいけない場合
- 仮想マシンを動かしながら、ホストOS側でもヘビーな作業を行う場合
ホストキャッシュをONにしたほうがよいケース
可変ディスク vs 固定ディスク
固定ディスク/キャッシュONでのシーケンシャルリードの結果がぶっちぎれているように、固定ディスクにするとホストキャッシュの効果を受けやすくなるようです。ただこれはベンチマークの性質上の話で、実際には固定ディスクにすると1割くらい高速になるかもしれない程度に考えておくのがよいでしょう。仮想ディスクのサイズ変更は面倒なので、余裕を持って多めに割り当てるのが一般的だと思いますが、それを固定ディスクで作ってしまうとディスクスペースを圧迫してしまい、バックアップも大変です。個人的にはこの程度の恩恵であれば可変ディスクでよいと思います。
おわりに
今回システム(macOS)が稼働しているSSD上にVMの仮想ディスクファイルを置いたため、テスト中にさまざまなバックグラウンド処理が走り結果が乱れてしまい苦労しました。
また最初は1GBでテストしたのですが、tempファイルがすべてメモリに乗ったためか数GB/s とかいうあり得ないスコアが出たので、多めにしてテストを全部やり直したりもしました。(それでも若干怪しい数字が出てしまいました・・・。)とくにかく時間もかかりますし、ベンチマークって大変だなあと思いました。(小並感)