7.4 VM Resource Controls, CPU Groups & Host Compute Partitioning

Key Takeaways

  • Per-VM processor controls are reserve (a guaranteed floor that blocks VM startup if unavailable), limit (a hard ceiling), and relative weight (1–10000 priority that only takes effect when the host is contended).
  • Reserve and Maximum on Set-VMProcessor are percentages of the VM's own allocated virtual processors, not of total host capacity.
  • CPU groups are managed only through the Host Compute Service using the downloadable CpuGroups.exe utility; Hyper-V Manager, WMI, and PowerShell provide no CPU group interface.
  • The CPU group cap is computed as G = n x C, where n is the number of logical processors in the group and C is the class-of-service percentage, and the resulting budget is shared by every VM bound to the group.
  • Per-VM reserve, limit, and weight are unsupported under the hypervisor root scheduler because scheduling is delegated to the root partition's NT scheduler.
Last updated: August 2026

Virtual Machine Resource Controls, CPU Groups & Host Compute Partitioning

Hypervisor scheduler type decides how virtual processors are placed on logical processors. Resource controls decide how much CPU each virtual machine — or each class of virtual machine — is allowed to consume once it is placed. On a consolidated Hyper-V host running workloads of different business value, the scheduler alone will happily let a runaway batch job starve a production database. Resource controls are how you stop that.

The exam treats this as three related layers: per-VM resource controls, CPU groups, and minroot host partitioning.


1. Per-VM Processor Resource Controls

Every virtual machine has had three processor controls since Hyper-V shipped. They are set per VM on the Processor node in Hyper-V Manager, or with Set-VMProcessor.

