# Azure Ultra SSD Disk with Low IOPS

> Flags Ultra Disks peaking under 20% of provisioned IOPS for 30 days and prices a move to the same-size Premium SSD tier.

Source: https://zop.dev/integrations/azure/recommendations/azure-ultra-ssd-disk-with-low-iops

---

## Three meters behind every Ultra Disk

An Ultra Disk is priced on what you provision, not on what you use. The
[disk types page](https://learn.microsoft.com/en-us/azure/virtual-machines/disks-types) explains
that capacity, IOPS and throughput are set independently and that each of them determines the cost
of the disk. IOPS can go up to 1,000 per GiB and throughput can be adjusted at runtime, up to four
times in a 24-hour window.

That flexibility invites over-provisioning. A disk set to 20,000 IOPS for a migration or a benchmark
keeps billing for all of them long after the workload has settled at a few hundred.

## Listing Ultra Disks with their provisioned performance

```bash
az disk list \
  --query "[?sku.name=='UltraSSD_LRS'].{name:name, rg:resourceGroup, size:diskSizeGB, iops:diskIOPSReadWrite, mbps:diskMBpsReadWrite, vm:managedBy}" \
  -o table

az monitor metrics list --resource <disk-resource-id> \
  --metric "Composite Disk Read Operations/sec" "Composite Disk Write Operations/sec" \
  --aggregation Maximum --interval PT1H --offset 30d
```

## Usage and fit checks for an Ultra Disk

1. The disk SKU is `UltraSSD_LRS`, and its provisioned IOPS and throughput are both known.
2. Azure Monitor has both the read and the write series; a missing one means no finding.
3. The 30-day peak, read maximum plus write maximum, is below 20% of provisioned IOPS.
4. The same peak fits within the IOPS of the Premium SSD tier that matches the disk's size. A
   256 GiB disk maps to P15 at 1,100 IOPS, so a peak above that blocks the recommendation even if
   it is far below the Ultra figure.

## When the swap does not save money

A small Ultra Disk with modest provisioned performance can cost less than the Premium tier for its
size. In that case the computed saving is zero or negative and there is no finding. If the region's
price feed lacks the Ultra IOPS or throughput rate, the rule also stays silent rather than pricing
only the capacity meter.

## Full Ultra cost against the Premium tier

```text
Ultra monthly   = capacity cost
                + provisioned IOPS x IOPS rate per hour x 730
                + provisioned MB/s x throughput rate per hour x 730
Premium monthly = Premium tier hourly rate for the disk size x 730
saving          = Ultra monthly - Premium monthly
```

Counting all three Ultra meters matters: the capacity line alone would make the Ultra Disk look much
cheaper than it really is.

## Replacing the Ultra Disk with Premium SSD

1. Confirm the peak and latency needs in Azure Monitor.
2. Snapshot the Ultra Disk.
3. Stop and deallocate the VM.
4. Create a Premium SSD disk from the snapshot at the same size, attach it in place of the Ultra
   Disk, and start the VM.
5. Watch latency for 24 hours before deleting the old disk and snapshot.

**Warning**
Microsoft notes that in most cases you cannot switch a disk to or from Ultra in place; you deploy a new disk from a snapshot. Once no Ultra Disk is attached, turn off the VM's Ultra Disk compatibility, because a VM with that capability enabled and no Ultra Disk attached pays a per-vCPU reservation charge.
