I am trying to optimize the networking performance of a MikroTik CHR running as a production BGP router on Microsoft Hyper-V.
The main issue is that Hyper-V does not activate VMMQ for the CHR virtual network adapter, although VMMQ is requested and the physical NIC supports multiple VMQ queues.
Environment
-
MikroTik CHR
-
RouterOS 7.24.4 stable
-
Hyper-V host: Dell PowerEdge R440
-
Physical NIC: Broadcom NetXtreme E-Series Advanced Dual-port 10Gb SFP+ Ethernet LOM
External Hyper-V vSwitch
-
CHR has 14 vCPUs
-
CHR is used mainly as a BGP router
-
approximately 2.2 million routes in the routing table
-
production traffic is typically around 3–6 Gbit/s
-
packet rate can reach approximately 500–750 kpps
-
CHR virtual NIC is configured as an 802.1Q trunk carrying several VLANs
The physical Broadcom NIC reports VMQ enabled and 64 receive queues:
Get-NetAdapterVmq -Name "MEZZ 1 Port 1"
Enabled : True
BaseProcessorNumber : 4
MaxProcessors : 16
NumberOfReceiveQueues : 64
The Hyper-V virtual switch also has VMMQ/vRSS enabled.
However, for the CHR virtual NIC Hyper-V reports:
VmmqEnabled : False
VmmqEnabledRequested : True
VmmqQueuePairs : 4
VmmqQueuePairsRequested : 4
VMQWeight : 100
VmqUsage : 0
VrssEnabled : True
Interestingly, another Linux VM connected to the same physical NIC and the same Hyper-V virtual switch reports:
VmmqEnabled : True
VmmqEnabledRequested : True
VmmqQueuePairs : 4
VmqUsage : 1
There is one notable difference between these VMs:
- linux VM uses an Access VLAN (VLAN 10)
- MikroTik CHR uses a Hyper-V VLAN trunk:
OperationMode : Trunk
AllowedVlanIdListString : 9-10,400,992,2139,2375,3640
The physical NIC does allocate a VMQ queue to CHR:
QueueID : 0
State : 1
VmFriendlyName : BGP_NT_mt_01
ProcessorAffinityMask : 16
ProcessorGroup : 0
NumFilters : 1
So it appears that normal VMQ is allocated to the CHR, but Hyper-V does not enable VMMQ/multiple queues for this particular virtual adapter.
Things already tested
I manually requested VMMQ:
Set-VMNetworkAdapter -VMName "BGP_NT_mt_01" `
-VmmqEnabled $true `
-VmmqQueuePairs 4
Hyper-V accepts the configuration (VmmqEnabledRequested=True) but the actual state remains:
VmmqEnabled : False
I also:
- completely shut down and restarted the CHR VM;
- updated the Broadcom NIC driver;
- rebooted the complete Hyper-V host after the driver update;
- tested 8 VMMQ queue pairs instead of 4.
The result is always the same: VmmqEnabledRequested=True, but VmmqEnabled=False.
This is especially interesting because another VM on exactly the same vSwitch successfully gets VMMQ.
On RouterOS the Ethernet interface currently uses:
only-hardware-queue
I have found some reports suggesting changing the CHR interface queue type to:
multi-queue-ethernet-default
but I am not sure whether this has any relationship with Hyper-V VMMQ/vRSS or whether it only affects the RouterOS TX queue implementation.
I would therefore like to understand how multiqueue networking is actually supported by CHR on Hyper-V.
Questions
- Does MikroTik CHR currently support Hyper-V VMMQ/vRSS with multiple receive queues?
- Should Hyper-V normally report
VmmqEnabled=Truefor a CHR virtual NIC? - Is
multi-queue-ethernet-defaultrequired on the RouterOS interface for Hyper-V VMMQ to operate? - Can a Hyper-V VLAN trunk prevent VMMQ from being activated for a VM?
- Is there any RouterOS command that can show how many RX/TX queues are actually exposed by the Hyper-V synthetic NIC to CHR?
- Has anyone successfully used CHR on Hyper-V with VMMQ and several queue pairs?
Any experience with CHR + Hyper-V + VMMQ would be appreciated.

