Do Azure VMs have disk I/O limits?
We have a SQL server hosted on an Azure VM. One of our applications is very read\write intensive on the database and we're seeing poor disk performance. Disk queue lengths of 10 or greater.
I've been trying to find a way to increase disk performance. I found a technet video here that mentions a disk quota and spanning 4 storage accounts increases disk i/o. Can anyone confirm this disk limiter or recommend this spanning technique?
Solution 1:
Azure disks are stored as page blobs in Azure Storage. A storage account has specific scale targets. As you drive heavy disk I/O load through a VM, it's possible to push the limits of these storage targets. Locally-redundant storage accounts have a perf target of 10Gbps ingress/15Gbps egress, while geo-redundant accounts have a target of 5Gbps ingress/10Gbps egress. A specific blob (which holds a single disk) has a target of 60MBytes/sec.
This is why you will see suggestions (such as that TechNet video) for using multiple disks across multiple storage accounts, to go beyond account-specific storage scale targets.
Here's an article regarding VM sizes and related max IOPs. You'll see that each VM size has max. IOPs equivalent to 500 x #disks attached.
This article covers performance considerations for running SQL Server in a virtual machine, that covers many topics including disk IO.
EDIT This answer is a bit outdated now. Aside from standard storage disks, you may now use Premium storage for disks. Premium storage is SSD-backed, and disks range from 500-5000 IOPS, and 100-200MB/sec, depending on disk tier (the highest being 1TB, 5000 IOPS, 200MB/s). You will still have overall limits for a given DS- or GS- series VM, but these limits are higher than D- or G- series (maxing out at 80,000 IOPS and 2,000 MB/s on a GS5, for example).
More info on VM sizes here.
More info on Premium storage here.
Solution 2:
The new DS series VMs (w/ local SSD temp drive and persistent SSD backed drives) do have a per-VM bandwidth limit as you can see In the DS series documentation.
The bandwidth is ~32 MB/s per core.