Skip to content

Host Pool Options (Pooled and Personal)

This reference defines host pool behavior, parameter mapping, and recommended autoscale patterns.

1) Host pool types

Pooled

  • Purpose: shared compute for task workers, call centers, and shift-based operations.
  • Load balancing options:
    • BreadthFirst: spreads users across hosts.
    • DepthFirst: fills hosts before moving to next host.
  • Recommended baseline:
    • BreadthFirst for user-experience consistency.
    • DepthFirst for cost-optimized autoscale scenarios.

Personal

  • Purpose: dedicated VM per user for developers, engineers, privileged workflows.
  • Assignment:
    • Automatic: first available VM assigned at first sign-in.
    • Direct: preassigned VM-to-user mapping by operations.
  • Recommended baseline: Direct where strict ownership/compliance is needed.

2) Core parameter reference

ParameterScopeApplies ToNotes
hostPoolTypeHost poolPooled/PersonalPooled or Personal
loadBalancingTypeHost poolPooledBreadthFirst or DepthFirst
maxSessionLimitHost poolPooledSet from load-test data
personalDesktopAssignmentTypeHost poolPersonalAutomatic or Direct
startVMOnConnectHost poolBothRequires RBAC + service principal
registrationTokenExpirationHost registrationBothShort-lived token recommended

3) Configuration mapping

Canonical key (config/variables.yml)BicepTerraformPowerShell
host_pool.typehostPoolTypehost_pool_type-HostPoolType
host_pool.load_balancingloadBalancingTypeload_balancing_type-LoadBalancingType
host_pool.max_sessionsmaxSessionLimitmax_session_limit-MaxSessionLimit
host_pool.personal_assignmentpersonalDesktopAssignmentTypepersonal_desktop_assignment_type-PersonalAssignmentType
host_pool.start_vm_on_connectstartVMOnConnectstart_vm_on_connect-StartVMOnConnect

4) Implementation examples

Bicep (pooled):

bicep
param hostPoolType string = 'Pooled'
param loadBalancingType string = 'BreadthFirst'
param maxSessionLimit int = 12

resource hostPool 'Microsoft.DesktopVirtualization/hostPools@2024-04-03' = {
	name: 'hp-pooled-prod'
	location: resourceGroup().location
	properties: {
		hostPoolType: hostPoolType
		loadBalancerType: loadBalancingType
		maxSessionLimit: maxSessionLimit
		startVMOnConnect: true
		preferredAppGroupType: 'Desktop'
	}
}

Terraform (personal):

hcl
resource "azurerm_virtual_desktop_host_pool" "personal" {
	name                            = "hp-personal-prod"
	location                        = azurerm_resource_group.avd.location
	resource_group_name             = azurerm_resource_group.avd.name
	type                            = "Personal"
	personal_desktop_assignment_type = "Direct"
	start_vm_on_connect             = true
}

PowerShell:

powershell
New-AzWvdHostPool -ResourceGroupName $rg -Name 'hp-pooled-prod' -Location $location `
	-HostPoolType 'Pooled' -LoadBalancerType 'BreadthFirst' -MaxSessionLimit 12 -StartVMOnConnect:$true

5) Autoscale patterns

Schedule-first

  • Start baseline capacity before business hours.
  • Drain and stop non-required hosts after hours.

Load-first

  • Increase hosts on session/cpu thresholds.
  • Decrease hosts on sustained low utilization.

Hybrid

  • Schedule baseline + dynamic headroom during peaks.

Recommended controls:

  • Reserve at least one spare host per pool.
  • Use drain mode before host maintenance.
  • Keep scale actions idempotent and logged.

6) Start VM on Connect requirements

  • App registration/service principal authorized on subscription/RG scope.
  • Required roles: VM start permission, AVD host pool access.
  • Validate startup latency with login SLA tests.

7) Operational checks

  • Track session distribution by host and pool.
  • Alert on host pools with registration or heartbeat drops.
  • Review maxSessionLimit quarterly against real concurrency.

References

Released under the MIT License.