WindowsのHyper-Vで仮想マシンのネットワークが遅くなる問題を回避するTech TIPS

Hyper-Vの仮想マシン環境でネットワークを使う場合、トラフィックが激しくなるとエラーになることがある。Windows Server 2008 R2 SP1+Hyper-V 2.0の場合はパッチを適用する。それ以外の環境の場合は、ネットワーク・アダプタの設定でオフロード処理を無効にすると解決することがある。

» 2012年01月20日 05時00分 公開
[打越浩幸デジタルアドバンテージ]
「Tech TIPS」のインデックス

連載目次

対象OS:Windows Server 2008/Windows Server 2008 R2



解説

 Hyper-Vの仮想マシンでネットワークを使う場合、システム全体のネットワーク・トラフィックが激しくなると、ネットワークが遅くなったり、突然通信できなくなったりすることがある。例えば次のような症状が現れることがある。

  • 仮想マシンとのネットワークの通信速度が非常に遅くなる
  • 仮想マシン上でのファイル・コピーが非常に遅くなる。例えば通常は数十Mbytes/sの速度でコピーできるはずが(ギガビット・イーサネットを使用している場合)、数Kbytes/sぐらいになる
  • 仮想マシンに対する(ほかのPCからの)リモートデスクトップのセッションが頻繁に一時停止したり、接続がたびたび切断されて、再接続をやり直すようになる
  • 仮想マシンからの通信(例えばメールの読み出しなど)が突然切れる

 ほかにもいろいろな症状があるが、このエラーは常に起こるわけではなく、大きなサイズのパケットを送受信している場合や、トラフィックが非常に多くなった場合に起こりやすいようだ。ファイル・サーバやWebサーバに対するアクセスの場合は、TCPの通信が遅延して途中で強制切断されたりしても、上位プロトコルで再接続を繰り返すように作られていることが多いので、かなり遅くなっても動作するが、アプリケーションによってはリトライをせずにすぐにエラーとなるものがある。

ファイル・コピーが遅くなる例 ファイル・コピーが遅くなる例
これはHyper-V上の仮想マシンから、外部のファイル・サーバへ大きなファイルをコピーしようとしているところ。ギガビット・イーサネットを利用しているので、本来ならば数十Mbytes/sでコピーできるはずだが、数Kbytes/sと表示されている。場合によってはそのうちタイムアウトして、コピーが失敗することもある。
  (1)通常ならば数十Mbytes/sは期待できるはずなのに、コピー速度がわずか13.5Kbyte/sしか出ていない。このとき、ほかの仮想マシンのネットワークもほぼすべて止まっていることが多い。

 このとき、ネットワーク・モニタでトラフィックを観測してみると、Hyper-V(の仮想マシン)側の応答が途中で遅くなったり、無応答になったりしているようである。また、すべてのHyper-V環境で起こるわけではなく、Hyper-Vの仮想ネットワーク・マネージャで新しい仮想ネットワークを作ったり、その設定を変更したりした後に起こりやすいようである。

 この症状に対して、マイクロソフトではWindows Server 2008 R2 SP1環境向けのホットフィックス・パッチを提供しているが、それ以外の環境には適用できない。SP1未適用のWindows Server 2008 R2やWindows Server 2008のHyper-Vの場合は、 Hyper-Vのネットワーク・インターフェイスでオフロード機能を無効にすると直ることがある。本TIPSではそれらの方法を紹介する。

Windows Server Insiderの関連記事 連載 Windowsネットワーク「IPチェックサムについて
連載 Windowsネットワーク「TCPチェックサムについて
連載 Windowsネットワーク「UDPチェックサムについて

 なおオフロード機能とは、IPパケットやTCP/UDPパケットのヘッダ中に格納するチェックサム値の計算を、ホストのCPUではなく、NIC上のコントローラ・チップで行う機能である。これにより、ホストCPUの負荷が軽減され、ネットワーク処理やシステム全体のパフォーマンスが改善するというわけだ。ヘッダ中にセットするチェックサムの計算は、処理は単純なものの、送信するパケット全体に渡ってデータを読み出して計算しなければならないため、少なからずCPUパワーを必要とする(チェックサムについては関連記事参照)。これをネットワーク・インターフェイス側で実行してくれるなら、CPU側での処理は送信するパケットのデータを送信バッファにセットするだけでよい。

操作方法

 Hyper-Vでネットワークが重くなる場合、最初にするべきことは最新のネットワーク・ドライバへの更新である。ドライバのバージョンによってこのような症状が出たり、出なかったりすることがあるようなので、まずは最新のネットワーク・ドライバへの更新を試みる。それでも症状が改善されないようなら、以下の方法を実行する。

●方法1―Windows Server 2008 R2 SP1向けの更新プログラムを適用する

 Windows Server 2008 R2 SP1上でHyper-V 2.0を利用している場合は、次のサポート技術情報経由で入手できる更新プログラムを適用する。

