How to Configure Hyper-V Quality of Service on Windows Server 2019
Hyper-V Quality of Service (QoS) in Windows Server 2019 allows administrators to control the minimum and maximum bandwidth available to virtual machine network adapters and to set storage I/O weight limits. This ensures that critical workloads receive guaranteed bandwidth while preventing any single VM from monopolising shared resources. Proper QoS configuration is essential in multi-tenant environments and high-density Hyper-V deployments where resource contention can degrade performance.
Network QoS: Understanding Minimum and Maximum Bandwidth
Hyper-V supports two types of network bandwidth policies per virtual network adapter. The minimum bandwidth setting guarantees a VM will always receive at least the specified bandwidth when the physical network is congested. The maximum bandwidth setting caps the total throughput the adapter can use regardless of available capacity. Both values are specified in bits per second (bps) and can be set independently on each virtual network adapter attached to a VM.
The minimum bandwidth can be expressed as an absolute value in bps or as a weight from 1 to 100, where the weight determines the proportional share of bandwidth each VM receives relative to others sharing the same physical adapter. You cannot mix absolute and weight-based minimums on the same virtual switch — all adapters on a switch must use the same mode.
Enabling Bandwidth Management on a Virtual Switch
Before setting per-VM bandwidth limits, you must enable bandwidth management on the virtual switch. This is done at switch creation time or by modifying an existing switch. Open an elevated PowerShell session on the Hyper-V host.
# Create a new external switch with bandwidth management enabled
New-VMSwitch -Name "ExternalSwitch" -NetAdapterName "Ethernet" -MinimumBandwidthMode Weight
# Enable on an existing switch (requires switch to have no VMs attached or a brief downtime)
Set-VMSwitch -Name "ExternalSwitch" -MinimumBandwidthMode Absolute
The MinimumBandwidthMode can be set to None (no bandwidth management), Absolute (guaranteed bandwidth in bps), or Weight (proportional share from 1–100).
Configuring Network Bandwidth Limits on a VM
With bandwidth management enabled on the switch, set per-adapter limits using Set-VMNetworkAdapter. The following example sets a minimum guaranteed bandwidth of 100 Mbps and a maximum of 1 Gbps for the first network adapter of a VM named “AppServer01”.
# Set minimum 100 Mbps, maximum 1 Gbps (in bps)
Set-VMNetworkAdapter -VMName "AppServer01" -Name "Network Adapter" `
-MinimumBandwidthAbsolute 100000000 `
-MaximumBandwidth 1000000000
To use weight-based minimum bandwidth (switch must be in Weight mode), assign a weight between 1 and 100. A weight of 50 means the VM gets approximately 50% of available bandwidth when contention occurs.
Set-VMNetworkAdapter -VMName "AppServer01" -Name "Network Adapter" `
-MinimumBandwidthWeight 50 `
-MaximumBandwidth 500000000
To verify the settings applied to a VM’s adapters, query the network adapter properties.
Get-VMNetworkAdapter -VMName "AppServer01" | Select-Object VMName, Name, MinimumBandwidthAbsolute, MinimumBandwidthWeight, MaximumBandwidth
Configuring QoS on All Adapters Across Multiple VMs
In environments with many VMs, use a loop to apply consistent QoS policies. The following script sets a 1 Gbps maximum bandwidth cap on all VMs tagged for a specific customer group using a naming convention.
$CustomerVMs = Get-VM | Where-Object { $_.Name -like "CustomerA_*" }
foreach ($VM in $CustomerVMs) {
$Adapters = Get-VMNetworkAdapter -VMName $VM.Name
foreach ($Adapter in $Adapters) {
Set-VMNetworkAdapter -VMName $VM.Name -Name $Adapter.Name `
-MinimumBandwidthWeight 20 `
-MaximumBandwidth 1000000000
Write-Host "QoS set on $($VM.Name) adapter $($Adapter.Name)"
}
}
Storage QoS Configuration
Storage QoS in Hyper-V 2019 controls disk I/O for virtual hard disks. It allows you to set minimum and maximum normalised IOPS (input/output operations per second) per VHD or VHDX file. Storage QoS requires Windows Server 2016 or later for the policy server features, but basic per-VHD limits can be set directly on the Hyper-V host.
To set a maximum IOPS limit and a minimum IOPS guarantee on a virtual hard disk, use Set-VMHardDiskDrive. The MinimumIOPS value guarantees the disk will receive at least this many IOPS when the storage is under load. MaximumIOPS caps the disk at that threshold.
# Set storage QoS on the first hard disk of a VM
Set-VMHardDiskDrive -VMName "DatabaseServer01" -ControllerType SCSI -ControllerNumber 0 -ControllerLocation 0 `
-MinimumIOPS 500 `
-MaximumIOPS 2000
To view current storage QoS settings for all hard disks on a VM, query the VMHardDiskDrive object.
Get-VMHardDiskDrive -VMName "DatabaseServer01" | Select-Object VMName, Path, MinimumIOPS, MaximumIOPS
To remove QoS limits and allow unlimited I/O, set both values to zero.
Set-VMHardDiskDrive -VMName "DatabaseServer01" -ControllerType SCSI -ControllerNumber 0 -ControllerLocation 0 `
-MinimumIOPS 0 `
-MaximumIOPS 0
Storage QoS with Scale-Out File Server Policies
Windows Server 2019 supports centralised Storage QoS policies when VMs store their VHD files on a Scale-Out File Server (SOFS). This allows policy-based I/O management across an entire cluster from a single policy server. Policies are created on the SOFS and referenced by policy ID in the VM configuration.
# On the SOFS policy server - create a new storage QoS policy
New-StorageQosPolicy -Name "StandardTier" -PolicyType Dedicated -MinimumIops 200 -MaximumIops 1000
# Get the policy ID
$Policy = Get-StorageQosPolicy -Name "StandardTier"
$Policy.PolicyId
# Apply the policy to a VM hard disk (run on Hyper-V host)
Set-VMHardDiskDrive -VMName "WebServer01" -ControllerType SCSI -ControllerNumber 0 -ControllerLocation 0 `
-QoSPolicyID $Policy.PolicyId
Monitoring QoS Effectiveness
After applying QoS policies, monitor whether the limits are taking effect. For network QoS, use Performance Monitor counters or Get-VMNetworkAdapterBandwidthSetting to review settings. For storage QoS, retrieve runtime metrics using Get-StorageQosFlow.
# View all active storage QoS flows on the system
Get-StorageQosFlow | Select-Object InitiatorName, FilePath, MinimumIops, MaximumIops, Status, IOPS, Latency
The Status field will show OK if the VM is receiving its minimum IOPS guarantee. InsufficientThroughput indicates the underlying storage cannot provide the guaranteed minimum, which signals a storage subsystem bottleneck rather than a QoS configuration problem.
Best Practices for Hyper-V QoS
Set maximum bandwidth limits on VMs running non-critical workloads such as development, test, or backup VMs to prevent them from starving production workloads during peak periods. Use minimum bandwidth guarantees only for latency-sensitive workloads like databases and real-time applications. Avoid setting minimums that collectively exceed the physical link capacity — the sum of all minimum bandwidth guarantees should not exceed 80% of the physical adapter speed to leave headroom for management traffic. For storage QoS, profile actual IOPS usage over at least one week before setting limits to avoid under-provisioning.
Disabling QoS Settings
To remove all network QoS limits from a virtual network adapter, set both MinimumBandwidthAbsolute and MaximumBandwidth to zero.
Set-VMNetworkAdapter -VMName "AppServer01" -Name "Network Adapter" `
-MinimumBandwidthAbsolute 0 `
-MaximumBandwidth 0
Conclusion
Hyper-V QoS on Windows Server 2019 provides granular control over both network and storage resource allocation for virtual machines. By combining minimum bandwidth guarantees with maximum caps, administrators can ensure predictable performance for critical workloads while preventing resource monopolisation. PowerShell cmdlets make it straightforward to apply, review, and remove QoS policies across large VM fleets, and Storage QoS policies on Scale-Out File Server deployments extend this control to shared storage environments.