先日、バーチャルマシン上でプログラムをビルドすると時間がかかってしようがない。ビルドするならやっぱネイティブマシンだよね、と話している人がいました。
その人が使っているのはホスト型の仮想化だったのですが、それを聞いてふと、ハイパーバイザ型の仮想化に変えたらネイティブマシンまで速くなくても、もう少しマシな速度が出ないかなと思いました。
ホスト型とハイパーバイザ型では、ディスクI/O等ハードへのアクセスにホストOSを介さない分、ハイパーバイザ型の方が速いんだとか聞きます。でも確かめたことが無いので断言できないな。
そんなわけで今回は少し比較実験してみました。
手元で手軽に用意できるHyper-V対VMware Player(6.0.2)で。
実験に使うハードは、またも5月の連休中に組み立てたAthlon5350 + AM1H-ITXマシン。マシンパワー的に相応しくない気もしますが、新しいマシンの方が楽しいので。
ここでHyper-Vを無効化したと書きましたが、実験のため、Hyper-Vを使うときだけまた有効化しました。ただHyper-Vを有効化していると今度はVMware Playerを起動できなくなるので、VMware Playerを使うときはまた無効化。
また速い/遅いの判定基準ですが、まあ私的に実用上の差を見る意味で、linuxのバニラカーネル3.15.1を素のコンフィグでビルドしたときの時間を測定してみました。
で詳細は飛ばしていきなり結果。
まずHyper-V。
~/work/linux-3.15.1>$ time make -j4 : real 84m10.340s user 271m56.747s sys 34m3.999s
続いてVMware Player。
~/work/linux-3.15.1>$ time make -j4 : real 94m50.176s user 299m46.037s sys 41m29.439s
うーん、まあ確かに10%くらいHyper-Vの方が早いような…。でも僅差。
大量のソースファイルをコンパイルしたので、たぶんディスクI/Oが大量に発生したと思います。ディスクI/Oはハイパーバイザ型の方が有利らしいので、その分Hyper-Vの方が速かったのかも。
ハイパーバイザ型とホスト型の比較にHyper-VとVMware Playerが相応しいかは微妙ですが、少なくとも今回はHyper-V上のVMの方が速いという結果になりました。
しかし絶対値としては、このハード上ではやっぱり両方とも思いきり遅いですね…。
一応CPU使用率を見てる限り、CPUが無駄に遊んでいた等は無いように思うのですが。
そうなると、今度はネイティブマシンの速度と比べてどうなのか知りたくなります。しかし、あいにくこのPCにはWindowsしかインストールしてません。
一方メインマシンになら入っている(Ubuntu 12.04 Desktop)ので、参考までにCore i5-3550(4core、3.3GHz)のメインマシン上で比較してみました。
まずHyper-V。
real 30m38.675s user 82m40.282s sys 9m8.921s
続いてネイティブ。
real 15m34.999s user 47m57.692s sys 3m33.793s
Hyper-Vの結果も、Athlon5350 + AM1H-ITXマシンに比べれば2.8倍も速いのですが、ネイティブマシンはさらにその倍速い。ディスクI/Oが多いせいか、こんなにも大差がつくとは思いませんでした。あ言い忘れましたが、ここに書いたネイティブマシンとバーチャルマシンは全てSSDではなくHDD上に置いています。
少なくともカーネルのビルドのような仕事には、仮想化使わず素直にネイティブマシンを使った方が、かなりの時間節約になりそうでした。