Skip to main content
emnode
Cost

Right-size over-provisioned managed disks

One capability across every VM in the estate: make sure each managed disk's SKU, capacity and performance tier matches the IOPS and storage the workload actually uses, so you stop paying premium rates for headroom nobody touches.

14 min·10 sections·AZURE

Last reviewed

Right-sizing managed disks: the basics

What does an over-provisioned managed disk actually look like?

A managed disk is billed on what you provision, not what you use, and that one rule is where the waste lives. Azure prices Premium SSD by fixed capacity tiers (4, 8, 16, 32, 64, 128, 256, 512, 1024 GiB and up) and rounds any disk up to the next tier, so a disk provisioned at 200 GiB is billed as 256 GiB. A 1 TiB Premium SSD bills at the P30 rate whether the workload drives 100 IOPS or 5,000. Over-provisioning shows up in a few distinct shapes: a Premium disk on a workload that never needs Premium IOPS, a capacity tier far larger than the data on it, or a performance tier that was bumped up for a one-off migration and never bumped back down.

Azure Advisor and the Cost Optimization workbook turn each of these into its own signal. Advisor flags unattached and idle disks directly, and the Cost Optimization workbook surfaces disks whose provisioned SKU, size or performance tier looks out of step with measured usage. They read as separate line items, but they are one job: bring each disk's SKU, capacity and tier back in line with the IOPS and storage the workload genuinely consumes.

Almost all of this is drift, not intent. A disk created as Premium because the VM template defaulted that way, a volume grown to 1 TiB for a migration that finished months ago, a performance tier raised to P50 to rush a data load and never returned to P10. The work is to find every disk whose provisioned configuration outruns its real usage, decide which genuinely need the headroom, and right-size the rest down to the tier that fits.

In this lesson you will learn how Azure prices managed disks, why provisioned configuration drifts away from real usage, and how to right-size SKU, capacity and performance tier across an estate without risking the workloads that genuinely need headroom. You will see the exact az CLI to find over-provisioned disks and the commands and Bicep to bring them back in line.

Fun fact

The terabyte that nobody filled

Because Azure rounds provisioned disks up to the next billing tier, a disk asked for at 130 GiB is billed as 256 GiB, and a disk at 1,025 GiB is billed as 2 TiB. The capacity you never use is invisible: the workload runs fine, the bill is paid, and the gap between provisioned and consumed quietly compounds. Performance tiers do the same. A disk bumped from P10 to P50 to rush a one-off data migration keeps billing at the P50 rate, several times higher, until someone deliberately sets it back, because Azure has no reason to assume the burst was temporary. The single most common managed-disk waste is not a wrong choice; it is a temporary choice that was never undone.

Finding over-provisioned disks across a subscription

Priya is the platform lead at a growing SaaS company whose Azure bill has crept up as the fleet scaled. The Cost Optimization workbook and Advisor both flag managed-disk spend, with Premium disks and oversized capacity tiers spread across two subscriptions that pre-date the team's current sizing standards.

Rather than guess, Priya starts by listing every disk with its SKU, provisioned size and performance tier, so the genuinely demanding workloads can be separated from disks that are simply over-provisioned by default before anything changes.

Start by listing every managed disk with its SKU, size and performance tier. Premium disks at large tiers are the widest-open savings.

$ az disk list --query "[].{name:name, sku:sku.name, sizeGiB:diskSizeGb, tier:tier, attached:managedBy!=null}" -o table
Name Sku SizeGiB Tier Attached
---------------- ----------- --------- ------ --------
reports-data Premium_LRS 1024 P50 True
batch-scratch Premium_LRS 256 P15 True
old-migrate-vol Premium_LRS 512 P20 False
# reports-data is a 1 TiB Premium disk pinned to the P50 tier. Check its real IOPS first.

A large Premium disk on a bumped-up performance tier is the highest-value target. An unattached disk like old-migrate-vol bills its full size for nothing. Check each one's real usage before acting.

How Azure decides what a managed disk costsdeep dive

Three properties on the disk drive almost all of the cost. The first is the SKU ('sku.name'): Premium_LRS, StandardSSD_LRS, Standard_LRS and the newer PremiumV2_LRS, where Premium SSD costs several times what Standard SSD does for the same capacity. The second is the provisioned size ('diskSizeGb'): Azure rounds it up to the next fixed capacity tier and bills the tier, so unused capacity below the next tier boundary is free but capacity above it is billed in full. The third, for Premium SSD only, is the performance tier ('tier'): you can pin a disk to a higher tier such as P50 for more IOPS and throughput without resizing it, and you are billed at that tier's rate until you set it back.

Each property moves independently, and each can drift. A workload that no longer needs Premium IOPS keeps the Premium SKU because nobody converted it. A volume grown for a migration keeps the larger capacity tier because nobody shrank the filesystem and the disk. A performance tier raised for a burst keeps billing high because Azure has no signal that the burst was temporary. The Cost Optimization workbook compares provisioned configuration against measured IOPS, throughput and used capacity to surface exactly these gaps.

