Hyper-V ホストのネットワークパフォーマンスの改善

## はじめに

Windows 11 で Hyper-V を有効にした際に、仮想マシンをホストコンピューターが接続しているローカルネットワークに直接接続したい場合があります。例えば、複数の物理コンピューターがある場合に、ある物理コンピューターにホストした仮想マシンと物理コンピューターとの間で同じローカルネットワークのセグメントで直接通信させたい場合です。

Hyper-V の仮想スイッチマネージャーから [**外部**] ネットワークを作成すると、
物理ネットワークインターフェース (WiFi または イーサネット) にブリッジネットワークが構成されます。
仮想マシンの仮想 NIC を作成した [**外部**] ネットワークに接続することで、仮想マシンをローカルネットワークに接続することができるようになります。

この際、Hyper-V ホストにも仮想 NIC が作成され、同じ [**外部**] の仮想スイッチに接続されるよう構成されますが、
Hyper-V ホストからの外部ネットワークへのアップロードのネットワーク速度が極端に低下する場合があります。

この記事では、ネットワークパフォーマンスを改善する方法を紹介します。

## どのようなパフォーマンスの問題があったのか？

Hyper-V ホストに [**外部**] ネットワークの仮想スイッチを作成した後、
アップロードのネットワーク通信が極端に遅い、という現象が発生しました。

[Network Speet Test](https://apps.microsoft.com/store/detail/network-speed-test/9WZDNCRFHX52?hl=ja-jp&gl=jp) という無料の Windows ストアアプリをインストールして試したところ、以下のような結果でした。

ダウンロード (下り) は約 120 Mbps の速度が出ているのですが、アップロード (上り) はたった 0.5Mbps 程度しか出ないという状況です。

![ネットワークの速度のテスト-遅い結果](https://shigeyf.dev/posts/improve-network-performance-in-hyper-v-host/./slow-network-speed-tests-in-hyper-v-host.jpg)

明らかにおかしいと思われる様子なので、調べてみました。

> Hyper-V を有効にする前に測定したネットワーク速度や同じ LAN に接続した他のデバイスからの測定結果とも異なりました。

## ネットワーク アーキテクチャの理解

具体的な問題解決方法の前に、Hyper-V ホストに [**外部**] ネットワークの仮想スイッチを作成すると、どのようなネットワーク構成になるのか？

ネットワーク構成は以下のような図になります。

![ネットワークアーキテクチャ](https://shigeyf.dev/posts/improve-network-performance-in-hyper-v-host/./hyper-v-network-architecture.jpg)

Hyper-V ホスト OS からのネットワーク パケットは、仮想 NIC とネットワーク ブリッジの両方を経由して、物理 NIC から外部へ送受信されます。

[**コントロール パネル**] -> [**ネットワークとインターネット**] -> [**ネットワークと共有センター**] -> 左サイドのメニューの [**アダプター設定の変更**] をクリックすると、ネットワークインターフェースの一覧が表示されます。

"**vEthernet ([仮想スイッチの名前])**" という名前のネットワーク接続の項目 (デバイス名が "**Hyper-V Ethernet Adapter #[X]**") が、ホスト OS に接続された仮想 NIC になります。

> 注: [X] には連番の数字が割り当てられます

また、ネットワークブリッジは、"Microsoft Network Adapter Multiplexor Driver" というデバイス名のネットワーク接続の項目が表示されています。

Hyper-V ホスト OS から外部への接続は、この2つのネットワークを経由して行われることになります。

## 問題の解決方法: LSO の無効化

様々な問題の原因が考えられますが、仮想ネットワークアダプター (ソフトウェア) でハードウェアの最適化機能があやしいのではないかと考え、アップロード (ネットワーク送信) に関するハードウェア最適化機能に目を付けます。

ネットワークのハードウェア最適化機能は、マイクロソフトのドキュメントによい記事 (「[ハードウェアのみ (Hardware-Only) の機能とテクノロジ](https://learn.microsoft.com/ja-jp/windows-server/networking/technologies/hpn/hpn-hardware-only-features)」 があります。こちらを参考ください。

以下の機能があやしそうです。

> Large Send Offload (LSO)
>
> LSO を使用すると、アプリケーションは大量のデータ ブロックを NIC に渡すことができ、NIC はデータをネットワークの最大転送単位 (MTU) 内に収まるパケットに分割します。

ということで、デバイスマネージャーで仮想 NIC とネットワークブリッジのデバイス名のプロパティを確認します。[**高度な設定**] または [**Advanced**] タブを確認すると、詳細な機能のパラメーターが確認できます。

![ネットワークプロパティ-LSO有効](https://shigeyf.dev/posts/improve-network-performance-in-hyper-v-host/./network_device_properties_lso_enabled.jpg)

以下の Large Send Offload (LSO) 関連のパラメーターが、どちらのデバイスでも IPv4/IPv6 の両方で **有効 (Enabled)** となっていました。

* Large Send Offload Version 2 (IPv4)
* Large Send Offload Version 2 (IPv6)

これを **無効 (Disabled)** に変更します。

![ネットワークプロパティ-LSO無効](https://shigeyf.dev/posts/improve-network-performance-in-hyper-v-host/./network_device_properties_lso_disabled.jpg)

## LSO 無効化後のネットワーク速度の確認

LSOv2 の設定変更後、再度、[Network Speet Test](https://apps.microsoft.com/store/detail/network-speed-test/9WZDNCRFHX52?hl=ja-jp&gl=jp) でネットワーク速度を測定してみます。

![ネットワークの速度のテスト-問題解決後の結果](https://shigeyf.dev/posts/improve-network-performance-in-hyper-v-host/./good-network-speed-tests-in-hyper-v-host.jpg)

測定の結果、アップロード (上り) の速度が約 30 Mbps と改善されました。
この結果は、以前に測定した結果と大きな差異もなく、設定変更により正しく改善されたように見えます。

インターネットで検索して得られた[同じような現象の事例に対するアドバイス](https://superuser.com/questions/1371759/creating-an-external-virtual-switch-on-hyper-v-causes-host-to-experience-very-sl/1375670#1375670) とも同じ結果になっています。

## 最後に

この記事では、Hyper-V 導入後に実際に遭遇したネットワークのパフォーマンス問題と解決策を紹介しました。

もし今回のような問題が発生した場合、ダウンロードの問題かアップロードの問題かを識別すること、Hyper-V を有効にした場合と無効にした場合の比較、仮説に基づく設定変更の前後の比較など、問題の切り分けを行うことが重要です。

問題の原因らしい箇所を想定を見つけて、他に同じような現象になっている事例がないかもインターネットで確認してみると、より確証が得られるかもしれません。