Hyper-V で 10Gbps NIC の性能を引き出す

最近のサーバーには10GbpsのNICが搭載されることも珍しくなくなり、40Gbpsや56GbpsのInfiniband,さらには100Gbpsなんてキーワードも聞こえてくるようになりました。Hyper-Vをはじめ、仮想化環境でこれらの高速なNICを利用するとCPUがボトルネックになってスループットが上がらないケースもあるので、このCPUボトルネックを回避するオプションを紹介していきます。

ホストOSもゲストOSもCPUボトルネックが発生する可能性がある

最初に理解しておきたいのは、このCPUボトルネックはホストOSで発生する可能性もあり、ゲストOSでも発生する可能性があることです。従来、ネットワークパケットの処理というのは複数のCPUコアで並列処理するには不向きな処理で、基本的に1つのCPUコアで処理されます。現在のCPUの場合、1Gbps程度のスループットであれば問題がないのですが、10Gbpsなどでは1つのCPUコアで処理しきれなくなり、スループットが低下する可能性があります。そのような問題に対処するためにいくつかのオプションが用意されています。

Receive Side Scaling

NICのオプションとして古くから存在している Receive Side Scaling (RSS)は聞いたことがあると思います。Windows Server 2003 などの時代はすでに存在していました。おそらく、現在販売されているNICの多くが利用可能なオプションです。しかし、以前は相性による問題も発生しやすかったこともあり、現在でも問答無用で無効化する運用をしているケースも聞きます。1Gbps程度であれば無効にしていても問題はないのですが、10GbpsあたりになるとRSSを無効化していては性能を発揮できません。ですので、そろそろRSS無効化が前提の運用はやめておきましょう。

RSSはデバイスマネージャーでNICの詳細設定を表示して設定の確認や変更が可能です。また、PowerShell の Get-NetAdapterRSS コマンドを実行することでも確認できます。

Windows Server 2012 R2 に搭載された Hyper-V では、仮想マシンもRSSを利用できるようになり、Virtual Receive Side Scaling (vRSS) と呼ばれています。この機能はデフォルトでは無効化されていますので必要な場合に有効化します。これもホストOSと同様に仮想マシン内のデバイスマネージャーで設定するか、PowerShellで設定します。

Virtual Receive Side Scaling については、こちら(http://blogs.technet.com/b/networking/archive/2013/07/31/drive-up-networking-performance-for-your-most-demanding-workloads-with-virtual-rss.aspx)を確認してください。

Virtual Machine Queue

比較的新しい世代のNICは Virtual Machine Queue (VMQ) を利用することが可能です。このVMQはHyper-V 仮想スイッチのデータコピー処理を一部省略します。さらには従来1つのCPUコアで処理していた Hyper-V 仮想スイッチの処理を複数のCPUコアに分散することができます。VMQは Windows Server 2008 の時代に利用可能になっていましたが、Windows Server 2012 R2 では Dynamic VMQ という機能になり、より効率的にCPUリソースを利用できるようになりました。

VMQについては、詳細な情報がこちら(http://blogs.technet.com/b/networking/archive/2013/09/10/vmq-deep-dive-1-of-3.aspx) にありますので参照してください。

VMQを利用するには、まずVMQに対応している物理NICが必要です。VMQが利用可能な場合はホストOSでデバイスマネージャーを開き、NICの詳細設定を参照するとVirtual Machine Queues などの設定項目があり、そこで有効化する必要があります。

さらに仮想マシンの設定で、仮想NICの [仮想マシン キュー] を有効化する必要があります。

VMQが正しく有効化されている場合、 Hyper-V マネージャーのネットワークタブの状態欄で [OK(VMQはアクティブです)] と表示されます。

他にも知っておきたい機能はたくさんある

今回紹介したRSSとVMQはHyper-Vで10Gbpsネットワークを利用する際にほぼ必須の機能になると思います。この他にも Windows Server ではネットワーク通信をより高速に行うための機能が多く搭載されています。一部ですが、こちらに説明があるので、読んでみることをお勧めします。