Windows Server 8 の Hyper-V ではネットワークの設定画面よりハードウェアアクセラレータの設定が可能になっています。そこで気になるのが Virtual Machine Queues(VMQ) と Single Root I/O Virtualization (SR-IOV) になります。
VMQ や SR-IOV とは何者なのかを調べてみました。
VMQ と SR-IOV は両方とも仮想マシンのネットワークパフォーマンスを向上させ、Hyper-V Windows Server Management partitionのようなVM Manager(VMM)のオーバーヘッドとCPU ボトルネックを最小化させるテクノロジーになります。
ただし、それぞれ異なる方法でそれを実現しています。
VMQに関して
Windows Server 2008 R2 の新機能として VMQ が追加されました。
VMQを使用するには下記要件があります。
a. ハードウェア(ドライバ)での有効化
b. ホスト上での有効化
c. 仮想スイッチ
d. 仮想マシン内での有効化
がそれぞれ必要です(どれか一つでも無効状態のホストでは働きません)
a. NICドライバ(NDIS6.2以降)任せになるので、既定で有効になっているかどうかは各社ツールによって様々。チーミングツール、もしくはデバイスマネージャ上で設定します。
b. http://technet.microsoft.com/ja-jp/library/gg162696(WS.10).aspx (特に10GbEでは必須)
- GbEアダプタについては、HKLMSYSTEMCurrentControlSetServicesVMSMPParametersで“BelowTenGigVmqEnabled”と追加入力し、値を1に設定する。
- 10GbEアダプタの場合は、上記と同じ箇所に”TenGigVmqEnabled”と追加入力し、値を1に設定する。
c. SCVMM 2008 R2 から最適化パラメータをGUI設定するか、WMI 、もしくはPowerShellでVMNetworkOptimizationEnabled を有効にする。
(仮想スイッチの既定値は有効なので、この作業は任意)
Microsoft System Center Virtual Machine Manager(SCVMM)2008 R2を使用してHyper-VのVMを管理する際、VMのプロパティウインドウにある「仮想ネットワーク最適化を有効にする」の選択の有無により、VMネットワークアダプタのVMQ 機能が有効にも無効にもなります。このオプションは、Windows Server 2008 R2 Hyper-VのVMでSCVMM 2008 R2を使用する場合にのみ利用可能となります。
この設定を行うことによって、VMQOffloadWeightとChimneyOffloadWeightの値の変化が起こります。デフォルトでは「100」になっていますが、チェックONで「100」、チェックOFFで「0」になります。
WMIC /namespace:\rootvirtualization path Msvm_SwitchPort Get VMQOffloadLimit, MQOffloadUsage, VMQOffloadWeight, ChimneyOffloadLimit , ChimneyOffloadUsage, ChimneyOffloadWeight
ちなみに、VMQ とTCP Chimney Offoad は同時利用はサポートされていません。両方とも前提条件をクリアし使用可能状況においてはVMQが優先され使用されます。
d. VMQ対応のゲストOS上で統合サービス(Integration Services )<IC(Integration Components)と表現されることもある>をインストールし、物理NICをアサインした仮想ネットワークに対して vNIC を設定する(レガシNICは不可)。ゲストOSでの設定は必要ありません。
ここまでが Windows Server 2008 R2 のお話しです。
Windows Server 8 の Hyper-V 設定においてVMQのチェックの「ON」「OFF」による変化は次の通り。
Get-VMNetworkAdapter <VM名> | fl vmqweight
「ON」の場合はVMQWeightの値が100で、「OFF」の場合は0となります。これはSCVMM 2008 R2での「仮想ネットワーク最適化を有効にする」のチェックと同様の動作になります。ただし、SCVMMでは同時に変化が起こっていたChimneyOffloadWeightの値は変化しませんでした。
となるので、この設定画面では「C」の部分である「仮想スイッチ」の設定を行うことがわかります。
ではVMQとはどのような仕組みで動作しているか?
(ネタ元はこちら New Virtualization I/O Queuing Technologies from Intel, Microsoft Perspective )
通常のネットワークにおける受信パケット(送信パケットも同様)の動作は、物理NICから管理ホスト上にある仮想スイッチ経由でVMBusを通じてVMにデータが流れます。
仮想スイッチの役割として次のものがあります。
- ルーティング
- VLANフィルタリング
- データコピー
VMQを使用すると受信パケットにおいては各VM専用のキュー(VMQ)ができ、あたかも直接VMとの通信を行っているようになります。ただし、ホストPC上の仮想スイッチは通ることになります。この仮想スイッチの役割で使用するのはネットワークデータコピーのみになります。ルーティングやフィルタリングは既にNICのVMQで行われているので必要ありません。送信パケットも同様の経路を通ります。
また複数のキューが存在することになるので負荷は複数のコアに分散させることができるので、CPU処理の潜在的なボトルネックを軽減することになります。
SR-IOVに関して
ハイパーバイザを使用している仮想マシンは仮想スイッチ経由で物理NICに対してアクセスするので、どうしても仮想スイッチのパフォーマンスにおける潜在的なボトルネックが存在します。そこで仮想マシンから直接物理NIC にアクセスできるようになればパフォーマンスの向上が見込まれます。ただし、仮想化せずに使用するとその物理NICが占有されてしまうという課題が残ってしまいます。そこでIntelはXeon 5500番台以降のチップセットに I/O デバイスを仮想マシンに直接割り当てる機能である VT-d を搭載しました。
更にIntelはNICの仮想化機能において、VT-cを提供しています。これによって、仮想化されたNICを使用して直接物理NICに対してアクセスが可能になります。
VT-cは、大きく分けて、
- I/O Acceleration Technology(I/OAT)
- Virtual Machine Device Queues(VMDq)
- Single Root I/O Virtualization(SR-IOV)
の3つの機能で構成されています。
SR-IOV は VMQ と同じよう機能しますが、それぞれの VM ごとに別々のキューを作成する代わりに、それぞれの VM にとって別々のネットワーク デバイスのように動作する Virtual Function (VF – 仮想機能) を実際には作成します。VM は直接通信を VF と行い、VM と仮想スイッチでのネットワークデータ コピーの負荷をバイパスしています。
まとめ
VMQ や SR-IOV の目的は「物理サーバーと同等のパフォーマンスを得る」ことで、結果としてVMM のオーバーヘッドやCPUボトルネックの最小化を行います。
テクノロジ的には、それぞれNICを仮想化するのは同じですが(VMQはNICに対応するキュー)、その方法が異なり、よりベストなのはSR-IOVということになります。ただし、SR-IOVはまだOSでのサポートはされていないので現実的には Windows Server 8 の Hyper-V が登場してから本格的な普及が始まると思われます。