How to Set Up Windows Server 2016 Hyper-V Quality of Service
Hyper-V Quality of Service (QoS) in Windows Server 2016 lets administrators control and prioritise the network bandwidth and storage I/O that each virtual machine or virtual network adapter can consume. Without QoS controls, a single VM running a backup job or large file transfer could saturate the host’s resources and degrade performance for all other VMs. By configuring network bandwidth policies and storage IOPS limits, you ensure fair and predictable performance across your virtual environment.
Understanding Hyper-V QoS Components
Windows Server 2016 Hyper-V provides two distinct QoS mechanisms. Network QoS allows you to set minimum and maximum bandwidth limits on virtual network adapters attached to an extensible virtual switch. Storage QoS allows you to define minimum and maximum IOPS values for individual virtual hard disks, preventing any single VM from monopolising storage throughput. Both mechanisms operate independently and can be combined for comprehensive resource governance.
Part 1: Configuring Network Bandwidth QoS
Step 1: Verify the Virtual Switch Supports Bandwidth Management
Network bandwidth management must be enabled on the virtual switch. By default, new switches in Windows Server 2016 have bandwidth management enabled. To check and enable it on an existing switch:
Get-VMSwitch -Name "ExternalSwitch" | Select-Object Name, BandwidthReservationMode
The BandwidthReservationMode should be set to Absolute (for Mbps values) or Weight (for relative weighting). To enable absolute bandwidth management:
Set-VMSwitch -Name "ExternalSwitch" -EnablePacketDirect $false
Set-VMSwitch -Name "ExternalSwitch" -DefaultFlowMinimumBandwidthAbsolute 0
Step 2: Set Minimum and Maximum Bandwidth on a VM Network Adapter
Bandwidth policies are applied at the virtual network adapter level. Minimum bandwidth guarantees a floor of throughput for the VM even when the network is congested. Maximum bandwidth caps the VM so it cannot consume more than the specified amount, protecting other VMs on the same switch.
To set a maximum bandwidth of 100 Mbps and a minimum guaranteed bandwidth of 10 Mbps for a VM:
Set-VMNetworkAdapter -VMName "WebServer01" -MaximumBandwidth 100000000 -MinimumBandwidthAbsolute 10000000
Bandwidth values are specified in bits per second (bps). 100 Mbps equals 100,000,000 bps. To remove bandwidth limits, set both values to 0:
Set-VMNetworkAdapter -VMName "WebServer01" -MaximumBandwidth 0 -MinimumBandwidthAbsolute 0
Step 3: Verify Network QoS Settings
Confirm the bandwidth policies are in effect by querying the VM network adapter settings:
Get-VMNetworkAdapter -VMName "WebServer01" | Select-Object VMName, Name, MaximumBandwidth, MinimumBandwidthAbsolute
Part 2: Configuring Storage QoS
Step 4: Understand Storage QoS Policies
Storage QoS in Windows Server 2016 can be managed in two ways. Standalone storage QoS applies IOPS limits directly to individual VHD or VHDX files using Hyper-V Manager or PowerShell on the Hyper-V host. Centralised storage QoS requires Scale-Out File Server (SOFS) and allows policies to be defined and managed centrally, enforced across all hosts accessing the shared storage.
Step 5: Set Storage QoS on a Virtual Hard Disk (Standalone)
To apply storage IOPS policies directly to a virtual machine’s hard disk, use the Set-VMHardDiskDrive cmdlet. The MinimumIOPS parameter guarantees a floor of storage performance, and MaximumIOPS caps the disk throughput. One IOPS in Hyper-V Storage QoS corresponds to an 8 KB normalised I/O.
First, identify the hard disk controller and LUN for the VM:
Get-VMHardDiskDrive -VMName "WebServer01"
Then apply IOPS limits. The following example caps the disk at 500 IOPS and guarantees at least 100 IOPS:
Set-VMHardDiskDrive -VMName "WebServer01" -ControllerType SCSI -ControllerNumber 0 -ControllerLocation 0 -MaximumIOPS 500 -MinimumIOPS 100
Step 6: Configure Centralised Storage QoS with SOFS
For environments using Scale-Out File Server, Storage QoS policies are created on the file server cluster and automatically propagated to all Hyper-V hosts. Create a policy on the file server cluster:
New-StorageQoSPolicy -Name "GoldTier" -PolicyType MultiInstance -MaximumIops 2000 -MinimumIops 500
List existing policies to obtain the policy ID:
Get-StorageQoSPolicy | Select-Object Name, PolicyId, MaximumIops, MinimumIops
Assign the policy to a VM’s hard disk on the Hyper-V host, using the PolicyId from the output above:
Set-VMHardDiskDrive -VMName "WebServer01" -ControllerType SCSI -ControllerNumber 0 -ControllerLocation 0 -QoSPolicyID "paste-policy-id-here"
Step 7: Monitor Storage QoS Metrics
You can monitor the storage QoS performance using the Get-StorageQoSFlow cmdlet on the SOFS cluster, which shows current IOPS, throughput, and latency for each flow, as well as whether the minimum IOPS target is being met:
Get-StorageQoSFlow | Format-Table InitiatorName, Status, MinimumIopsBestEffort, MaximumIops, FilePath -AutoSize
Step 8: Verify and Test QoS Policies
After configuring both network and storage QoS, test the policies under load. Use a network throughput tool such as iperf3 inside the guest OS to verify that network throughput does not exceed the configured maximum. For storage, use DiskSpd or CrystalDiskMark inside the guest to generate I/O and verify that throughput remains within the configured IOPS limits. Adjust policy values based on observed behaviour and business priority requirements.
diskspd.exe -b8K -d30 -o4 -t4 -r -w50 C:TestFile.dat
Best Practices for Hyper-V QoS
Always set a meaningful minimum bandwidth or IOPS guarantee only for VMs where it is needed, such as critical business applications. Applying minimums to all VMs can lead to situations where the guaranteed totals exceed the physical capacity of the host. Use maximum limits broadly to prevent any single VM from starving others. Review and adjust QoS settings as workloads evolve using historical resource metering data. Document your QoS policies and tie them to SLA tiers to make governance decisions systematic and auditable.
Hyper-V QoS in Windows Server 2016 provides granular, per-VM resource governance that is essential for multi-tenant environments and busy production hosts. When combined with resource metering and capacity planning, it ensures that every virtual machine receives the resources it needs while protecting the performance of the overall environment.