前回から3回に分けて、Hyper-V仮想マシン作成後に変更可能な項目、追加で設定できる項目を確認し、仮想マシンの詳細設定を学び直していきます。連載第5回となる今回は、Hyper-V仮想マシンのハードウェア設定の後半部を見ていきます。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
「プロセッサ」は、仮想CPUもしくはvCPUとも称される仮想マシンに割り当てる仮想プロセッサの設定項目です(画面1)。この項目は、第1世代仮想マシンでも第2世代仮想マシンでも同じ設定となります。
「仮想プロセッサの数」の項目で設定する値が、仮想マシンに割り当てる仮想プロセッサの数であり、仮想マシンのOSから見えるプロセッサのコア数となります。
画面1の仮想マシン「Gen2-VM」を起動してゲストOSからプロセッサコア数を確認すると、4つの仮想プロセッサが認識されていることが分かります(画面2)。
Hyper-Vホスト(HOST33)には、4コア/8スレッドの物理プロセッサが搭載されています。その場合、仮想マシンの仮想プロセッサは物理コア単位で割り当てられるのか、それともハイパースレッディング(※)も含んだ形で割り当てられるのでしょうか。論理プロセッサと物理プロセッサのマッピングや各論理プロセッサに割り当てられたキャッシュなどを確認可能な「Windows Sysinternals」のコマンドラインユーティリティー「Coreinfo」を使用して、実際の割り当て詳細を確認してみましょう。
【※】ハイパースレッディング(Hyper-Threading):Intelのプロセッサに搭載されている技術で、1個のプロセッサコアを疑似的に2個に見せることで、複数スレッドを同時に処理できる。AMDのプロセッサにも同様の技術が搭載されており、こちらは「SMT」(Simultaneous Multi-Threading)と称されている。
Coreinfoを「-c」オプションを付けて実行すると、コアに関する情報が出力されます。仮想マシン「Gen2-VM」上で当該コマンドを実行してみます(画面3)。
Coreinfoでは、物理プロセッサ(物理コア)が2つ存在し、ハイパースレッディングが有効なため、4論理プロセッサに見えていることが分かります。
では、ハイパースレッディングが搭載されていないCPU、もしくはハイパースレッディングが無効化されているHyper-Vホストの場合、仮想マシンに対するプロセッサの割り当てはどのように見えるのでしょうか。
4コア/4スレッドの物理プロセッサを搭載しているHyper-Vホスト(HOST39)で、仮想プロセッサ数を「4」に設定した仮想マシン作成し、当該仮想マシン上でCoreinfoを実行してみました(画面4)。
仮想マシン上でもハイパースレッディングが使用されておらず、ゲストOS上からも4つの物理プロセッサ(物理コア)が認識されていることが分かります。
このように、同じ仮想プロセッサ数を割り当てたとしても、Hyper-Vホストの物理CPUによって仮想マシン上で認識される「物理」プロセッサの数が異なる場合があるので、実際の環境で確認しておいた方がよいでしょう。
ただし、この仮想マシンレベルにもハイパースレッディングを透過させるかどうかについては、設定で変更可能です。詳細は「NUMA」の設定の項をご確認ください。
割り当てられる仮想プロセッサ数ですが、Hyper-VホストのCPUの物理コア数/論理コア数を超えて設定した場合、設定は完了するものの仮想マシンを起動したタイミングで起動不可のエラーが発生します。
例えば、4コア/8スレッドの物理プロセッサを1つ積んだHyper-Vホストは、論理プロセッサ数でいえば「8」となります。このHyper-Vホスト上では仮想プロセッサ数「8」の仮想マシンは起動できますが、仮想プロセッサ数「16」の仮想マシンは画面5のエラーで起動できません。
これはエラーにも記載のある通り、仮想マシンに設定された仮想プロセッサ数がHyper-Vホストの論理プロセッサ数(画面5の環境は前述の通り8論理プロセッサ)を超えているため、仮想マシンを起動できません。すなわち、1台の仮想マシン当たりに割り当て可能な仮想プロセッサ数は、Hyper-Vホストの論理プロセッサ数が上限であるという点に注意してください。
複数の仮想マシンで仮想プロセッサ数の合計値であれば、Hyper-Vホストの論理プロセッサ数を超えることができます(8論理プロセッサに対して、3台の仮想マシンで仮想プロセッサ数の合計値が「24」など)。
Hyper-Vホストにおける論理プロセッサや仮想プロセッサの最大値は、以下のMicrosoftの公式ドキュメントを参照してください。
なお、Hyper-Vホストのバージョンによって、サポートされる最大値が異なります。上記ドキュメントは「Windows Server 2025」の場合ですが、ドキュメントの上部でWindows Serverのバージョンを選択できるので、適切なバージョンを選択して確認してください。
サポートされる仮想プロセッサ数も上記ドキュメントで確認できますが、論理プロセッサ数に対してあまりにも多くの仮想プロセッサを設定した場合は、仮想マシンが処理するためにHyper-Vホストに対してプロセッサの使用を要求し、プロセッサが使用可能になるまでの待機時間(CPU wait)が増える場合があります。待機時間の増加がHyper-Vホスト上の全仮想マシンに波及することで、全体のパフォーマンスが低下する恐れがあります。
1論理プロセッサに対してどのくらいの仮想プロセッサを割り当てるか(CPUオーバーコミット率)の計算は、一概には難しく、実際のワークロードのCPU利用率を見ながら調整していくのが一般的です。「Microsoft SQL Server」など、CPU負荷の高いワークロードを稼働させる場合には、CPUオーバーコミット率はできるだけ低く抑えることが無難といえます。
同じプロセッサ設定画面には「リソースコントロール」という項目もあります(画面6)。
こちらでは「仮想マシンの予約」「仮想マシンの限度」「相対的な重み」の3つの値が設定可能で、割り当てる仮想プロセッサ数とは別に細く調整できます。
最初の「仮想マシンの予約」は、パーセンテージで値を指定しますが、指定した値のプロセッサリソース(CPUリソース)がその仮想マシン用に予約され、いつでも当該仮想マシンが利用可能な状態になります。つまり、Hyper-Vホスト全体の利用率が増大して高稼働状態になったとしても、予約したリソースは即時利用が可能なため当該仮想マシンのパフォーマンス劣化を最小限に抑えることが可能です。
しかし、予約設定している仮想マシンがプロセッサリソースを要求すると、最優先で予約分のリソースが割り当てられるため、他の仮想マシンにリソースが行き届かない場合があります。その場合、リソースが割り当てられなかった仮想マシンのパフォーマンス劣化が想定されるので、仮想マシン全体から見てどの程度のリソース予約を許容するかを判断する必要があります。
2つ目の「仮想マシンの限度」は、仮想マシンに対して割り当てるHyper-Vホストのプロセッサリソースの上限値の指定となります。パーセンテージで値を指定しますが、割り当てられたプロセッサリソースをどの程度使用してよいかの設定になるので、与えられたプロセッサリソースを全て使用していい場合には100%になります。
しかし、「このワークロードはリソースがあればあるだけ使ってしまうので、他のワークロードとのバランスのために使用できるリソースに上限値を設定したい」というニーズもあるでしょう。その場合は、この値を引き下げることで、使用するプロセッサリソースの上限を設定できます。
なお、この値は「上限値」であって、100%のリソースを割り当てることを保証するわけではありません。多数の仮想プロセッサによるリソース競合が発生した場合には、割り当てられるプロセッサリソースはもっと少ないものになります。あくまでも「その仮想マシンに割り当て可能なプロセッサリソースの上限値」である点に留意してください。
3つ目の「相対的な重み」は、リソース競合が発生した際のプロセッサリソース割り当ての優先順位となります。「1」~「10,000」の範囲での指定になり、既定値は「100」です。
これは、プロセッサリソースを割り当てる際に参照される値になります。この値が「200」に設定された仮想マシンと「100」に設定された仮想マシンでは、優先度が2倍異なるという意味で、設定値が「200」の仮想マシンに対して優先的にプロセッサリソースが割り当てられることになります。
リソース競合が発生した際、より優先的にリソースが割り当てられることになるので、競合時のパフォーマンス劣化を抑えられますが、優先度の低い仮想マシンはよりパフォーマンス劣化が発生しやすい状態になる、ということにもつながります。
このプロセッサリソースの割り当て制御については、ベンチマークテストで確認可能です。
筆者の環境でのベンチマークテスト(hiyohiyo氏が開発した「CrystalMark Retro」を使用)の結果になりますが、例えば「仮想マシンの限度」を50%に設定した場合、100%割り当て時(画面7〈左〉)の「シングル5752/マルチ22034」と比較して、「シングル3073/マルチ10888」とおおよそ50%のベンチマークスコアの低下が確認できました(画面7〈右〉)。
「相対的な重み」に関しては、2つの仮想マシン上でベンチマークを同時実行した際、設定値が同じ値(100)だった場合にはほぼ同じ値が計測されたのに対し、1つの仮想マシンで「200」に設定した場合には、与えられた全てのCPUコアを使用する「マルチ」の結果に2倍に近い差(重み200の仮想マシンでは「13696」に対して、重み100の仮想マシンでは「7127」)が生じました(画面8)。
このように、リソースコントロールで細かい調整が可能な半面、仮想マシンに対してリソース配分の不公平を生じさせる設定となっています。そのため、不公平が生じた仮想マシンで想定外のパフォーマンス劣化が発生する可能性がある点に留意の上、実際の環境でテストした上でコントロール実施の可否を判断してください。
「プロセッサ」配下の「互換性」は、仮想プロセッサで利用できるCPUの機能に制限をかける機能です(画面9)。この項目は、第1世代仮想マシンでも第2世代仮想マシンでも同じ設定です。
単体のHyper-Vホストでは使いどころのない機能ですが、複数のHyper-Vホストをクラスタ化して冗長性を高めた構成にする場合や、古いプロセッサを搭載したHyper-Vホストから新しいプロセッサを搭載したHyper-Vホストへの移行の際に非常に重要な設定となります。
この機能を利用することで、同じアーキテクチャ(Intel CPU同士やAMD CPU同士)であれば世代の異なるプロセッサ間で「仮想マシンを稼働したままホスト間の移行」が可能になります。
どのようにして異なる世代のプロセッサ間で移行できるのかなど、本機能の詳細については、Hyper-Vホストの高可用性設定の回で解説します。
「プロセッサ」配下の「NUMA」は、仮想プロセッサのNUMA(Non-Uniform Memory Access)構成を設定する機能となります(画面10)。この項目は、第1世代仮想マシンでも第2世代仮想マシンでも同じです。
NUMAについては本連載第2回の「Hyper-Vホストの構成」でも触れましたが、マルチプロセッサ構成のHyper-Vホストで重要になる設定です。
画面10は2つの6コア/6スレッドの物理プロセッサを搭載したHyper-Vホスト上で、12の仮想プロセッサを割り当てた仮想マシンのNUMA設定画面です。この仮想マシンでは「構成」の項目で示している通り、ソケット数およびNUMAノード数がそれぞれ「2」と設定されています。
このゲストOS上で、Coreinfoを「-c」オプション(コアに関する情報)、「-n」オプション(NUMAノードに関する情報)、「-s」オプション(ソケットに関する情報)を付与して実行すると、画面11のように「12の仮想プロセッサ」「2つのソケット」「2つのNUMAノード」を認識していることが分かります。
Hyper-Vホストのマルチプロセッサ構成がそのまま仮想マシンにも反映されていることが分かりますが、例えば同じHyper-Vホストで「プロセッサ当たり2コアで2プロセッサ」構成の仮想マシンを作ることができるでしょうか。
単純に仮想プロセッサ数を「4」にすると、以下の画面12の「構成」で示されているように「プロセッサ当たり4コアで1プロセッサ」構成の仮想マシンとなってしまいます。これは物理(論理)プロセッサのコア数以下の仮想プロセッサ数であり、リソース割り当てが1プロセッサに収まってしまうためにこのような構成になってしまいます。
このあたりを詳細に設定できるのが「NUMAトポロジ」の各設定値になります。「NUMAトポロジ」の「プロセッサの最大数」の設定を見ると、1プロセッサ当たりの最大数が「6」となっています。
「プロセッサの最大数」は、仮想マシンに対して仮想プロセッサを割り当てる際に、1つの物理プロセッサから幾つ仮想プロセッサを割り当てるかの設定となります。
つまり、「プロセッサの最大数」が「6」であれば、6仮想プロセッサまで1つの物理プロセッサから割り当てることができます。この値は論理プロセッサの値でカウントされるので、ハイパースレッディングが有効な場合は物理コア数の倍が既定値として設定されます。
従って、この「プロセッサの最大数」を「4」未満に変更することで、先ほどの「プロセッサ当たり2コアで2プロセッサ」の4仮想プロセッサの仮想マシンを作成できます(画面13)。
Hyper-VホストでNUMAをサポートしている環境であれば、NUMA構成を変更することで任意のコア数を割り当てたNUMAをサポートする仮想マシンを構成可能です。
あまり想定されないシナリオですが、シングルプロセッサ構成のHyper-Vホストでも「プロセッサの最大数」を設定することで、2ソケットを認識した仮想マシンを作成することも可能です(画面14)。しかし、Hyper-Vホストのハードウェア構成を無視した構成となるため、実際の利用には慎重を期すべきでしょう。
このNUMA構成が重要になってくる理由は、本連載第2回でも触れた通り、NUMAノードのメモリアクセスにあります。
NUMA構成では、プロセッサごとにメモリがアサインされます。つまり、2プロセッサ構成の仮想マシンでは、割り当てたメモリ量が16GBの場合にNUMAノードごとに8GBずつ割り当てられます(画面15)。
同様にHyper-Vホスト側もNUMA構成に従ってメモリを割り当てるため、NUMAノードごとに8GBずつが割り当てられます。
2プロセッサを搭載したHyper-Vホストのメモリ搭載量が80GBだった場合、NUMAノードごとに40GBのメモリが装着されていますので、それぞれの40GBのメモリから8GBずつが仮想マシンに割り当てられることになります(画面16)。
次に4つの仮想プロセッサと32GBのメモリを割り当てた仮想マシンを起動しようとした場合、32GBの空きメモリがある物理プロセッサが見当たらないため、第2回で紹介した「NUMAノードにまたがるメモリ割り当て」が無効の場合は、仮想マシンを起動できずに以下のエラーが発生します(画面17)。
起動順序を逆にしても、メモリが確保できずにどちらかの仮想マシンは起動できません。
「NUMAノードにまたがるメモリ割り当て」を有効にすることでこれを回避できますが、NUMAノードをまたいだメモリアサインがなされるため、メモリアクセスでパフォーマンス低下の恐れがあります。
画面18は、2プロセッサ構成のHyper-VホストでNUMAノード間のメモリアクセスコストをCoreinfoで確認した結果(「-m」オプションを使用)ですが、NUMAノード0からNUMAノード1配下のメモリにアクセスする際には、NUMAノード0配下のメモリアクセスする場合に対して1.5倍のコストがかかっていることが確認できます。NUMAノード1からNUMAノード0のメモリにアクセスする場合も同様に、自身の配下のメモリアクセスよりも1.6倍のコストがかかっています。
つまり、メモリアクセスに関するパフォーマンス低下を避けたい場合には、NUMAノードを意識して仮想マシンの仮想プロセッサの割り当てやNUMA構成の検討、仮想マシンのメモリ割り当てや起動順序を決定した方が無難といえます。
プロセッサの項で仮想マシン上でのハイパースレッディングの有無をNUMAの設定で可能と記述しましたが、その設定値が「NUMAトポロジ」の「コアごとのハードウェアスレッド数」になります。
既定値は「0」に設定されており、ホストの設定を継承することになっています。この値を「1」に設定すると、コアごとのハードウェアスレッドが1つに限定されるため、必然的に仮想マシン上ではハイパースレッディングが見えなくなります。そのため、仮想マシン上でCoreinfoを実行すると4コア/4スレッドとして認識されます(画面19)。
なお、この「コアごとのハードウェアスレッド数」は、「Windows Server 2019」のHyper-V以降でサポートされている機能となり、「Windows Server 2016」のHyper-Vではサポートされていません。
NUMA構成を含め、最適な設定値は稼働させるワークロードによって異なりますので、動作確認やベンチマークを通じて最適な値を導き出してください。
「IDEコントローラー」は、第1世代仮想マシンのみで設定可能な項目です。第2世代仮想マシンではIDEコントローラーは使用できません。
第1世代仮想マシンを作成すると、既定で「IDEコントローラー 0」と「IDEコントローラー 1」が設定されます(画面20)。
IDEコントローラーでは、画面20の通り、ハードドライブ(仮想ハードディスク)とDVDドライブが設定可能です。また、各コントローラーでは「場所」として「0」と「1」が設定可能で、コントローラー当たり2つのデバイス、2つのコントローラーで計4つのデバイスを接続できます(画面21)。これはIDE規格にのっとった仕様であり、さらに複数の仮想ハードディスクを接続したい場合には、後述する「SCSIコントローラー」を使用する必要があります。
第1世代仮想マシンは、ブートディスクとしてIDE接続の仮想ハードディスク、もしくは仮想DVDドライブが使用可能です。基本的にはIDEコントローラーにはブートディスク、データ用の追加ディスクは後述するSCSIコントローラーに接続するのが無難です。
IDEコントローラーに接続されたDVDドライブは、ISOイメージをマウントできる他、Hyper-VホストにCD/DVDドライブが接続されている場合には、物理ドライブを接続可能です(画面22)。
CD-ROMやDVD-ROMからOSをインストールしたり、データをコピーしたりする機会はかなり少なくなってきたと思われますし、そもそもHyper-Vホストに物理のCD/DVDドライブが接続されていることもないと思いますが、便利な機能として覚えておいた方がよいでしょう。
なお、IDEコントローラーは「Integration Services(統合サービス)」がインストールできない、もしくは提供されていないOSでも認識されるため、デバイスドライバがなくてディスクが見えない、という事態を避けられます。古いOSを利用しなければならない場合には、第1世代仮想マシンを作成する、と覚えておくとよいでしょう。
「SCSIコントローラー」は、第1世代仮想マシンでも第2世代仮想マシンでも設定可能ですが、機能と接続可能なデバイスが若干異なります。
第1世代仮想マシンのSCSIコントローラーは、ブートディスクを接続できません。また、接続可能なデバイスは画面23の通り、ハードドライブ(仮想ハードディスク)と共有ドライブです。
第2世代仮想マシンのSCSIコントローラーは、ブート可能なハードドライブ(仮想ハードディスク)やDVDドライブを接続可能で、第2世代仮想マシンのディスクコントローラーはSCSIコントローラーのみとなっています。接続可能なデバイスは、前述のハードドライブ(仮想ハードディスク)やDVDドライブ、共有ドライブとなっています(画面24)。
1つのSCSIコントローラーは、最大で64のデバイスを接続可能です。また、SCSIコントローラーは4つまで追加可能なため、デバイス数としては合計256デバイスまで接続可能となっています。なお、共有ドライブに関しては、Hyper-Vホストの高可用性設定の回で解説します。
「ネットワークアダプター」は、仮想スイッチに接続するためのネットワークアダプターの設定項目になります(画面25)。この項目は、第1世代仮想マシンでも第2世代仮想マシンでも同じ設定となります。
「仮想スイッチ」の項目でHyper-Vホストで設定した仮想スイッチを選択することで、Hyper-Vホストが提供するネットワークに接続できます。
この設定画面では、VLAN(Virtual Local Area Network)やQoS(Quality of Service)の設定、詳細設定項目である「ハードウェアアクセラレーター」や「高度な設定」でネットワーク周りのさまざまな設定が可能です。このあたりは仮想スイッチの設定と関連し、実際の設定を見ながら詳細な解説が必要であるため、ネットワークおよび仮想スイッチの回で取り上げます。
「レガシーネットワークアダプター」は、第1世代仮想マシンのみ設定可能な項目です。第2世代仮想マシンではレガシーネットワークアダプターは使用できません。
機能としては前述のネットワークアダプター同様、仮想マシンを仮想スイッチに接続するものとなりますが、ネットワークアダプターで提供されるハードウェアアクセラレーションやQoSなどの機能の一部は使用できません(画面26)。
レガシーネットワークアダプターのメリットは、「Intel 21140(DEC 21140)」というレガシーなネットワークアダプターをエミュレーションしているため、古いOS(画面27は、ゲストOSが「Windows Server 2003 R2」の仮想マシン)でも認識してくれる、という点です。
しかし、Intel 21140はかなり初期のネットワークアダプターであるため、通信速度が100Mbpsとなるので、その点だけ注意が必要です。
また、第1世代仮想マシンでネットワークブート(PEXブート)する場合には、レガシーネットワークアダプターを使用する必要があります。
第1世代仮想マシンでのPEXブートと、統合サービス(Integration Services)がインストールできない、もしくは提供されていないOSを使用する必要がある場合以外にはレガシーネットワークアダプターを使用するシナリオはないと思いますが、機能の一つとして覚えておくとよいでしょう。
「ファイバーチャネルアダプター」は、本連載第2回でも取り上げましたが、エンタープライズストレージにおいてよく使用されるファイバーチャネルネットワークに仮想マシンを接続するための仮想ファイバーチャネルアダプターの設定項目です。この項目は、第1世代仮想マシンでも第2世代仮想マシンでも同じ設定となります。
本連載第4回の「仮想マシンのハードウェア:ハードウェアの追加」の項で仮想マシンへのハードウェア追加を解説しましたが、その項目で仮想ファイバーチャネルアダプターも追加可能です。
しかし、第2世代仮想マシンでハードウェアとして追加し、設定を保存しようとした場合、画面28のようなエラーが表示されてファイバーチャネルアダプターの追加を完了できません。
このエラーを回避するには、以下のWindows PowerShellコマンドレットで仮想マシンの設定を変更する必要があります。本コマンドレットでの処理は、第1世代仮想マシンでは不要です。
- Set-VMSecurity -VMName <仮想マシン名> -VirtualizationBasedSecurityOptOut $true
本コマンドレット実行後、改めて追加作業することで、ファイバーチャネルアダプターの追加は完了します(画面29)。
仮想SAN(Storage Area Network)およびファイバーチャネルアダプターについては、利用するシナリオが限られるため本連載では扱いませんが、ファイバーチャネルアダプターを追加する必要がある場合には、本コマンドレットを思い出してください。
「COMポート」は、名前付きパイプを利用してシリアルポート接続するものであり、Hyper-Vホストの物理シリアルポートをリダイレクトするものではありません。画面29は第1世代仮想マシンでの設定画面になりますが、名前付きパイプを介してHyper-Vホストやリモートコンピュータと通信できます。
第2世代仮想マシンではGUI(グラフィカルユーザーインタフェース)設定画面にCOMポートの設定は表示されませんが、Windows PowerShellの「Set-VMComPort」コマンドレットを使用することでCOMポートを設定できます。
- Set-VMComPort -VMName <仮想マシン名> <COMポート番号> \\.\pipe\<名前付きパイプ名>
用途としては、シリアルポートを介したカーネルデバッグなどが考えられます。Microsoftの公式ページにも仮想COMポートを介した仮想マシンのカーネルデバッグの手法が紹介されています。
モデムなどのシリアル接続デバイスを使うための設定ではなく、あくまでも名前付きパイプを利用したコンピュータ間シリアル接続用途であると覚えておくとよいでしょう。
「フロッピーディスクドライブ」は第1世代仮想マシンのみ設定可能な項目です。第2世代仮想マシンでは仮想フロッピードライブは使用できません。
機能としては仮想DVDドライブにも似たものになりますが、フロッピーディスクのイメージファイル(.vfdファイル)をマウントし、仮想マシンからフロッピーディスクとして使用可能にする機能となります(画面31)。
フロッピーディスクをイメージ化するソフトウェアはなかなか見つからないと思いますが、本サイトに仮想フロッピーディスクに関する過去記事がありましたので参照してください。
前回、今回と2回に分けてHyper-V仮想マシンのハードウェア設定を見てきました。次回は仮想マシンの管理設定に関する詳細を見ながら、どのような管理機能が提供されているのかを解説します。
Microsoft MVP for Cloud and Datacenter Management(2012-2025)。現業の傍ら、コミュニティーイベントでの登壇や著作にてMicrosoftテクノロジーに関する技術情報の発信、共有を続けている。ネットワークやハードウェアといった物理層に近いところが大好きな、昔ながらのインフラ屋さん。得意技はケーブル整線。近著は『詳解! Windows Server仮想ネットワーク』(日経BP社)。
Copyright © ITmedia, Inc. All Rights Reserved.
Server & Storage 記事ランキング