ControlHyper-V Manager labelWhat it does
ReserveVirtual machine reserve (percentage)Guarantees a minimum share of host CPU. The VM will not start if the host cannot honour the reservation
LimitVirtual machine limit (percentage)Hard ceiling. The VM can never exceed this share of host CPU even when the host is idle
WeightRelative weightRelative priority, 1–10000, used only when the host is contended. A weight of 200 gets twice the CPU of a weight of 100
# Guarantee 20% of host CPU, cap at 75%, and give this VM double default priority
Set-VMProcessor -VMName 'SQL-PROD-01' `
    -Reserve 20 `
    -Maximum 75 `
    -RelativeWeight 200

# Inspect the current controls across every VM on the host
Get-VMProcessor -VMName * |
    Select-Object VMName, Count, Reserve, Maximum, RelativeWeight, HwThreadCountPerCore

[!IMPORTANT] Reserve and Maximum are expressed as a percentage of the virtual machine's own allocated virtual processors, not of the whole host. A VM with 4 vCPUs on a 16-LP host set to -Maximum 50 is capped at 50% of 4 LPs' worth of compute, which is 2 LPs, not 8.

Two behavioural traps show up in scenario questions:

  • Reserve blocks VM startup. If the sum of reservations across running VMs would exceed host capacity, the next VM simply fails to start. Over-reserving is the most common cause of a VM that will not power on despite the host showing free memory.
  • Weight does nothing on an idle host. Relative weight is only consulted when virtual processors are competing. A ticket that says "the VM is slow but the host is at 20% CPU" is not a weight problem.

[!NOTE] Per-VM processor resource controls (reserve, limit, weight) are not supported when the hypervisor root scheduler is enabled, because scheduling has been handed to the root partition's NT scheduler. They apply only under the classic and core scheduler types — another reason the root scheduler is not recommended on Windows Server.


2. CPU Groups: Classes of Service Across Multiple VMs

Per-VM controls cannot express "these twelve tenant VMs together may use no more than half of this host." That is what CPU groups are for. Introduced in Windows Server 2016, a CPU group lets an administrator:

  • Bundle virtual machines into a named group with a shared allocation of host CPU, creating tiers or classes of service.
  • Apply a group cap that bounds what the entire group may consume, no matter how many VMs are in it.
  • Affinitize the group to a specific subset of the host's logical processors, isolating one group's VMs from another's.

[!IMPORTANT] CPU groups are managed only through the Hyper-V Host Compute Service (HCS). Hyper-V Manager, WMI, and PowerShell do not expose CPU groups. Microsoft ships a command-line utility, CpuGroups.exe, on the Microsoft Download Center that drives the HCS interface. If an exam option offers a New-VMCpuGroup cmdlet or a Hyper-V Manager checkbox, it is a distractor.

The Group Cap Formula

The hypervisor enforces a computed group cap:

G = n x C

  G = the amount of host logical-processor time allocated to the group
  n = the number of logical processors in the group
  C = the class of service, as a percentage of total compute capacity

Worked example — a group affinitized to 4 LPs with a 50% cap:

G = 4 x 50% = 2 LPs' worth of CPU time, shared by the whole group

The cap applies regardless of how many VMs are bound to the group and regardless of whether they are running. That produces the single most important operational consequence:

VMs bound to the groupEach VM's effective share of a 50% group cap on 8 LPs
150% of the host (4 LPs' worth)
225% each (2 LPs' worth each)
412.5% each (1 LP's worth each)

Because the group budget is divided among whoever is bound to it, the administrator or the management layer must re-tune the group cap as VMs are added or removed to keep a target per-VM allocation. Hyper-V will not do it for you.

Working With CpuGroups.exe

Parameters use spaces as delimiters, with no leading / or - before the command verb itself.

:: Show the host's LP, NUMA node, package, core and root VP mapping
CpuGroups.exe GetCpuTopology

:: Create a group affinitized to logical processors 0, 1, 16 and 17
CpuGroups.exe CreateGroup /GroupId:36AB08CB-3A76-4B38-992E-000000000001 /GroupAffinity:0,1,16,17

:: Set that group's cap to 50%  (valid CpuCap range is 0-65536; 32768 = 50%)
CpuGroups.exe SetGroupProperty /GroupId:36AB08CB-3A76-4B38-992E-000000000001 /CpuCap:32768

:: Bind a VM to the group, then list group membership
CpuGroups.exe SetVmGroup /VmName:TenantVM01 /GroupId:36AB08CB-3A76-4B38-992E-000000000001
CpuGroups.exe GetGroupVms

:: Unbind a VM by assigning the NULL GUID, then delete the now-empty group
CpuGroups.exe SetVmGroup /VmName:TenantVM01 /GroupId:00000000-0000-0000-0000-000000000000
CpuGroups.exe DeleteGroup /GroupId:36AB08CB-3A76-4B38-992E-000000000001

Two hard rules to memorise:

  • CpuCap is expressed on a 0–65536 scale, not 0–100. 65536 is 100%, 32768 is 50%, 6553 is roughly 10%.
  • Only an empty CPU group can be deleted. Deleting a group that still has bound VMs fails with error 0xc0350070; every VM must be reassigned to the NULL GUID first.

A VM also cannot be moved directly between groups. It must be unbound to the NULL GUID first, then bound to the destination group.


3. Combining Group Caps With VM Caps

Group caps and per-VM caps are complementary, and a well-designed tiering scheme uses both:

  • The group cap stops a whole tier from exceeding its purchased share of the host.
  • The per-VM cap stops one member of that tier from opportunistically consuming the whole tier budget while its siblings are idle.

Without a per-VM cap, a single active VM in a lightly loaded "economy" tier will burst to the entire group allocation — which is exactly the behaviour a hosting provider selling fixed-size instances needs to prevent.


4. Minroot: Separating Root VPs From Guest VPs

By default Hyper-V creates one root virtual processor on every physical logical processor, mapped 1:1 and never migrated, and guest VPs share those same LPs. For a latency-sensitive premium workload that is unacceptable — root-partition I/O handling introduces scheduling jitter.

The minroot configuration restricts the host (root) partition to a subset of the host's logical processors. Combining minroot with an affinitized CPU group on the remaining LPs gives complete CPU separation: the root partition runs on its own processors and the premium guest runs on processors the root never touches.

:: Restrict the root partition to 8 logical processors (reboot required)
bcdedit /set hypervisorrootproc 8

In CpuGroups.exe GetCpuTopology output, LPs carrying a root VP show a RootVpIndex of 0 or greater; LPs excluded from the root partition by minroot show RootVpIndex = -1 while remaining fully available to guest VPs.


5. Choosing the Right Control

RequirementCorrect mechanism
Guarantee a database VM never drops below a floor of CPUPer-VM reserve
Stop one VM exceeding a fixed ceilingPer-VM limit (-Maximum)
Prioritise VM A over VM B only when the host is busyPer-VM relative weight
Cap what an entire tenant tier may consume collectivelyCPU group cap via CpuGroups.exe
Guarantee tenant A's VMs never share a physical core with tenant B'sCPU group affinity (plus the core scheduler)
Eliminate root-partition jitter for a premium VMMinroot plus an affinitized CPU group
Test Your Knowledge

A hosting provider must guarantee that twelve 'Economy tier' virtual machines together never consume more than 25% of a Hyper-V host's total compute capacity. Which mechanism enforces this collective limit?

A
B
C
D
Test Your Knowledge

An administrator needs to set a CPU group's cap to 50% using CpuGroups.exe. Which CpuCap value is correct?

A
B
C
D
Test Your Knowledge

A CPU group is affinitized to 8 logical processors with a cap of 50%. Four virtual machines are bound to the group and all four are running. What compute allocation does each VM receive?

A
B
C
D
Test Your Knowledge

An administrator attempts to delete a CPU group with CpuGroups.exe DeleteGroup and receives error 0xc0350070. What is the cause?

A
B
C
D