How to Set Up Windows Server 2016 SR-IOV

Single Root I/O Virtualization (SR-IOV) is a PCI Express (PCIe) specification that allows a single physical network adapter to appear as multiple separate virtual network adapters in a virtualized environment. Each virtual function (VF) can be assigned directly to a virtual machine, bypassing the Hyper-V virtual switch and enabling near bare-metal network performance within VMs. Windows Server 2016 supports SR-IOV in Hyper-V, providing significant performance improvements for network-intensive virtual machine workloads. This guide covers configuring SR-IOV on Windows Server 2016 Hyper-V hosts.

Understanding SR-IOV Architecture

SR-IOV introduces two function types on a physical adapter. The Physical Function (PF) is the full-featured PCIe function visible to the host operating system and manages the physical adapter hardware. Virtual Functions (VFs) are lightweight PCIe functions derived from the PF that can be assigned to VMs. Each VF has its own dedicated hardware transmit and receive queues, allowing VMs to interact directly with the NIC hardware, bypassing the Hyper-V virtual switch and the software networking stack. This reduces latency, increases throughput, and substantially reduces CPU overhead for networking within VMs.

Prerequisites for SR-IOV

SR-IOV requires several prerequisites. The server hardware must have a BIOS or UEFI that supports SR-IOV and PCIe ARI (Alternative Routing-ID Interpretation). SR-IOV must be enabled in the system BIOS or UEFI settings. The physical network adapter must be SR-IOV capable, which is supported by most modern enterprise-class NICs from vendors including Mellanox, Intel, Chelsio, and Broadcom. The Hyper-V virtual switch must be created with SR-IOV enabled. The guest VM must be running a compatible guest operating system with SR-IOV driver support. The VM must be configured to use SR-IOV, which requires Generation 1 or Generation 2 VMs in Windows Server 2016.

Enabling SR-IOV in the System BIOS

Before configuring SR-IOV in Windows, ensure it is enabled in the server BIOS or UEFI. Access the server BIOS during boot and look for settings related to SR-IOV, PCIe or PCI Virtualization Technology (VT-d on Intel, AMD-Vi on AMD), and ARI Forwarding. Enable all applicable SR-IOV and IOMMU settings. Save and restart the server. The exact menu location varies by server manufacturer and BIOS version.

Creating an SR-IOV Enabled Virtual Switch

Create a Hyper-V virtual switch with SR-IOV enabled on the SR-IOV capable physical adapter. Open PowerShell with administrative privileges and create the switch:

New-VMSwitch -Name "SR-IOV-Switch" -NetAdapterName "Ethernet1" -EnableIov $true -AllowManagementOS $true

Verify the switch was created with SR-IOV enabled:

Get-VMSwitch -Name "SR-IOV-Switch" | Select-Object Name, IovEnabled, IovSupport, IovSupportReasons

If IovEnabled is True and IovSupport is True, the switch is correctly configured for SR-IOV. If IovSupport is False, review IovSupportReasons for the cause.

Configuring SR-IOV Virtual Functions

Check how many virtual functions are available on the physical adapter:

Get-NetAdapterSriov -Name "Ethernet1"

View the number of VFs currently allocated:

Get-NetAdapterSriovVf -Name "Ethernet1"

Set the maximum number of VFs to allocate (up to the adapter maximum):

Set-NetAdapterSriov -Name "Ethernet1" -NumVFs 32

Enabling SR-IOV on a Virtual Machine

Enable SR-IOV on a VM’s network adapter. The VM must be in a stopped state to enable SR-IOV on the network adapter:

Stop-VM -Name "VM01"

Connect the VM to the SR-IOV enabled switch if not already done:

Connect-VMNetworkAdapter -VMName "VM01" -SwitchName "SR-IOV-Switch"

Enable SR-IOV on the VM network adapter:

Set-VMNetworkAdapter -VMName "VM01" -IovWeight 100

Start the VM:

Start-VM -Name "VM01"

Verifying SR-IOV is Active in the VM

After starting the VM, verify that the VM is using an SR-IOV virtual function from the host:

Get-VMNetworkAdapter -VMName "VM01" | Select-Object VMName, Name, IovWeight, IovUsage, VirtualFunctionIndex

If IovUsage shows a value greater than zero and VirtualFunctionIndex shows a VF number, SR-IOV is actively in use. Inside the VM, a secondary network adapter with a name including the VF number should appear in Device Manager and Network Connections.

Configuring SR-IOV Weight and QoS

The IovWeight value controls the priority of VF assignment. A higher weight increases the likelihood that a VF is assigned to the VM. To prioritize SR-IOV for performance-critical VMs, set a higher weight:

Set-VMNetworkAdapter -VMName "VM01" -IovWeight 200

Set a queue pairs count to assign more hardware queues to a high-throughput VM:

Set-VMNetworkAdapter -VMName "VM01" -IovQueuePairsRequested 4

SR-IOV Limitations and Considerations

SR-IOV has several limitations to be aware of. Live migration is not supported while a VM is actively using an SR-IOV VF. Hyper-V will attempt to fall back to the software virtual switch during migration. Checkpoints are also affected as SR-IOV bypasses the virtual switch. Some network policies applied through the Hyper-V virtual switch, such as virtual machine QoS and port ACLs, do not apply to SR-IOV VFs. Certain features like VLAN tagging and bandwidth limits may require configuration on the VF adapter inside the guest rather than through the Hyper-V virtual switch.

Best Practices for SR-IOV

Reserve SR-IOV VFs for the highest-priority VMs with network-intensive workloads such as NFV, database servers, or real-time data processing applications. Test live migration behavior in your environment before deploying SR-IOV in production to understand the fallback behavior. Keep physical NIC firmware and drivers updated to ensure the latest SR-IOV stability and performance improvements. Monitor VF assignment using Get-VMNetworkAdapter to confirm SR-IOV is active for intended VMs. Document the number of VFs configured and allocated to facilitate capacity planning as the number of SR-IOV VMs grows.

SR-IOV on Windows Server 2016 Hyper-V delivers near native network performance for virtual machines, making it an essential configuration for network-intensive virtualized workloads that require maximum throughput and minimum latency.