Hyper-V Virtual Hard Disk Performance
For best performance, should I use dynamic or fixed disks, how about differencing or raw disks and what about for specific workloads?
If you have ever asked yourself questions like those (and let’s face it if you are a geek like me, frequently)… do I have a whitepaper for you.
We recently released an in depth performance analysis on Windows Server 2008 Hyper-V R2 Virtual Hard Disk Performance using a variety of workloads including SQL, Exchange, Web and more. This is a must read: https://download.microsoft.com/download/0/7/7/0778C0BB-5281-4390-92CD-EC138A18F2F9/WS08_R2_VHD_Performance_WhitePaper.docx)
I have had many questions about the disk performance, including a specific discussion with a customer on allocation unit size for virtualized Exchange 2010 servers. I cannot take credit for the recommendations made, those go to John Kadianos (and team) from Hyper Technologies Inc (www.hypert.com). Here was the outcome of the conversation:
The question was; what allocation unit size should I use for storage on a Virtualized Exchange 2010 server SAN?
A: (Courtesy of John and team)
64K for both .edb and logs should be used. We always pick the best practice based on the application specs for “Allocation Unit Size”, and format the LUN with those specs regardless of whether it is presented as a VHD or a Passthrough disk.
To further that comment, we actually always use 64K “Allocation Unit Size” when dealing with any Windows volumes, as it is considered best practices for SQL, Exchange and general file sharing (see note below on “General File Systems”) , and it is a fraction of the default stripe sizes on many enterprise arrays...EMC and HDS for example.
It is important to align with or take into account the storage being used.
Exchange
For exchange it is straightforward.
The recommendation for Exchange 2010 is here: https://technet.microsoft.com/en-us/library/ee832792.aspx
Volume configurations for Exchange 2010 Mailbox server role
For virtualized environments with exchange you would have the same value at all levels of virtualization.
Get the alignment right too (on W2008 this should now default OK to 1MB).
For non-exchange environments it is less clear.
From a storage point of view, larger is better. But good for storage may mean bad for applications.
For virtualized environments without exchange, you would still set the same value at all levels of virtualization.
Perhaps larger at the VHD level than the client file system, never smaller.
But what value?
SQL Server (2008 but probably good for all SQL versions):
Start Here: https://msdn.microsoft.com/en-us/library/dd758814.aspx
An appropriate value for most installations should be 65,536 bytes (that is, 64 KB) for partitions on which SQL Server data or log files reside. In many cases, this is the same size for Analysis Services data or log files, but there are times where 32 KB provides better performance. To determine the right size, you will need to do performance testing with your workload comparing the two different block sizes.
General File Systems
Start here: https://technet.microsoft.com/en-us/library/cc751289.aspx
Before you set up a RAID array or new standalone disks, you need to determine the size of the average disk transfer on your disk subsystem and set the allocation unit size to match it as closely as possible. By matching the allocation unit size with the amount of data that you typically transfer to and from the disk, you'll incur lower disk subsystem overhead and gain better overall performance.
To determine the size of your average disk transfer, use Performance Monitor to review two counters (Avg. Disk Bytes/Read and Avg. Disk Bytes/Write) under the LogicalDisk object. The Avg. Disk Bytes/Read counter measures the average number of bytes transferred from the disk during read operations, and the Avg. Disk Bytes/Write counter measures the average number of bytes transferred to the disk during write operations.