Reduce Azure Managed Disk costs by 30-50% through orphaned disk cleanup, Premium SSD v2 migration, and automated tier management for deallocated VMs.
Azure Managed Disks often account for 15-30% of total compute spend, yet most organizations overprovision storage tiers, leave orphaned disks running, and miss opportunities to decouple performance from capacity. Spotto continuously analyzes managed disk utilization, attachment status, and tier selection across Azure subscriptions, surfacing actionable recommendations to eliminate waste while preserving workload requirements.
The most common savings come from three areas: upgrading to Premium SSD v2 to stop paying for oversized disks, downgrading idle disks attached to deallocated VMs, and deleting orphaned disks that serve no workload. Together, these optimizations typically reduce managed disk costs by 30-50% without degrading performance or availability.
Managed disk cost waste compounds silently because disks bill continuously regardless of VM power state:
| Tier | Max IOPS | Max Throughput | Sizing | Redundancy | OS Disk | Host Cache |
|---|---|---|---|---|---|---|
| Standard HDD | 2,000 | 500 MB/s | Fixed tiers | LRS/ZRS | Yes | Yes |
| Standard SSD | 6,000 | 750 MB/s | Fixed tiers | LRS/ZRS | Yes | Yes |
| Premium SSD (v1) | 20,000 | 900 MB/s | Fixed tiers | LRS/ZRS | Yes | Yes |
| Premium SSD v2 | 80,000 | 1,200 MB/s | Per-GiB | LRS only | No | No |
| Ultra Disk | 400,000 | 10,000 MB/s | Per-GiB | LRS only | No | No |
Key distinctions:
Are you paying for disks that are not attached to any virtual machine? Orphaned managed disks are unattached to any VM and generate storage charges without serving a workload.
Detection logic:
diskState: Unattached with no VM association then flag as orphanedDetection via Azure Resource Graph:
resources
| where type == "microsoft.compute/disks"
| where properties.diskState == "Unattached"
| extend sku = tostring(sku.name), sizeGB = properties.diskSizeGB
| project name, resourceGroup, subscriptionId, sku, sizeGB, location
| order by sku desc, tolong(sizeGB) descDeletion after validation:
# Confirm disk is unattached
az disk show --name diskName --resource-group rg --query diskState
# Create retention snapshot if needed
az snapshot create --source diskId --name snapshotName --resource-group rg
# Delete the orphaned disk
az disk delete --name diskName --resource-group rg --yesKey constraint: Confirm no backup, disaster recovery, managed image, or Azure Compute Gallery pipelines depend on the disk before deletion. Deletion is irreversible.
Premium SSD v1 forces you to buy more capacity than needed to hit IOPS targets. Premium SSD v2 lets you provision capacity, IOPS, and throughput independently, typically saving 20-40%.
Detection logic:
v2 eligibility checklist:
Migration to Premium SSD v2:
# Review disk utilization over 30 days
az monitor metrics list --resource diskId \
--metric "Composite Disk Read Operations/sec" \
--aggregation Average --interval PT1H
# Create snapshot of current disk
az snapshot create --resource-group rg --source diskId --name snapshotName
# Deallocate VM
az vm deallocate --resource-group rg --name vmName
# Create Premium SSD v2 disk with right-sized performance
az disk create --resource-group rg --name newDiskName \
--sku PremiumV2_LRS --source snapshotId \
--disk-iops-read-write targetIOPS \
--disk-mbps-read-write targetMBps --zone zone
# Swap disk and restart
az vm update --resource-group rg --name vmName --os-disk newDiskName
az vm start --resource-group rg --name vmNameDetection logic:
Downgrade code:
# Confirm VM is deallocated
az vm show --name vmName --resource-group rg --query powerState
# Downgrade disk to Standard SSD
az disk update --name diskName --resource-group rg --sku StandardSSD_LRS
# Tag VM to prevent accidental start
az vm update --name vmName --resource-group rg --set tags.DiskDowngraded=true
# Before restart: restore Premium tier
az disk update --name diskName --resource-group rg --sku Premium_LRSKey constraint: Shared disks and Premium SSD v2/Ultra cannot be directly re-tiered. VM must stay deallocated during the change.
Automated disk tier management (PowerShell runbook):
# Runbook: Manage-IdleDiskTiers
# Schedule: Daily
Connect-AzAccount -Identity
$vms = Get-AzVM -Status | Where-Object { $_.PowerState -eq "VM deallocated" }
foreach ($vm in $vms) {
$disks = Get-AzDisk -ResourceGroupName $vm.ResourceGroupName |
Where-Object {
$_.ManagedBy -eq $vm.Id -and
$_.Sku.Name -like "Premium*"
}
foreach ($disk in $disks) {
if ($disk.MaxShares -gt 1 -or
$disk.Sku.Name -in @("PremiumV2_LRS", "UltraSSD_LRS")) {
continue
}
$tags = @{ OriginalSku = $disk.Sku.Name }
Update-AzTag -ResourceId $disk.Id -Tag $tags -Operation Merge
$disk.Sku = [Microsoft.Azure.Management.Compute.Models.DiskSku]::new("StandardSSD_LRS")
Update-AzDisk -ResourceGroupName $disk.ResourceGroupName \
-DiskName $disk.Name -Disk $disk
}
}Migration steps:
Key constraints: Requires planned downtime. VMs in availability sets must be fully redeployed. Cross-zone data transfer costs may apply. Estimated effort: 12 hours per VM.
Key constraints: Data residency rules may prevent migration. Requires rebuilding networking, encryption, and identity. Estimated effort: 60 hours for cross-region migration.
DiskDowngraded=true and monitor for 48 hours.| Recommendation | Typical Savings | Effort | Risk |
|---|---|---|---|
| Delete orphaned disks | 100% | Low | Medium |
| Downgrade idle Premium | 40-60% | Low | Low |
| Re-tier deallocated VM disks | 40-70% | Low | Low |
| Upgrade Premium v1 to v2 | 20-40% | Medium | Medium |
| Migrate to AZ | Enables v2 access | Medium | Medium |
| Migrate to AZ-supported region | ~18% redundancy | High | High |
Use the Azure Resource Graph query provided above. It queries all subscriptions in a single call and returns every disk with diskState: Unattached. For MSPs managing multiple tenants via Azure Lighthouse, the same query works across delegated subscriptions without switching context.
Not always. Before deletion, confirm the disk is not referenced by Azure Backup (Recovery Services vault), Azure Site Recovery, a managed image, or an Azure Compute Gallery image version. If any of these dependencies exist, deleting the disk can break backup restore points or image pipelines. When in doubt, snapshot the disk to Standard storage first and retain the snapshot for your compliance retention period.
Premium SSD v1 uses fixed tiers where IOPS and throughput are tied to disk size. You must provision a larger disk to get more performance, even if you do not need the capacity. Premium SSD v2 lets you set capacity, IOPS, and throughput independently, so you pay only for what you use. However, v2 is LRS-only, cannot be used as an OS disk, does not support host caching, and requires availability zone placement.
No. Changing a managed disk's SKU (for example, from Premium_LRS to StandardSSD_LRS) requires the VM to be deallocated. This is by design -- Azure needs to move the disk to different storage infrastructure. Plan tier changes during maintenance windows or automate them using the PowerShell runbook provided above for deallocated VMs.
No. Azure disk reservations are currently available only for Premium SSD v1 disks, specifically P30 through P80 sizes. Premium SSD v2 and Ultra Disk do not support reservations. If you are migrating from v1 to v2, factor in the loss of reservation discounts when calculating the net savings.
Changing the SKU (e.g., Premium_LRS to StandardSSD_LRS) does not erase data. Azure moves the data to the appropriate storage tier in the background. However, the VM must be deallocated during the change, and the operation may take several minutes depending on disk size. Always take a snapshot before any tier change as a precaution.
Premium SSD v2 does not support host caching, which is commonly used for OS disks to improve boot and read performance. Additionally, v2 disks cannot be used with certain VM features that depend on host-level caching. OS disks should remain on Premium SSD v1 or Standard SSD, while data disks are the primary candidates for v2 migration.
Deploy the PowerShell runbook provided in this guide as an Azure Automation runbook with a daily schedule. The runbook identifies deallocated VMs with Premium disks, tags the original SKU for restoration, and downgrades the disk to Standard SSD. Before restarting the VM, the reverse operation restores the Premium tier. This approach is fully reversible and typically saves 40-70% on idle disk storage.
Zonal migration requires planned downtime because you must create a new VM in the target zone. The process involves snapshotting all disks, creating new zonal disks from those snapshots, deploying a new VM with the zonal disks, and updating networking. VMs in availability sets must be fully redeployed. Cross-zone data transfer costs may apply. Estimated effort is approximately 12 hours per VM, but the payoff is access to Premium SSD v2 and Ultra Disk pricing.
Spotto continuously monitors disk attachment status, utilization metrics, tier selection, and zonal placement across all your Azure subscriptions. It automatically flags orphaned disks, identifies Premium SSD v1 disks that would cost less as v2, and detects deallocated VMs with idle premium storage. Rather than running one-off audits, Spotto provides ongoing visibility and alerts when disk waste accumulates -- especially valuable for MSPs managing many tenants.
Before
$27,000/mo
200 deallocated VMs with Premium SSD disks billing at full rate
After
$8,100/mo
Automated tier downgrade to Standard SSD during deallocation
Actions taken: Deployed the automated tier management runbook across all tenants. Premium disks on deallocated VMs downgraded to Standard SSD daily. Original SKU tagged for automatic restoration before VM restart.
Before
$9,400/mo
87 orphaned disks (42 Premium, 45 Standard) across 15 subscriptions
After
$0/mo
All orphaned disks validated and deleted after snapshot retention
Actions taken: Resource Graph query identified 87 unattached disks. Verified none were referenced by backup vaults, ASR, or managed images. Compliance-required disks snapshotted to Standard storage before deletion. All orphaned disks removed.
Before
$5,400/mo
8x P30 (1 TiB) disks provisioned for IOPS, only 200 GB used each
After
$2,160/mo
8x Premium SSD v2 disks, 256 GB each, right-sized IOPS
Actions taken: Reviewed 30-day disk telemetry showing peak IOPS at 4,800 across all disks. Migrated data disks from P30 v1 to Premium SSD v2 with 256 GB capacity and 5,000 IOPS provisioned per disk. OS disks remained on Premium SSD v1.
Before
$3,200/mo
4 non-zonal VMs locked into Premium SSD v1 (P40 each)
After
$1,600/mo
Migrated to zone 2, data disks converted to Premium SSD v2
Actions taken: Verified region supported availability zones and VM sizes were zone-compatible. Snapshotted all disks, deployed new VMs in zone 2, created zonal Premium SSD v2 data disks from snapshots. Updated load balancer and DNS. Monitored 72 hours before decommissioning original VMs.
The challenges outlined in this article — orphaned disk accumulation, Premium tier overprovisioning, idle storage on deallocated VMs — are the same ones our customers work through across their Azure environments. The difference is they use Spotto to surface these opportunities automatically, rather than running the analysis by hand.
Spotto continuously analyzes disk utilization, attachment status, and tier selection across your Azure subscriptions -- surfacing orphaned disks, idle Premium storage, and v2 migration opportunities so you can eliminate waste without degrading performance.
Free TrialDisclaimer: This article is provided for informational purposes only and does not constitute professional advice. Azure pricing, features, and service behavior may have changed since publication. Always validate recommendations against your specific environment and consult Microsoft's official documentation before making changes to production infrastructure. Spotto is not liable for any actions taken based on the content of this article.