I’ve recently been doing a lot of work around Azure Premium Storage and the configuration options across various virtual machines. I did a similar post to this one where I talked about standard storage. You can find that post here. Since that post I’ve had access to premium storage and Microsoft has released both the DS and GS series virtual machines for premium storage.
They have done a great job at the documentation. I’ve documented the sites I’ve found most useful in my Show Notes post from the podcast. However, in this post I want to pull those together and talk about some of the numbers I’ve seen as well as limitations of Premium Storage.
|Disk Type||Size||Throughput (MB/s)||IOPs|
|P10||128 MB||100 MB/s||500 IOPs|
|P20||512 MB||150 MB/s||2300 IOPs|
|P30||1024 MB||200 MB/s||5000 IOPs|
One of the biggest downsides to premium disks as opposed to standard disks as you’ll notice there is a set size. If you want the fasts possible performance, you need to get 1TB drives. With standard storage, you set the size disk you want and the performance is the same if you have a 5GB drive or a 1TB drive.
For instance, for most of the VMs, in order to hit peak performance, you need to use either P20 or P30 drives, with a P10 you usually hit the drive max for the VM before you hit the max IOPs or Throughput for the disks. That means, that to get peak performance out of a DS4 with an 8K block size, I need 5 P30 drives, which equates to 5TB of storage. If I don’t need 5TB but still want that peak performance, oh well, I just have to pay for a bunch of storage I don’t really need.
Ok, I’m off my soapbox now…time for the VMs…
There are a couple tables below. The first will show how the limits are calculated for two two series (DS and GS) of VMs if you want to figure out the limits for yourself. Everything is based on the number of CPU cores. If you’re not one for math and just want to see the raw numbers, the second table will list them all out.
C = Number of CPU Cores
|VM Series||CPU Cores||Memory||Local SSD (temp drive)||Max Data Disks||Cache Size (GB)||Max IOPs||Max Throughput (MB/s)|
|DSx Series (i.e. DS1)||C||C * 3.5 GB||C * 7 GB||C * 2||C * 43 GB||C * 3,200||C * 32 MB/s|
|DS1x Series (i.e. DS11)||C||C * 7 GB||C * 14 GB||C * 2||C * 36||C * 3,200||C * 32 MB/s|
|GS Series||C||C * 14 GB||C * 28 GB||C * 2||C * 132||C * 2,500||C * 62.5d MB/s|
|Virtual Machine||CPU Cores||Memory||Local SSD (temp drive)||Max Data Disks||Cache Size (GB)||Max IOPs||Max Throughput (MB/s)|
|DS1||1||3.5 GB||7 GB||2||43 GB||3,200 IOPs||32 MB/s|
|DS2||2||7 GB||14 GB||4||86 GB||6,400 IOPs||64 MB/s|
|DS3||4||14 GB||28 GB||8||172 GB||12,800 IOPs||128 MB/s|
|DS4||8||28 GB||56 GB||16||344 GB||25,600 IOPs||256 MB/s|
|DS11||2||14 GB||28 GB||4||72 GB||6,400 IOPs||64 MB/s|
|DS12||4||28 GB||56 GB||8||144 GB||12,800 IOPs||128 MB/s|
|DS13||8||56 GB||112 GB||16||288 GB||25,600 IOPs||256 MB/s|
|DS14||16||112 GB||224 GB||32||576 GB||50,000 IOPs||512 MB/s|
|GS1||2||28 GB||56 GB||4||264 GB||5,000 IOPs||125 MB/s|
|GS2||4||56 GB||112 GB||8||528 GB||10,000 IOPs||250 MB/s|
|GS3||8||112 GB||224 GB||16||1,056 GB||20,000 IOPs||500 MB/s|
|GS4||16||224 GB||448 GB||32||2,112 GB||40,000 IOPs||1,000 MB/s|
|GS5||32||448 GB||896 GB||64||4,224 GB||80,000 IOPs||2,000 MB/s|
Optimal VM/Disks Configurations
Now this is where it get’s interesting…disk performance is the same for both DS and GS machines, but as you start configuration your VMs and Data drives some configurations just don’t make sense. Other times you really need to take into considering what the VM is going to be used for to know how to best configure it.
For instance, it you’ll never get the full performance from a P30 disk attached to to a DS1 VM if all you’re looking at is raw performance. A P30 disk gives you 200 MB/s of throughput and 5,000 IOPs. However, a DS1 maxes out at 32 MB/s and 3,200 IOPs. So you’ll hit the VM limit on throughput way before you hit the Disk limit. However, you may be able to squeak out a few more IOPs than if you were using a P20 Disk.
So, what better way to show some of this than more tables! All tests below were done using Diskspd and the disks were set with read caching disabled. It get’s really interesting with read caching enabled, as it is possible to max out a VM with just a single disk attached. (I maxed out my IOPs on a GS5 with a single P30 with read caching enabled). Also I tested with 8K and 64K. 4K or 8K is pretty standard, 64K is recommend for a SharePoint SQL Server.
This will show the performance per disk based on some actually disk tests I did (not the document numbers) using a DS14 VM.
|Disk Type||Block Size||IOPs||Throughput (MB/s)|
|P10||8 K||510||4 MB/s|
|P10||64 K||510||32 MB/s|
|P20||8 K||2,345||18.33 MB/s|
|P20||64 K||2,335||146 MB/s|
|P30||8 K||5,100||39.85 MB/s|
|P30||64 K||3,112||194 MB/s|
You can already see what’s starting to happen here with the P30 Disk if you’re reading/writing 64K blocks, you’re hitting your maximum throughput before you hit your maximum IOPs and this is actually capping your IOPs. However, by striping your disks, you can achieve better performance if your VM supports it. In the case of a DS14, you can strip three disks before you cap out your performance reading/writing 64K blocks or 10 Disks reading/writing 8K blocks as you can see in the following two tables. Again, these are actual numbers from a disk test.
DS14 VM with P30 Disks attached and striped testing reading/writing 64K blocks:
|Number of Disks||IOPs||Throughput (MB/s)|
DS14 VM with P30 Disks attached and striped testing reading/writing 8K blocks:
|Number of Disks||IOPs||Throughput (MB/s)|
Last example I ran the numbers on was a GS2 and P30 Disks. Here you actually hit the limit at 2 disks for both 8 K and 64 K as you can see in the table below:
|Number of Disks||Block Size||IOPs||Throughput (MB/s)|
10,000 is our max IOPs for a GS2 and 250 MB/s is our max throughput for a GS2.
Obviously there are a lot more scenarios that could be tested, but the above gives you the numbers that can be used to expand this test out to all the other VMs using the performance/disk table (the first table in this section).
For your reference I created the table below using the performance/disk table and the documented VM limits. In my experience, sometimes you can get a little more out of both disks and VMs than documented, but this will give you a good reference. All test were done with Read Caching disabled. If you enable read caching, it can be really hard to get an accurate test as performance will depend on what is stored in the cache. I performed a quick disk test on a GS5 VM, a P30 disks with Read Caching enabled and was able to hit 80,000 IOPs and 2,0000 MB/s of throughput with just a single disk b/c everything was able to be written to/read from the cache. So, here are the numbers (I also provided slicers so you can filter down by the VM, the Disk Type, and or the Block Size – 8K or 64K)
So, there you have it, a lot of performance numbers based on my testing that will hopefully help you to configure your premium storage to achieve optimum performance. I’ve seen some people just stripe a bunch of disks in order to get high performance. However, as you can see from the table, sometimes your’e better of just striping a few disks and creating a bunch of drives.
For example, with a SQL Server for SharePoint, create a bunch of drives that have just a few premium disks striped and spread out your database across all those drives.
Feel free to reach out in the comments or via social media if you have any additional questions.