Performance Benchmarks with Azure Premium Disks

After some discussions with a customer this week, I decided to do a more in-depth analysis of Azure Storage, which I have done before many times. But this time I wanted to evaluate different options just to give people a better understanding of the impact of different configuration settings.

NOTE: I will follow up with numbers on LRS and Ephemeral disks as well.

I want to mention that during my testing I primarily used DiskSPD to do the benchmark of IOPS and Throughput, but used HD Tune Pro to evaluate the access time and doublecheck the performance. It is important to note that each VM SKU in Azure has a QoS limit that determines how high theoretical throughput and IOPS a machine can get.

If you are using a small VM SKU and High IOPS disk you might not get the IOPS you are paying for in the disk. For instance If I have a Premium V2 disk which has been configured to have 80,000 IOPS but I have a VM Standard_E2as_v5 it can only have up to 10,000 IOPS so I am paying for a set of IOPS that I cannot use.

My example environment was using the following configuration.

Standard_E16as_v5 which provides me with up to 800 MB/s of throughput and 40000 IOPS.

Then I have the following disk layout with all of them using 1024GB Premium Disks (Equivalent of P30) (Select a disk type for Azure IaaS VMs – managed disks – Azure Virtual Machines | Microsoft Learn) now it should note that each disk of P30 stars with a base of 5000 IOPS (combined read and write) and throughput of 200 MB/s but can be using upwards to 30,000 IOPS and 1,000 MB/s with Disk bursting enabled.

Firstly it is important to understand how Azure Disks work. Premium SSD disks are using Azure Storage as the underlying fabric to store the data, this means that all data is separate from the compute, unlike many HCI vendors today where storage is mostly available on the same host the machine is running on.

All tests were done at least 10 times and results and based upon averages of those tests.

Disk typeMax Write I/O per secMax Throughput (MB/s)Max Read I/O per SecAccess Time
D: Premium SSD ZRS – Bursting + Performance Plus + Accelerated Network + Read/Write Cache30596672 MB/s327180.079 MS
E: Premium SSD ZRS – Bursting + Performance Plus + Accelerated Network30615815 MB/s304731.86 MS
F: Premium SSD ZRS – Performance Plus + Accelerated Network8159304 MB/s81581.92 MS
G: Premium SSD ZRS – Performance Plus8157304 MB/s81572.19 MS
H: Premium SSD ZRS5101203 MB/s50991.02 MS
I: Premium SSD ZRS – Bursting25131585 MB/s305502.02 MS
J: Premium SSD v2 (Default with 8000 IOPS and 300 MB)8159 305 MB/s81600.330 MS
K: Premium SSD v2 (40000 IOPS and 1200 MB)40776814 MB/s407690.353 MS
L: Premium SSD ZRS – Accelerated Network5099203 MB/s50992.02 MS

There are a couple of things to note here

  • I hit a limit multiple times here for the different disks, for instance E: meets the limit for the VM SKU since it has 815 MB/s (which is burst limit for this VM SKU) secondly on the Premium SSD v2 where I also defined 1200 MB bandwidth on the disk but I meet the VM SKU limit.
  • Since Accelerated Networking was enabled for ZRS I got lower access times compared to when it was not enabled – This can be because it is in preview or that the performance is still not improved because of ZRS layout.
  • Premium SSDv2 provides the lowest access times and best performance in terms of throughput and bandwidth, just limited to the VM SKU type. Unfortunately It can only be used for data disks.
  • Performance Plus gives a great boost to IOPS / Throughput and is also free! (also still in preview) can only be enabled using PowerShell
az disk create -g resourcegroupname -n nameofdisk --size-gb 1024 --sku Premium_ZRS -l norwayeast --enable-bursting true --performance-plus true --accelerated-network true
az vm disk attach --resource-group db01_group --vm-name db01 --name nameofdisk

Here is the different DiskSPD commands that I used to do the benchmark, the test file is created automatically by DiskSPD which you can download using this PowerShell script

Script to download DiskSPD

$zipName = “DiskSpd.zip”
$zipPath = “C:\DISKSPD”
$zipFullName = Join-Path $zipPath $zipName
$zipUrl = “https://github.com/microsoft/diskspd/releases/latest/download/” +$zipName

if (-Not (Test-Path $zipPath)) {
New-Item -Path $zipPath -ItemType Directory | Out-Null
}

Invoke-RestMethod -Uri $zipUrl -OutFile $zipFullName
Expand-Archive -Path $zipFullName -DestinationPath $zipPath

DiskSPD commands

diskspd.exe -c200G -w100 -b4K -F4 -r -o128 -W30 -d30 -Sh d:\testfile.dat

diskspd.exe -c200G -w100 -b128K -F4 -r -o128 -W30 -d30 -Sh d:\testfile.dat

diskspd.exe -c200G -b4K -F4 -r -o128 -W30 -d30 -Sh d:\testfile.dat

Leave a Reply

Scroll to Top