Azure disk IOPS vs throughput: what limits your disks

Every disk has two caps, and so does every VM. How they stack, how to read them, and what to change.

Published 1 November 2026 · By Ajay Roy, Guest author · Infrastructure engineer at HCL · Published by Zoorik

Azure disk IOPS vs throughput: the VM limit and the disk limits both cap I/O, and the smaller limit wins

Short answer. Azure disk IOPS vs throughput compares two limits, IOPS (input/output operations per second) and throughput, the megabytes per second those operations move. Azure caps both on every managed disk and again on every VM size, and the smaller limit sets your speed.

Azure disk IOPS vs throughput: the smaller limit sets your speed

Take a Standard_D4s_v5 VM with four 512 GiB P20 Premium SSD data disks. Together, the four disks allow 9,200 IOPS and 600 MB/s. The VM allows 6,400 IOPS and 145 MB/s of uncached traffic outside bursts, however many disks you attach.

A database on the VM sending 8 KB requests still stops at 6,400 IOPS, moving roughly 50 MB/s. A backup reading 1,024 KB at a time tops out at 145 MB/s, under 150 requests a second.

Latency, the time one request takes, is what your application feels. Microsoft’s performance page warns that capping “can lead to negative consequences like increased latency.”

Azure disk IOPS and throughput limits apply at two levels. Each managed disk has its own pair. Azure VM disk IOPS limits are the second level: each VM size sets a pair for all its disks together, OS disk included.

Microsoft’s design guide says the per-VM and per-disk limits “are different and independent of each other.” Traffic must fit under both:

LimitIOPSThroughput
One P20 data disk
2,300
150 MB/s
Four P20 data disks together
9,200
600 MB/s
Standard_D4s_v5, uncached
6,400
145 MB/s

Three P20s already give 3 × 2,300 = 6,900 IOPS, past the VM’s 6,400. So the fourth adds space and no usable IOPS. Throughput runs out sooner: one P20 alone can move 150 MB/s, more than the VM allows across all four.

The VM's limit sits below the four disks' total, so it wins Panel IOPS, on a scale from 0 to 10,000: one P20 data disk, an outline bar to 2,300. Four P20s together, an outline bar to 9,200, with the stretch from 6,400 to 9,200 drawn amber and labelled past the VM's limit. Standard_D4s_v5, uncached, a highlighted bar to 6,400. A dashed line at 6,400, labelled VM limit, runs through all three rows. Panel Throughput, MB/s, on a scale from 0 to 600: one P20 data disk, an outline bar to 150. Four P20s together, an outline bar to 600, with the stretch from 145 to 600 drawn amber and labelled past the VM's limit. Standard_D4s_v5, uncached, a highlighted bar to 145. A dashed line at 145, labelled VM limit, runs through all three rows. In the throughput panel, the one-P20 bar ends at 150, just past the VM line at 145. The VM's limit sits below the four disks' total, so it wins IOPSVM limitOne P20 data disk2,300Four P20s togetherpast the VM's limit9,200Standard_D4s_v5uncached6,40005,00010,000Throughput, MB/sVM limitOne P20 data disk150Four P20s togetherpast the VM's limit600Standard_D4s_v5uncached1450300600
Uncached limits outside bursts, as Microsoft lists them for the Dsv5 series and the Premium SSD tiers.

Premium SSD v2 doesn’t support host caching. The D4s_v5 can also burst uncached traffic to 20,000 IOPS and 1,200 MB/s for up to 30 minutes at a time. That covers short peaks, not a steady load.

Request size decides which limit you reach first

An I/O operation is one read or write request, and requests come in different sizes. Microsoft’s performance guide ties the two measures together: IOPS multiplied by I/O size equals throughput.

So the same disk can hit either limit first. Microsoft’s worked example uses a P30 Premium SSD, provisioned for 5,000 IOPS and 200 MB/s.

With 8 KB requests, the P30 reaches 5,000 IOPS at only 40 MB/s. With 1,024 KB requests, it gets to 200 MB/s at only 200 IOPS.

Small random requests, typical of a transactional database, meet the IOPS cap first. Large sequential reads from a backup meet the throughput cap.

Small requests reach the IOPS cap, large ones the throughput cap A grid of four meters for one P30 Premium SSD. Columns: IOPS, cap 5,000 and Throughput, cap 200 MB/s. Each meter is an outline for the cap, filled violet to the share in use. 8 KB requests: IOPS 5,000 of 5,000 IOPS, at the cap, highlighted and Throughput 40 of 200 MB/s. 1,024 KB requests: IOPS 200 of 5,000 IOPS and Throughput 200 of 200 MB/s, at the cap, highlighted. Small requests reach the IOPS cap, large ones the throughput cap IOPS, cap 5,000Throughput, cap 200 MB/s8 KB requests5,000 IOPS, at the cap40 MB/s1,024 KB requests200 IOPS200 MB/s, at the cap
Microsoft’s worked example for one P30 Premium SSD, provisioned for 5,000 IOPS and 200 MB/s.

