この記事は、Dell Windowsエンジニアリング チームのAbhijit KhandeとVineeth V Acharyaによって作成されたものです。
コメントは大歓迎です! トピックを提案したり、その他のコメントを投稿したりするには、WinServerBlogs@dell.com にお問い合わせください。
Microsoft® Windows Server® 2012 Beta オペレーティング システムでは、Microsoft はネットワーク分野の多くの機能のサポートを導入しました。そのような重要で興味深い機能の1つが
シングル ルートI/O仮想化 (SR-IOV)。仮想マシンが単一のPCI-eデバイスを共有できるようにします。この投稿では、Windows Server 2012 Beta の SR-IOV の基本的な概要と、ネットワーク I/O 中の仮想化環境での CPU 使用率を大幅に削減する方法について説明します。
SR-IOVインターフェイスは、PCI Express(PCIe)仕様の拡張です。SR-IOV を使用すると、ネットワーク アダプターなどの 1 つの PCIe デバイスで、PCI バス上に複数の軽量ハードウェア サーフェスを提供し、さまざまなインスタンス間でそのリソースに個別にアクセスできます。これは、(通常の)物理機能(PF)に加えて、複数の仮想機能(VF)を使用することによって実現されます。これはハードウェアに依存するため、PCIeデバイスとプラットフォームの両方がこの機能をサポートしている必要があります。
従来、仮想マシン宛てのパケットは、ホストOSに存在する物理ネットワーク アダプター(物理機能を使用)によって受信されていました。このパケットは、NDIS (Network Driver Interface Specification for NIC) ドライバー モジュールによって処理されます。その後、パケットはHyper-Vスイッチに提供され、図1に示すように、パケットが処理され(ルーティング、VLANフィルタリングなど)、VMBusを介して宛先VMにパケットが転送されます。逆パスは、VMがパケットを送信する必要があるときにたどります。
SR-IOVを使用すると、VMは仮想機能(VF)を使用して、図1に示すように、従来のパスを完全にバイパスして、物理ネットワークアダプタと直接パケットを送受信できます。これにより、ネットワークI/Oが増加するだけでなく、ホストマシンのCPUのオーバーヘッドも削減されます。
図1: SR-IOVあり/なしのデータ パス
ライブ移行とSR-IOV
Windows Server 2012 Beta では、VM が SR-IOV を使用している状態でライブ マイグレーションを実行できます。ソース システムとターゲット システムがSR-IOVをサポートしており、ターゲットに使用可能なVFがある場合、VMは仮想機能を使用します。そうでない場合、VMは従来のパス(VM-Bus)に戻ります。
各SR-IOV対応ネットワーク アダプターは固定数の仮想機能を公開します。仮想機能は、PowerShellコマンド「Get-NetAdapterSriov」を実行することで取得できます。
パフォーマンス分析
SR-IOVがある場合とない場合のパフォーマンスを比較するために、ラボでいくつかのテストを実施しました。テスト環境は、1 つのテスト サーバー (テストが実行されるサーバー) と 1 つのファイル サーバーで構成されます。テスト サーバーは、Intel® X520 10GB EthernetアダプターとWindows Server 2012 Beta OSを搭載したDell PowerEdge™ R710 IIです。ファイル サーバーは複数のSMB共有をホストし、Dell PowerConnect™ 8024スイッチ経由で10GBネットワークを使用してテスト サーバーに接続されます。
ネットワーク データ転送に関与するさまざまなドライバー モジュールによってスケジュール設定されたDPC(Deferred Procedure Call)によって使用されるCPUに関してパフォーマンス データを収集しました。このデータは、次のシナリオで説明するように、ゲストOSとホストOSの両方でキャプチャされました。テスト サーバーには、ゲスト OS として Windows Server 2012 Beta を搭載した 4 台の同一の仮想マシンがあります。4台のVMは、仮想スイッチを介して10GBネットワークに接続されています。このテスト構成を図2に示します。
図2: テスト構成
パフォーマンス データを紹介する前に、このテストで使用される非常に重要なパラメーターを紹介することが重要です。の
Microsoft Windows OSには、遅延プロシージャコール(DPC)と呼ばれるシステム メカニズムが存在し、優先度の高いタスク(
割り込みハンドラ)を使用して、後で実行するために、必須だが優先度の低いタスクを延期します。これにより、デバイス ドライバーやその他の低レベルのイベント コンシューマーは、処理の優先度の高い部分をすばやく実行し、優先度の低い重要でない追加処理を実行するようにスケジュールできます。
シナリオ 1 – 仮想マシンのパフォーマンス結果 (ゲスト OS):
このシナリオでは、4 つの仮想マシン (VM) (VM 1 から VM 4) を使用しました。VM 1 と VM 2 で SR-IOV を有効にし (VM 設定の [SR-IOV を有効にする] オプションをオンにして)、VM 3 と VM 4 で SR-IOV を無効にしました (同じオプションをオフにします)。したがって、図 2 に示すように、VM 1 と VM 2 は仮想機能 (Intel アダプタによって公開される) を使用し、VM 3 と VM 4 はネットワーク通信に合成パス(VMBus)を使用します。
1つのSMB共有からVMへのデータ(サイズ20GB)のコピーを開始し、ゲストOSでシステムのCPU使用率ログを取得しました。
図3: 仮想マシン
の DPC CPU 使用率 図 3 では、SR-IOV は VM-1 と VM-2 の平均 DPC CPU 使用率を指し、非 SR-IOV は VM-3 と VM-4 の平均 DPC CPU 使用率を指します。グラフを見ると、2つのケースのCPU使用率に大きな違いはありませんが、ホストマシンのCPU使用率はまだ考慮されていません。
シナリオ 2 – ホスト マシン (ホスト OS) のパフォーマンス結果:
このシナリオでは、1台の仮想マシンを使用しました。SMB共有からVMへのデータ(サイズ20GB)のコピーを開始し、ネットワークI/Oで使用される2つのモジュール(NDISとVMBUS)のDPC CPU使用率をキャプチャしました。
図4: ホスト マシン
のDPC CPU使用率 結果を図4に示します。予想どおり、2つのケース(SR-IOVと非SR-IOV)のCPU使用率には大きな違いがあります。CPU 使用率は、SR-IOV の場合は 102 程度、非 SR-IOV の場合は 103 から 104 程度です。これは主に、SR-IOV の場合、仮想マシンが仮想機能を介して物理 NIC と直接通信するためです。したがって、ホストのCPUサイクルは、ネットワーク パケットの処理には使用されません。非 SR-IOV の場合 (図 1 を参照)、ゲスト OS は VM バスを介してホスト OS と通信し、ホスト OS はパケットを処理して物理 NIC 経由で送信します。そのため、VM バスや NDIS などのモジュールが広く使用されています。
合計CPU使用率を計算すると、SR-IOVを使用すると、ネットワークI/O中のCPU使用率がはるかに低いことがわかります。したがって、Windows Server 2012 Beta で SR-IOV を有効にすると、ネットワーク I/O 中の CPU オーバーヘッドが削減され、システム全体のパフォーマンスが向上します。
PowerShell を使用した SR-IOV の設定
次の PowerShell コマンドを使用して、SR-IOV が有効になっている新しい仮想スイッチを作成し、その仮想スイッチを既存の仮想マシンの仮想ネットワーク アダプターに接続できます。
メモ:次のコマンドを実行する前に、BIOSで次のオプションを有効にする必要があります。
(単一のネットワーク アダプター(Intel X520)が接続されていることを前提としています)
$NetAdap = Get-NetAdapter |Where-Object { $_.Status -eq "Up"}
(-EnableIovスイッチは、仮想スイッチでSR-IOVを有効にするために使用されます)
New-VMSwitch -Name "SRIOV Switch" -NetAdapterName $NetAdap.Name -AllowManagementOS $True -Notes "X520のSRIOVスイッチ" -EnableIov $True$VMSw
= Get-VMSwitch
VM-1に新しいネットワーク アダプターを追加し、仮想スイッチに接続します。
Add-VMNetworkAdapter -SwitchName $VMSw.Name -VMName VM-1 -Name "SRIOV Adapter"
メモ:このコマンドを機能させるには、VMの電源をオフにする必要があります)
次のコマンド
を使用して、既存のVMネットワーク アダプターを使用することもできます。
$VMNet = Get-VMNetworkAdapter -VMName VM-1
Connect-VMNetworkAdapter -VMName VM-1 -SwitchName $VMSw.Name -Name $VMNet.Name
各VMネットワークアダプタには、IovWeightとVmqWeightの2つのプロパティがあり、それぞれSR-IOVとVMQに対応しています。 これらの重みを調整すると、機能が有効または無効になります。