Windows Server 2019のHyper-V VMでネットワークパフォーマンスが低下する原因と対策
Windows Server 2019が稼働するHyper-Vホスト上の仮想マシン(VM)との間でファイルコピーを行うと、同じ構成のVMをWindows Server 2016ホスト上で実行した場合に比べて、転送速度が大幅に遅くなるケースが何度も確認されています。テストによっては、Windows Server 2019上のVMへのネットワーク経由の読み書き速度(SMBやSSH/SCPでのコピー)が、WS2016の約3分の1まで低下することもあります。本記事では、Windows Server 2019(および最新のWindows 10/11ビルド)上で稼働するHyper-V仮想マシンのネットワークパフォーマンスを改善するための、いくつかの異なる方法を紹介します。
Hyper-V仮想スイッチにおけるRSC(Receive Segment Coalescing)
まず注目すべきは、Windows Server 2019/2022(およびWindows 10 1809以降)のHyper-Vに搭載されたRSC(Receive Segment Coalescing)機能です。RSCは仮想スイッチ(vSwitch)レベルで動作し、複数のTCPセグメントをより大きなセグメントに統合することでCPU負荷を軽減し、ネットワークスループットを向上させることを目的としています。大きなセグメントの方が多数の小さなセグメントよりも高速に処理できるため、理論上はネットワーク性能が向上します。
従来のHyper-V(Windows Server 2016/2012 R2)では、NICレベルのハードウェアRSCモードのみがサポートされていました。なお、RSCサポートを有効にすると、一部のハードウェア構成では逆にネットワーク遅延が発生する場合がある点に注意が必要です。この問題は、GUI版のWindows Server 2019でも無料のWindows Hyper-V Serverでも同様に発生します。
Windows Server 2019では、デフォルトですべての外部vSwitchに対してRSCが有効になっています。以下のコマンドで、仮想スイッチごとのRSC有効状態を確認できます。
Get-VMSwitch | Select-Object *RSC*
クライアント側のネットワークアダプターでIPv4トラフィック向けのRSCを無効化するには、次のコマンドを使用します。
Disable-NetAdapterRsc -Name "Ethernet" -IPv4
RSCを無効化した後、Hyper-V VM内でのコピースピードが向上したかどうかを確認してください。ネットワーク速度が改善した場合は、該当VMが接続されている仮想スイッチ上でRSCを無効化しましょう。ネットワークスループットの測定にはiperfツールが便利です。
特定の仮想スイッチに対してソフトウェアRSCを無効化するには、次のコマンドを実行します。
Set-VMSwitch -Name vSwitchName -EnableSoftwareRsc $false

RSCは稼働中でもオン・オフを切り替えることができ、アクティブな接続には影響しません。あるいは、Windowsホスト全体でRSCを完全に無効化することも可能です。
netsh int tcp set global rsc=disabled
ネットワークアダプタードライバーのVMQ(Virtual Machine Queue)モード
場合によっては、物理Hyper-VホストのネットワークアダプタードライバーでVMQ(Virtual Machine Queue)が有効になっていることが、Hyper-V仮想マシンのネットワークパフォーマンス低下の原因となることがあります。VMQはハードウェア機能であり、ハードウェアが対応していないのにドライバー側で有効になっていると、パケットロスやネットワーク遅延の増加を招きます。この問題はBroadcom製ギガビットネットワークアダプターで特に典型的で、Windows Server 2012 R2/2016/2019のすべてのHyper-Vバージョンで発生します。
VMQは、物理ネットワークアダプターから仮想マシンへパケットを直接転送することでネットワーク性能を高める仕組みですが、不適切な環境では逆効果になります。
VMQはネットワークアダプタードライバーのプロパティから無効化できます。

また、PowerShellを使ってVMQ対応のネットワークアダプターとその状態の一覧を表示することもできます。
Get-NetAdapterVmq
特定のNICに対してVMQを無効化するには、次のコマンドを実行します(ネットワークアダプターが数秒間利用できなくなる点に注意してください)。
Set-NetAdapterVmq -Name "NICName" -Enabled $False

VMQを無効化した後は、ホストを再起動してネットワークパフォーマンスを確認するのが望ましいでしょう。あわせて、WindowsのQoS帯域幅制限ポリシーが無効になっていることも確認してください。
Windows Server 2019のHyper-V向けTCP設定の最適化
Hyper-Vホスト上の現在のTCP設定を保存したうえで、Windows Server 2019のTCP設定をWindows Server 2016に近い状態へ調整する新しい設定を適用します。
まず現在の設定をバックアップします。
Get-NetTCPSetting -SettingName Datacenter,DatacenterCustom,InternetCustom,Internet|select SettingName,CongestionProvider,CwndRestart,ForceWS|Export-csv c:\backup\ws2019_network_stack_settings_nettcp_backup.csv
Windows Server 2019およびWindows 10 1709以降では、デフォルトでTCPのCUBIC実装が使用されます。このアルゴリズムは高遅延の高速ネットワーク向けに最適化されており(Linuxカーネル2.6.19以降でもデフォルト採用)、WAN環境には適していますが、LAN環境では必ずしも最適とは限りません。