Request size also changes how Azure counts. On Premium SSD and Standard SSD, a request of up to 256 KiB counts as one I/O operation. A larger one counts as several operations of 256 KiB, so a 1 MiB write counts as four.

On Premium SSD, the IOPS you need sets the size you pay for

How each disk type sets its limits

Azure disk IOPS limits come from the disk type and, for most types, its size:

  • Premium SSD sets both limits by size tier. A P30 (1,024 GiB) gets 5,000 IOPS and 200 MB/s, rising to 20,000 IOPS and 900 MB/s on a P80.
  • Standard SSD gives up to 500 IOPS and 100 MB/s on every size from E1 to E50 (4,096 GiB). So at base limits, a bigger disk below E60 adds only space. Microsoft designs Standard SSD to reach those limits 99% of the time, against 99.9% for Premium SSD.
  • Premium SSD v2 lets you set both limits. You choose capacity from 1 GiB to 64 TiB, and IOPS and throughput apart from it. They run from a free baseline of 3,000 IOPS and 125 MB/s up to 80,000 IOPS and 2,000 MB/s.

On Premium SSD, the size you provision picks the tier. The tier sets capacity, IOPS and throughput together, and you pay for the tier. Microsoft’s design guide advises a disk size “that offers IOPS greater than your application requirement.”

Premium SSDs of 512 GiB and smaller can also burst up to 3,500 IOPS and 170 MB/s for up to 30 minutes. Azure disk performance tiers covers bursting and tier changes.

Premium SSD v2 works only as a data disk. In most regions with availability zones, it attaches only to zonal VMs. Premium SSD v2 vs Premium SSD covers what each costs.

A Premium SSD sized for IOPS, not for data

At 90 GiB, 90 ÷ 1,024 ≈ 9% of what you pay for holds data, and 1,024 − 90 = 934 GiB holds none.

A 100 GiB Premium SSD v2 disk can carry the P30’s 5,000 IOPS and 200 MB/s with 10 GiB to spare. It needs 5,000 − 3,000 = 2,000 IOPS and 200 − 125 = 75 MB/s set above its free baseline.

5,000 IOPS takes a 1,024 GiB P30, or a 100 GiB Premium SSD v2 disk Two bars on one scale from 0 to 1,024 GiB. Premium SSD P30, 1,024 GiB, 5,000 IOPS and 200 MB/s: a violet data segment of 90 GiB, 9% of the disk, and an amber no-data segment of 934 GiB. Premium SSD v2, 100 GiB, set to 5,000 IOPS and 200 MB/s: a violet data segment of 90 GiB and an amber sliver of 10 GiB with no data. 5,000 IOPS takes a 1,024 GiB P30, or a 100 GiB Premium SSD v2 disk Premium SSD P30, 1,024 GiB5,000 IOPS and 200 MB/sno data, 934 GiBdata, 90 GiB (9%)Premium SSD v2, 100 GiBset to 5,000 IOPS and 200 MB/sno data, 10 GiBdata, 90 GiB05121,024GiB
The worked example’s workload: 90 GiB of data that needs 5,000 IOPS.

To price those 934 GiB, enter a 1,024 GiB Premium SSD with 90 GiB used in the Azure disk pricing calculator.

How to check disk IOPS in an Azure VM

Read the Azure disk IOPS consumed percentage metrics

Azure Monitor’s storage I/O utilization metrics divide use by the limit, on VM series that support premium storage. For each, Microsoft says: “If this value reaches 100%, your application is I/O capped” by that limit.

The metrics come in pairs:

  • Disk level. Data Disk IOPS Consumed Percentage with Data Disk Bandwidth Consumed Percentage. The OS disk gets the same two.
  • VM level. VM Uncached IOPS Consumed Percentage, VM Uncached Bandwidth Consumed Percentage and a cached pair for I/O through the host cache.

In the Azure portal:

  1. Open the VM and select Metrics in the left pane.
  2. Add Data Disk IOPS Consumed Percentage and set the aggregation to Max.
  3. Apply splitting by LUN (logical unit number, the slot a data disk sits in), so each disk gets its own line.
  4. Repeat for Data Disk Bandwidth Consumed Percentage, then add the two VM Uncached metrics without splitting.

Splitting matters. In Microsoft’s example, the data disks averaged about 42% of their IOPS, while LUN 2 and LUN 3 each used about 85%.

From the Azure CLI, this lists each data disk’s peak in every five-minute window over the last 24 hours:

