With the release of Windows Server 2012 and Windows 8.0 a new storage technology was made available called Storage Spaces. This technology enables a virtualized storage platform that can group standard disks into storage pools. By using the capacity in the pool, one or more virtual drives called storage spaces can be created. Storage Spaces can provide many features such as resiliency, storage tiers, write-back cache and continuous availability.
By utilizing Storage Spaces in a Windows Server 2012 (or higher) VM hosted in Azure you can overcome some of the perceived limitations of Azure storage. Virtual hard drives (VHD) are stored in Microsoft Azure storage as page blobs which have a maximum size of 1TB. For basic tier virtual machines you can expect storage performance of 300 IOPS per VHD. For standard tier virtual machines the storage performance increases to 500 IOPS per VHD. If you take these limitations at face value it would appear that there may be some workloads that could not be deployed in an Azure virtual machine. One such example would be a SQL data warehouse.
I mentioned that these are perceived limitations and this is because there are ways to combine VHDs with Storage Spaces to provide higher IOPS and more capacity. The total number of VHDs that a single Windows Azure virtual machine can attach is determined by the size of the virtual machine. For example, a standard tier A3 (large) virtual machine can have up to 8 persistent 1TB data VHDs. All virtual machines have a 127GB disk configured for the operating system.
With Storage Spaces we can combine all of the virtual machine data disks into a single virtual drive where data is striped across all disks. This configuration does take a little bit of storage overhead, so although in our A3 example we could have up to 8TB of storage, the actual usable amount will be slightly less. This striping process can also increase our IOPS from 500 for a single disk to a maximum of (8*500) or 4,000 IOPS for the A3 virtual machine. Actual performance will vary depending on the Storage Space configuration and workloads running on the virtual drive.
For maximum performance it is recommended:
- Ensure that resiliency is not configured for the Storage Space virtual drive
- Configure the number of columns for Storage Space equal to the number of drives (VHDs) in the pool
- Configure the interleave value at least as large as the I/Os of your workload. I/Os that exceed the interleave are split into multiple stripes, which require multiple writes. For details on this I recommend reading the Block Size and Interleave section of this article on designing Storage Spaces for performance.
In the Script Gallery hosted by Microsoft there is a demonstration PowerShell script that shows how to build out a Microsoft Azure virtual machine using Storage Spaces. This script will build out a new virtual machine with the maximum number of data disks based on a select virtual machine size. Once the virtual machine is built, a remote PowerShell script is started that configures Storage Spaces to provide the highest storage performance currently available for that VM size.
I recommend reviewing the script and performing your own performance tests. By properly configuring Storage Spaces on the right sized VM you can achieve very high IOPS while also providing up to approximately 64TB of storage (based on standard G5 VM).
Storage spaces overview
Virtual Machine and Cloud Service Sizes for Azure
Azure Subscription Storage Limits
Script Center – Azure
Automate the creation of an Azure VM preconfigured for max storage performance