So, this is going to be a quick post. I’ve been doing a lot of work in trying to hit the limits of Azure – really getting a feel for the beast. As I’ve already posted about, one of the biggest limitations that I’ve run into has been the disk performance.
We’ve been in close communication with Microsoft on a lot of things pertaining to Azure, IaaS, SQL and the like – none of which I can talk about here. But, what I can talk about is a side project that I did to … guesstimate … what the performance of IaaS can be in the future.
Why the “Hack”?
Here are the “truths” that you likely already know about IaaS / disk performance in Azure.
- Azure IaaS uses a single storage account to host your VHD.
- Azure storage accounts are limited to 5,000 transactions per second.
Like I’ve mentioned before, that comes out to about two or three 15k spindle hard drives striped together. Here are a couple of things you likely don’t know (or haven’t thought of in the context of this conversation).
- Azure had the ability to have persisted hard drives for over 2 years now.
- Unlike IaaS (which is limited to 1 storage account), PaaS can mount 16 different storage accounts on one box!
The above statements are referring to using the CloudDrive class, which you have to mount in code. Due to the reliance of needing “RoleEnvironment.IsAvailable” to be true, this feature only works in PaaS. I consider that bad code, but I understand why this happened.
Therefore, the “hack” is to make a single worker role in PaaS that mounts multiple storage accounts into a single striped volume. Then I remote into that machine, install SQL Server and run my previous test to see what the performance of IaaS could be one day (if Microsoft decided that multiple storage accounts was the way to get more IOPs in IaaS).
Disclaimer and Code
I hope that I don’t have to tell you that this is obviously not recommended for a production solution. The whole point of the exercise was to see how far Azure would stretch, and to give an idea of the (potential) future. My goals were happily met. I achieved more than double the performance of my previous test. And I’m sure with the right setup, I could have gotten even more.
Here is the code (that will automatically create a multi-account striped drive) in case you want to do your own performance tests with your app in the cloud: AzureDriveMounterUtility.zip
You’ll need take the following steps for it to work:
- Allow Remote Desktop connections (so you can log in and test your app).
- Edit the App.Config with real storage account credentials.