az monitor metrics list \
  --resource <vm-name> \
  --resource-group <resource-group> \
  --resource-type Microsoft.Compute/virtualMachines \
  --metrics "Data Disk IOPS Consumed Percentage" "Data Disk Bandwidth Consumed Percentage" \
  --dimension LUN \
  --top 64 \
  --aggregation Maximum \
  --interval 5m \
  --offset 24h

For the VM level, drop --dimension and use the VM Uncached pair. Most of these metrics arrive once a minute, while the guest’s counters can report every few seconds.

Data Disk Latency (in preview) adds the average time per I/O in milliseconds. It covers disks on a SCSI controller, not NVMe.

Check from inside the VM

On Linux, iostat from the sysstat package reports each device at the interval you choose:

iostat -d -x -m -y 5
  • IOPS. Add r/s and w/s.
  • Throughput. Add rMB/s and wMB/s. The iostat MB is a mebibyte, while Azure’s is 10^6 bytes, so the D4s_v5’s 145 MB/s shows as about 138.
  • Latency. The r_await and w_await columns give it in milliseconds, queue time included.
  • Request size. The average in KiB is in rareq-sz and wareq-sz, and shows which cap you’re nearer.

On a SCSI controller, list the disks with their HCTL address to match each one to its LUN in the portal. The last number is the LUN:

lsblk -o NAME,HCTL,SIZE,MOUNTPOINT | grep -i "sd"

On an NVMe controller, sudo azure-nvme-id from the azure-vm-utils package prints each data disk’s LUN. On Windows, the matching PerfMon counters are:

  • Disk reads/sec and Disk writes/sec, for IOPS;
  • Disk read bytes/sec and Disk write bytes/sec, for throughput.

What to change when a disk or the VM is capped

Read both levels together:

  • A disk metric at 100%, VM metrics below. The disk is the limit. A larger Premium SSD tier, higher settings on a Premium SSD v2 disk or more disks striped together all raise it. Microsoft’s example stripes two P30 disks for 10,000 IOPS or 400 MB/s, which helps only while the VM can carry the total.
  • A VM metric at 100%. A faster disk won’t help. Moving to a Standard_D8s_v5 doubles the D4s_v5’s limits to 12,800 IOPS and 290 MB/s. On a size that supports host caching, Microsoft also recommends ReadOnly caching on read-heavy disks for higher read IOPS.
  • IOPS capped, throughput low. The requests are small. The reverse means they’re large.
  • Neither at 100%, latency still high. Look past the disk limits. Microsoft notes that an apparent disk problem is sometimes a network bottleneck.
  • Both far below 100% for weeks. The disk has more IOPS and throughput than its workload uses. On Premium SSD, the tier that supplies them also sets the size you pay for, so check used space inside the VM too. Azure can’t shrink a managed disk in place.

How Amoeba handles disk load in a pool

Amoeba, Zoorik’s block storage optimization, works on that last case. On running Windows and Linux VMs, it moves the data disks onto one btrfs pool sized to your data, with room to grow. Amoeba never touches the OS disk.

  • Disk type. On Azure the pool uses Premium SSD v2 where your VM’s region and zone offer it, and Premium SSD otherwise. On AWS it uses gp3.
  • Disk load. Amoeba picks pool disks that carry the VM’s measured disk load, within the VM size’s own disk limits.
  • Rightsizing. It grows the pool before it fills, and sooner when data arrives fast. When your data goes down and stays down, it shrinks the pool one disk at a time.
  • Shrinks. Each disk removed takes its IOPS and throughput with it. So a shrink goes ahead only if the disks that stay can still carry the VM’s disk load.
  • The move. Amoeba copies your data while your services run. Then it switches each mount to the pool, with a short restart of the services that use it.

Azure managed disk cost optimization covers Amoeba on Azure in full.

Sources: Microsoft Learn, “Virtual machine and disk performance” (opens in a new tab); Microsoft Learn, “Disk performance metrics” (opens in a new tab); Microsoft Learn, “Azure managed disk types” (opens in a new tab); Microsoft Learn, “Azure premium storage: Design for high performance” (opens in a new tab); Microsoft Learn, “Dsv5 sizes series” (opens in a new tab); Microsoft Learn, “az monitor metrics” (opens in a new tab); Microsoft Learn, “Use the portal to attach a data disk to a Linux VM” (opens in a new tab); man7.org, “iostat(1), Linux manual page” (opens in a new tab).

Find your own number

One line in your cloud console. One PDF report with your estimated saving at list price.

Estimate your saving

Talk to the builders

Thirty minutes with the people who build Amoeba.

Book a demo (opens in a new tab)

Or write to founders@zoorik.com