The cost-saving levers differ in what they require. Changing the performance tier or shrinking within the same SKU is an online operation with no downtime, and a tier downgrade takes effect immediately. Converting the SKU, for example Premium to Standard SSD, requires deallocating the VM first, because the disk type cannot change while it is attached to a running machine. Knowing which lever needs a maintenance window and which does not is what lets you bank the risk-free savings today and schedule the rest.

What is the impact of leaving disks over-provisioned?

The direct impact is recurring spend on capacity and performance nobody uses. Every over-provisioned disk bills its higher rate every hour it exists, and because storage is provisioned once and rarely revisited, that waste compounds silently for the life of the disk. A fleet that scaled up and then optimised its compute can still be carrying the disk footprint of its peak, paying Premium rates and large capacity tiers for workloads that shrank or moved.

The second-order impact is that the waste is invisible until you look. An over-provisioned disk does not fail, slow down or raise an alert; the workload runs perfectly on storage it half uses. That is exactly why disk right-sizing is so often left undone: nothing breaks, so nothing prompts the review, and the gap between provisioned and consumed quietly widens as the estate grows.

On the savings side, managed disks are one of the more reliable places to recover cloud spend without touching the workload. Microsoft's own disk cost-optimisation guidance treats right-sizing SKU, capacity and tier as a primary lever, and the newer Premium SSD v2 model, which prices capacity, IOPS and throughput independently with a base of 3,000 IOPS and 125 MB/s included, lets you stop paying for performance headroom you never drive. The recovered spend is recurring, it lands the hour the change is made, and most of it carries no performance cost at all.

How do you right-size disks safely?

Work the capability as one loop rather than chasing individual findings. The order matters: confirm real usage before you downgrade anything, so you bank the risk-free savings first and only model the trade-offs that actually exist.

1. Inventory every disk by SKU, size and tier

List every managed disk with its SKU, provisioned size, performance tier and whether it is attached. Treat this inventory, joined to measured IOPS, throughput and used capacity from monitoring, as the source of truth. One disk can be over-provisioned on more than one axis at once: a Premium SKU and an inflated capacity tier and a bumped performance tier.

2. Separate risk-free downgrades from trade-off calls

Most over-provisioning is unintended. A disk that never approaches its tier's IOPS can drop tiers with no trade-off; a disk that never needs Premium can convert to Standard SSD; a volume with free space to spare can shrink. The few that occasionally burst above a lower tier are the trade-off calls: model the saving against how often the burst actually matters before deciding.

3. Bank the no-downtime savings first

Performance-tier downgrades and capacity changes that do not cross a VM-deallocation boundary are online operations: run them and the rate drops immediately with no maintenance window. Do these first to bank the saving fast. Snapshot then delete genuinely unattached disks. Note that a Premium SSD performance tier can be downgraded only once every 12 hours, so plan the step down.

4. Schedule the SKU conversions and keep it reviewed

Converting SKU, for example Premium to Standard SSD, needs the VM deallocated, so batch these into a maintenance window. Then keep it from drifting back: put a quarterly right-sizing pass on the cadence, and consider Premium SSD v2 for new workloads so capacity, IOPS and throughput are provisioned, and paid for, independently against real demand.

# Bank the no-downtime saving first: drop an over-provisioned Premium
# performance tier back to its baseline. Online, takes effect immediately.
# A 1 TiB disk's baseline tier is P30, so P30 is as low as reports-data
# can go (you can't set a tier below the disk's baseline).
# (Tier downgrades are allowed only once every 12 hours.)
az disk update \
  --resource-group rg-prod \
  --name reports-data \
  --set tier=P30

# Convert a Premium disk that never needs Premium IOPS to Standard SSD.
# The SKU change requires the VM deallocated first, so schedule a window.
az vm deallocate --resource-group rg-prod --name vm-batch
az disk update \
  --resource-group rg-prod \
  --name batch-scratch \
  --sku StandardSSD_LRS
az vm start --resource-group rg-prod --name vm-batch

# Snapshot then delete a genuinely unattached disk billing for nothing.
az snapshot create \
  --resource-group rg-prod \
  --name old-migrate-vol-snap \
  --source old-migrate-vol
az disk delete --resource-group rg-prod --name old-migrate-vol --yes

Quick quiz

Question 1 of 5

Advisor and the Cost Optimization workbook flag managed-disk spend across SKU, capacity and performance tier on several disks. What is the most efficient way to think about them?

You can now treat managed disks as one savings capability rather than a scatter of findings: inventory every disk's SKU, capacity and tier against measured usage, bank the risk-free downgrades that lower the rate with no trade-off, schedule the SKU conversions that need a maintenance window, reclaim the unattached disks, and keep it on a cadence so the saving does not creep back. Most of it costs nothing in performance and lands the hour you run the command.

Back to the library