●方法2―Hyper-Vのサーバ全体でオフロード処理を無効にする 

 方法1が使えない場合や効果がない場合、すでにインストールされているなどと表示された場合には、ネットワーク・インターフェイスのオフロード機能を無効にしてみるとよいだろう。オフロード機能を無効にするには2つの方法がある。1つは、Hyper-Vのサーバ全体でオフロード処理を無効にする方法であり、もう1つは各仮想マシンごとで無効にする方法である。

 Hyper-Vをインストールする場合、ネットワーク・インターフェイスを2つ用意して、1つを仮想マシン(Hyper-V)専用のネットワークとして利用することが推奨されている。このインターフェイスでオフロード処理を無効にすると、Hyper-V全体でオフロード処理が無効になる。このためにはまずHyper-Vのサーバでネットワーク・アダプタの一覧画面を開き([コントロール パネル]の[ネットワークと共有センター]から[アダプターの設定の変更]を開く)、Hyper-Vの仮想ネットワークとして利用しているインターフェイスのプロパティ画面を開く。

仮想ネットワーク用のインターフェイスのプロパティ画面を開く 仮想ネットワーク用のインターフェイスのプロパティ画面を開く
Hyper-Vの仮想ネットワークにバインドされているネットワーク・インターフェイスのプロパティ画面を開いてオフロード処理を無効にする。
  (1)Hyper-Vを利用する場合は、Hyper-Vの仮想ネットワーク用に専用のインターフェイスを用意することが多い。
  (2)これをクリックして、オフロード処理の設定を行う。
  (3)これがバインドされているインターフェイスのプロパティを開くこと。

 「Microsoft 仮想ネットワーク スイッチ プロトコル」にバインドされているインターフェイス((3))であることを確認後、一番上にある[構成]ボタンをクリックする。すると次のような画面が表示されるので、オフロード関連の機能をすべてオフ/無効に設定する。

オフロード処理を無効にする オフロード処理を無効にする
「オフロード(offload)」と名の付くプロパティの設定をすべて無効にしておこう。
  (1)このタブを選択する。
  (2)これらをすべて順に無効にしておく。このインターフェイスの場合、下の方にスクロールするとさらに「大容量送信オフロード 〜」という項目もあるので、そこも設定する。
  (3)デフォルトでは「有効」とか「Enabled」となっているはずなので、すべて「無効」「Disabled」に変更する。

 この例ではオフロード関連の機能は3つしかないが、ネットワーク・インターフェイスによってはこれ以外にもいくつかオフロード機能があるので(次の表参照)、トラブルを防ぐためにも、すべてオフにしておくとよいだろう。

オフロード機能名の例
IPv4 チェックサム オフロード
TCP チェックサム オフロード(IPv4)
UDP チェックサム オフロード(IPv4)
TCP チェックサム オフロード(IPv6)
UDP チェックサム オフロード(IPv6)
大容量送信オフロード(IPv4)(large send offload IPv4)
大容量送信オフロード Version 2(IPv4)
大容量送信オフロードVersion 2(IPv6)
オフロード機能の名前の例
「大容量送信オフロード」は大きなサイズのパケットの自動分割などを行う機能。チェックサム・オフロードに不具合のあるようなデバイス・ドライバでは大容量送信オフロードも正しく動作するか不明なので、念のために全部無効にしておこう。

 設定後はシステムを再起動しておく。なお、この方法を行っても症状が改善しない場合は、次の各マシンごとの設定も行っていただきたい。

●方法3―仮想マシンごとにオフロード処理を無効にする

 Hyper-VのVM上にゲストOSをインストールし、「統合サービス」も導入すると、「Microsoft Virtual Machine バス ネットワーク アダプター」という仮想ネットワーク・インターフェイスがインストールされる。このインターフェイスでオフロード機能を無効にすると、個別の仮想マシンごとにオフロード処理を無効にできる。システム全体での無効化が管理者権限の問題などで利用できない場合は、代わりにこの機能を使って、仮想マシンごとに無効化してもよい。

 まずゲストOSでネットワーク・インターフェイスのプロパティ画面を表示させる。

Microsoft VMバス・ネットワーク・アダプタのプロパティ画面を開く Microsoft VMバス・ネットワーク・アダプタのプロパティ画面を開く
Hyper-Vの統合サービスを導入すると、この仮想バス・ネットワーク・アダプタがインストールされるので、そのプロパティを変更する。
  (1)Hyper-Vの統合サービスで導入されるネットワーク・アダプタ名。
  (2)これをクリックして、オフロード処理の設定を行う。

 次にアダプタの[構成]ボタンをクリックして、各オフロード機能をすべて無効にする。

オフロード処理を無効にする オフロード処理を無効にする
「オフロード(offload)」と名の付くプロパティの設定をすべて無効にしておこう。
  (1)このタブを選択する。
  (2)これらをすべて順に無効にしておく。
  (3)デフォルトでは「有効」とか「Enabled」となっているはずなので、すべて「無効」「Disabled」に変更する。

 設定後は仮想マシンを再起動する。仮想マシンに複数の仮想ネットワーク・アダプタがインストールされている場合は、そのすべてでこの設定を行っておく。

「Tech TIPS」のインデックス

Tech TIPS

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。