ここ4年ほどCore i5-3340Mを搭載したノートPC上でVirtualBoxを使ってきたので、その辺の知見を元に、VirtualBoxなどのx86仮想化ソフトウェアを使ってゲストOSを飼う際に必要な「ホスト環境のハードウェア構成」についてまとめておく。
WindowsをホストOSとして、ホストOS上でWebブラウザや開発環境を動かしつつ、ゲストOSとしてWindows・Ubuntu(GUIとCLIの双方)辺りを動かす――という非Web系のソフトウェア屋さんでありそうな環境を想定している。
――Web屋さんとかインフラ屋さん向けの仮想化の話なんて、割と直ぐに見つかるでしょ(無責任)。
仮想化支援機能をサポートするCPUを選択する。
Intel VTやAMD-Vなどの仮想化支援機能をサポートするCPUを選択して、BIOS/UEFI設定で有効化した上で、仮想化ソフトウェア側で支援機能を使用する設定にしないと、ゲストOSの性能は劣化する。
IBMのメインフレームとは異なり、x86のアーキテクチャは元々仮想化なんて考慮されていなかった訳で……x86上で動作するOSも仮想化を考慮しない作りになっている。だから、単純にソフトウェアだけで仮想化を実現しようとするとオーバーヘッドが大きい。
Intel VTやAMD-Vは、このオーバーヘッドを軽減するための後付けの機能だ。
Intel VTについては、VT-xとVT-d双方に確実に対応しているデスクトップ・ノートPC向けCPUは「Broadwell/Skylake以降のインテルCoreプロセッサー・ファミリーに属するCore i7/5/3・Pentium・Celeron」だ。それ以前の世代だと、ローエンドではVT-d非対応であったり、ハイエンドのCore i7/5でもVT-d対応/非対応のモデルが混在していたりする。
Intel AtomベースのPentiumやCeleron*1では、Apollo Lake以降でVT-xとVT-d双方に対応しているようだ。
AMD-Vについては、不勉強なので知らない。
シングルスレッド性能がそこそこ高めのCPUを選択する。
ここでのシングルスレッド性能は(ハイパースレッディングのことを無視するなら)「1コア辺りの性能」を意味する。
シングルコアでの演算性能向上の限界により、PC向けCPUの分野でも2006年ごろからマルチコアによる性能向上に舵が切られた訳だが――それでも依然としてシングルスレッド性能も向上している*2。
正直なところ、仮想化ソフトウェアは重い。何しろ「独立したハードウェア上で直接実行する」という前提で作られているx86向けのOSを無理やりソフトウェア上で動かしている訳で、Intel VTやAMD-Vなどの仮想化支援機能で軽減されるといえども、処理としては重い部類に入る。
ソフトウェアには「シングルスレッド性能が上がると高速化する」ものと「コア数を増やすと高速化する」ものの2系統があるが、経験的に仮想化ソフトウェアでは「1にシングルスレッド性能、2にコア数(ただしデュアルコア以上)」の順に効果があるように思う。
だから、まずはシングルスレッド性能が高めのCPUを選択すべきだろう。
経験的に、またベンチマーク性能的に、シングルスレッド性能は「Intel > AMD*3」という傾向にある。私ならIntelのCPUを選択するだろう。仮にAMDのCPUから選択するのなら、現時点では最低でもRyzen 5の上位モデル以上を選ぶだろう。
IntelのCPUでも、Intel Atomベースのものは例外的にシングルスレッド性能が低いので*4、少なくとも現時点では選択してはならない。
現在使用しているCore i5-3340Mが「ギリギリ実用に耐えうるかな……?」ぐらいの感じなのだが、ベンチマーク的にはKaby Lake世代のデスクトップ向けPentium Gシリーズにて追い抜かれつつある感じだ。他のソフトウェアと同様に、OSもバージョンアップと共に肥大化していく傾向にあるので、余裕を見てKaby Lake以降のデスクトップ向けCore i7/5/3ないしKaby Lake Refreshのモバイル向けCore i7/5に絞り込むのが現時点でのベターだろう。
できれば4コア以上のCPUを選択する。
ある程度シングルスレッド性能が高い場合、次に効果があるはコア数だ。現在使用しているCore i5-3340Mは「2コア、4スレッド」の構成なのだが、できれば「4コア、4スレッド」、欲を言えば「4コア、8スレッド」以上が望ましいと考えている。
最近のPC向けCPUはほぼ全てマルチコアなので、OSもマルチコア環境で性能を発揮するように実装されている。VirtualBoxなどではゲストOSに割り当てるCPUスレッド数を指定できるが、2スレッド以上割り当てることでゲストOSの性能が向上する。
その上で、例えば「4コア、4スレッド」の環境では、ゲストOSに2スレッド(2コア)割り当てたとしても、残り2スレッド(2コア)をホストOSで使用できるので、「ホストOSで作業しながらゲストOSを動かす」という使い方にも耐えられる。
「4コア、8スレッド」の環境なら、「ゲストOSに4スレッド(2コア)、ホストOSに4スレッド(2コア)」とすれば双方ともまずまずの性能となるだろうし、「3つのゲストOSに2スレッド(1コア)ずつ割り当てて、ホストOSに残り2スレッド(1コア)」とすればゲストOSの同時使用にも耐えられる。
IntelのCPUで確実に「4コア、4スレッド」以上なのはデスクトップ向けCore i7/5かKaby Lake Refreshのモバイル向けCore i7/5だ。モバイル向けでは長い間、Core i7/5でも「2コア、4スレッド」の構成が大半だったのだが*5、Kaby Lake Refreshでコア数が増えて「4コア、8スレッド」となった。でもゲストOSを飼うなら、できればデスクトップ向けCore i7/5を使いたい。
できればメモリは16GB以上積む。
ここまでCPUに注目してきたが、ゲストOSを飼うならメモリも欲しい。ゲストOSの同時実行数や、ゲストOSと並行してホストOSで行う作業に依存するが、個人的には16GB以上を推奨する。
ホスト環境に積むべきメモリサイズは「ホストOSで使用するメモリ量+(ゲストOSで使用するメモリ量×ゲストOSの同時実行数)」で決まる、と考えればよい。
例えばWindows 10 Home搭載の格安ノートPCの大半では、メモリサイズは4GBだ。この手のPCは「ネットサーフィン等の軽い作業」向けだ。だから、ゲストOSがWindows 10で且つ軽い作業しか行わないなら、ゲストOSに割り当てる最小メモリサイズは4GBぐらいだと考えればよいだろう。
ゲストOSと並行してホストOS(Windows 10)で行う作業も上記の「軽い作業」ぐらいならば、ホストOS用に確保しておくべき最低限のメモリサイズも4GBとなる。
この時点で、ホストOS・ゲストOS合わせて8GBのメモリを確保すべきだということになる。もちろん「8GB積んでいないと動作しない」という訳ではないのだが、色々と動かし始めた際に動作が遅い等の影響が出る可能性がある。
ソフトウェア開発でありがちな「ホストOSで統合開発環境を動かしつつ、テスト環境としてゲストOSを動かす」というケースでは、ホストOS側で快適に作業するには4GBでは足りないし、テストするソフトウェアが重いのならゲストOSにより多くのメモリを割り当てる必要がある。
メモリサイズはOSの種類によって異なる。例えばUbuntuのSystem Requirementsを見ると、最近のUbuntu Desktop Editionのデフォルト環境ではシステムメモリだけで4GBが要求されている反面、Ubuntu ServerをCLIで運用するならシステムメモリは256MBで済む。この数字は追加のアプリケーション/デーモン(サーバ)を動かさない場合のものなので、実際には上記の値よりも多いメモリを割り当てるべきだろう。
こういったあれこれを考えると、ホストOSがWindowsの場合、「メモリは16GB以上」という要求に当てはまることが多くなる。
大容量かつ高速なディスクを積む。性能重視ならSSDを使う。
CPU・メモリに次ぐ最後の要素は「ディスク」である。まず、ゲストOSを飼うならそこそこ容量の大きなディスクは必須だ。
例えばゲストOSがWindowsの場合、経験的に、Windows 7以降の64bit OSをクリーンインストールしてWindows Updateを当てただけの状態で、可変サイズの仮想ディスクは概ね10〜20GBの大きさとなる。OS以外にアプリケーションをインストールすれば、仮想ディスクはより大きくなるし、スナップショット機能を使えばさらにディスクを消費する。
ゲストOSの数が増えれば、その分だけ仮想ディスクの数が増えるので、もっとディスクを消費することになる。
その上で、さらに経験に基づく話になるが、Windows PCではディスクの空き容量が少なくなりすぎると動作が遅くなることが多い。パーティションの切り方、OSのバージョン、常駐しているウイルス対策ソフトの種類その他に左右される話なので、未だに具体的な空き容量の目安は分からないのだが……しかし、空き容量が少なすぎると動作が遅くなることが多い、という傾向が見られる。
だから、ゲストOSの仮想ディスクを抱えつつもある程度の空き容量を確保できるだけのディスクサイズが欲しい。そうなると、用途次第ではあるが、そこそこ容量の大きなディスクが必要となる。
もう1つ重要なのが、ディスクIOの速度。バス速度も含めたIOの話だ。
ゲストOSがディスクを読み書きすると、仮想ディスクの読み書きが発生する。つまり、仮想ディスクを置いている「ホストOSのディスク」へのIOが発生する。ゲストOSが大量にディスクを読み書きすると、ホストOS側で他の作業に影響が出てしまうことがある。
この問題を解決するには、高速なディスクを使用するなどして、ディスクIOを高速化するしかない。
さらに言えば、HDDではなくSSDを採用して、仮想ディスクもSSDに置くようにすれば、より快適になるはずなのだが……1TB以上のSSDはまだまだ高いのである。残念。
まとめ
- 仮想化支援機能をサポートするCPUを選択する。
- シングルスレッド性能がそこそこ高めのCPUを選択する。
- できれば4コア以上のCPUを選択する。
- ホストOS用に残しておくスレッド数+(ゲストOSに割り当てるスレッド数×ゲストOSの同時実行数)」
- 最近のOSはマルチコア環境に最適化されているので、ホストOSもゲストOSも最低でも2スレッドずつ割り当てること。
- できればメモリは16GB以上積む。
- ホストOSで使用するメモリ量+(ゲストOSで使用するメモリ量×ゲストOSの同時実行数)」
- 大容量かつ高速なディスクを積む。性能重視ならSSDを使う。
- 仮想ディスクを置いを置いた状態での、ホストOSのディスク空き容量に注意すること。
- 性能を求めるなら仮想ディスクを含めてSSDに置くこと。
*1:Pentinu JやCeleron Nなどの、JやNで始まるもの。
*2:もちろん上昇率は以前よりも低めだが、それでもじりじりと上昇している。
*3:ただし同価格帯での比較。
*4:ベンチマーク的には、最近の格安ノートPCやWindows Storage Server搭載NASに搭載されることの多いCeleron J1900やCeleron N3160は、Pentium M(2000年代前半のノートPCに搭載されていたCPU)よりもシングルスレッド性能が低い。割と新しいPentium J4205にて、ようやくシングルスレッド性能がCore 2 Duo世代のモバイル向けモデルに追いついてきた感じだ。
*5:Core i7のPerformanceモデルなら「4コア、8スレッド」だったが、該当するCPUを載せたノートPCが軒並み高かったり、ゲーミングPCでの採用が多かったり、17インチ大画面で持ち運びに不便だったりと、なかなか良い機種に巡り合えなかった。