Nhiều lần tôi gặp tình huống copy file chậm hơn nhiều từ/đến máy ảo trên host Hyper-V chạy Windows Server 2019 so với VM cùng cấu hình trên host chạy Windows Server 2016. Trong một số test, tốc độ đọc/ghi qua mạng đến VM trên Windows Server 2019 gần gấp 3 lần thấp hơn so với WS2016 (test copy qua SMB, SSH/SCP). Trong bài này, tôi mô tả một số phương pháp khác nhau cải thiện hiệu suất mạng của máy ảo Hyper-V chạy trên Windows Server 2019 (và các bản Windows 10/11 mới nhất).
Receive Segment Coalescing (RSC) trong Hyper-V vSwitch
Trước hết, lưu ý tính năng Receive Segment Coalescing (RSC) xuất hiện trong Hyper-V trên Windows Server 2019/2022 (và Windows 10 1809+). Receive Segment Coalescing dùng ở cấp virtual switch (vSwitch). RSC cho phép giảm tải CPU và tăng throughput mạng bằng cách gộp nhiều segment TCP thành segment lớn hơn. Hiệu suất mạng cải thiện vì segment lớn xử lý nhanh hơn nhiều segment nhỏ.
Trong các phiên bản Hyper-V trước (Windows Server 2016/2012R2), chỉ hỗ trợ chế độ Receive Segment Coalescing phần cứng ở cấp NIC.
Nếu hỗ trợ RSC được bật, có thể gây độ trễ mạng thêm trong một số cấu hình phần cứng.
Vấn đề xảy ra cả trên Windows Server 2019 Full GUI và free Windows Hyper-V Server.
Mặc định, RSC được bật cho tất cả external vSwitch trên Windows Server 2019.
Bạn có thể kiểm tra RSC có bật cho virtual switch không bằng lệnh:
Get-VMSwitch | Select-Object *RSC*
Bạn có thể tắt dùng RSC cho traffic IPv4 trên network adapter client bằng lệnh:
Disable-NetAdapterRsc -Name "Ethernet" -IPv4
Kiểm tra xem tốc độ copy trong VM Hyper-V có tăng sau khi tắt RSC không. Nếu tốc độ mạng cải thiện, bạn có thể tắt RSC trên virtual switch VM kết nối.
Bạn có thể kiểm tra throughput mạng dùng công cụ iperf.
Để tắt software RSC cho virtual switch cụ thể, chạy lệnh:
Set-VMSwitch -Name vSwitchName -EnableSoftwareRsc $false
Bạn có thể bật/tắt RSC ngay lập tức, nó không ảnh hưởng kết nối đang hoạt động.
Hoặc bạn có thể tắt hoàn toàn RSC trên host Windows:
netsh int tcp set global rsc=disabled
Chế độ Virtual Machine Queue (VMQ) trong driver card mạng
Trong một số trường hợp, nếu VMQ (Virtual Machine Queue) được bật trong driver card mạng vật lý của host Hyper-V, có thể dẫn đến hiệu suất mạng kém trong VM Hyper-V. VMQ là tính năng phần cứng và nếu phần cứng không hỗ trợ nhưng bật trong driver, có thể gây mất gói tin và tăng độ trễ mạng. Vấn đề điển hình với card mạng Broadcom Gigabit và xảy ra ở mọi phiên bản Hyper-V (Windows Server 2012 R2/2016/2019).
VMQ thiết kế để cải thiện hiệu suất mạng bằng cách chuyển tiếp gói tin trực tiếp từ card mạng vật lý đến máy ảo.
Bạn có thể tắt VMQ trong properties driver card mạng.
Hoặc hiển thị danh sách card mạng hỗ trợ VMQ và trạng thái bằng PowerShell:
Get-NetAdapterVmq
Để tắt VMQ cho NIC cụ thể, chạy lệnh dưới (network adapter sẽ không khả dụng vài giây):
Set-NetAdapterVmq -Name “NICName” -Enabled $False
Sau khi tắt VMQ, tốt nhất khởi động lại host và kiểm tra hiệu suất mạng.
Đảm bảo policy giới hạn băng thông QoS bị tắt trong Windows.
Tối ưu cài đặt TCP cho Hyper-V trên Windows Server 2019
Lưu cài đặt TCP hiện tại trên host Hyper-V và áp dụng cài đặt mới làm cho TCP settings trong Windows Server 2019 gần giống Windows Server 2016.
Lưu cài đặt hiện tại:
Get-NetTCPSetting -SettingName Datacenter,DatacenterCustom,InternetCustom,Internet|select SettingName,CongestionProvider,CwndRestart,ForceWS|Export-csv c:\backup\ws2019_network_stack_settings_nettcp_backup.csv
Mặc định trong Windows Server 2019 và Windows 10 1709+, triển khai CUBIC của TCP được dùng. Thuật toán này tối ưu cho mạng tốc độ cao độ trễ cao (cũng dùng mặc định trong Linux kernel 2.6.19+).
Áp dụng cài đặt sau chỉ trong Windows Server 2019 hoặc Hyper-V 2019.
Áp dụng NetTCP settings mới cho LAN:
Set-NetTCPSetting -SettingName DatacenterCustom,Datacenter -CongestionProvider DCTCP
Set-NetTCPSetting -SettingName DatacenterCustom,Datacenter -CwndRestart True
Set-NetTCPSetting -SettingName DatacenterCustom,Datacenter -ForceWS Disabled
Cho WAN:
Set-NetTCPSetting -SettingName InternetCustom,Internet -CongestionProvider CTCP
Set-NetTCPSetting -SettingName InternetCustom,Internet -DelayedAckTimeoutMs 50
Set-NetTCPSetting -SettingName InternetCustom,Internet -ForceWS Disabled
Tắt phương pháp tối ưu mạng RSS và RSC ở cấp TCP stack:
netsh int tcp show global
netsh int tcp set global RSS=Disabled
netsh int tcp set global RSC=Disabled
Hoặc ở cấp 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
Tắt vRSS cho tất cả VM:
Get-VM | Set-VMNetworkAdapter -VrssEnabled $FALSE
Tắt Large Send Offload (LSO) trên NICs:
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
Bạn cũng có thể tắt các tùy chọn này trong tab Advanced của properties network adapter:
- Recv Segment Coalescing (IPv4/IPv6) = Disabled
- Large Send Offload V2 (IPv4/IPv6) = Disabled
Các cài đặt TCP stack này sẽ làm cài đặt giao thức mạng Windows Server 2019 tương tự các phiên bản Windows Server trước.