以下の設定は、Windows Server 2019またはHyper-V Server 2019でのみ適用してください。
LAN向けのNetTCP設定を適用します。
Set-NetTCPSetting -SettingName DatacenterCustom,Datacenter -CongestionProvider DCTCP
Set-NetTCPSetting -SettingName DatacenterCustom,Datacenter -CwndRestart True
Set-NetTCPSetting -SettingName DatacenterCustom,Datacenter -ForceWS Disabled
WAN向けの設定は以下の通りです。
Set-NetTCPSetting -SettingName InternetCustom,Internet -CongestionProvider CTCP
Set-NetTCPSetting -SettingName InternetCustom,Internet -DelayedAckTimeoutMs 50
Set-NetTCPSetting -SettingName InternetCustom,Internet -ForceWS Disabled
TCPスタックレベルでRSSおよびRSCのネットワーク最適化機能を無効化します。
netsh int tcp show global
netsh int tcp set global RSS=Disabled
netsh int tcp set global RSC=Disabled
NICレベルで無効化する場合はこちらです。
Get-NetAdapter | Set-NetAdapterAdvancedProperty -DisplayName "Recv Segment Coalescing (IPv4)" -DisplayValue "Disabled" -NoRestart
Get-NetAdapter | Set-NetAdapterAdvancedProperty -DisplayName "Recv Segment Coalescing (IPv6)" -DisplayValue "Disabled" -NoRestart
Get-NetAdapter | Set-NetAdapterAdvancedProperty -DisplayName "Receive Side Scaling" -DisplayValue "Disabled" –NoRestart
すべてのVMに対してvRSSを無効化します。
Get-VM | Set-VMNetworkAdapter -VrssEnabled $FALSE
NIC上のLSO(Large Send Offload)を無効化します。
Get-NetAdapter | Set-NetAdapterAdvancedProperty -DisplayName "Large Send Offload Version 2 (IPv4)" -DisplayValue "Disabled" -NoRestart
Get-NetAdapter | Set-NetAdapterAdvancedProperty -DisplayName "Large Send Offload Version 2 (IPv6)" -DisplayValue "Disabled" -NoRestart
Get-NetAdapter | Restart-NetAdapter
これらのオプションは、ネットワークアダプターのプロパティにある「詳細」タブからGUI操作で無効化することもできます。
- Recv Segment Coalescing(IPv4/IPv6)= 無効
- Large Send Offload V2(IPv4/IPv6)= 無効

以上のTCPスタック設定を適用することで、Windows Server 2019のネットワークプロトコル設定を以前のWindows Serverバージョンとほぼ同等の状態にすることができます。変更を加える際は、事前にバックアップを取得し、本番環境に適用する前にテスト環境で検証することをおすすめします。
-
Hyper-V 2019で仮想スイッチを構成する方法を徹底解説
これまでの連載記事では、Hyper-V 2019を取り上げ、インストール手順、初期設定、そして最初の仮想マシンのデプロイ方法まで順を追ってご紹介してきました。まだお読みでない方は、以下のリンクからご確認いただけます。第1回:Hyper-V 2019 Server Coreのインストール第2回:Hyper-V 2019 Core Serverの初期設定第3回:Hyper-V 2019 Coreのリモート管理第4回:Hyper-V 2019で最初の仮想マシンを作成する第5回:Hyper-V 2019での仮想マシンのエクスポートとインポート本記事では、仮想マシンに仮想ネットワークアダプターを構成する
-
【修正版】Windows 7/8/10で「RPCサーバーを利用できません」エラーが出たときの対処法
RPC(Remote Procedure Call:リモートプロシージャコール)は、コンピュータの黎明期から存在する技術で、プロセス間通信の仕組みを利用しています。その主な目的は、クライアントとサーバーがネットワーク経由で相互に通信できるようにすることです。デバイス間の通信についても同様です。簡単に言えば、ネットワーク上でデータや情報を共有する際には必ずRPCが動作し、その処理を担っています。さらにRPCは、ネットワーク経由でのデバイス管理にも重要な役割を果たしており、スキャナーやプリンターなどの周辺機器の制御にも利用されています。「RPCサーバーを利用できません」エラーの原因は?RPCは異な