Category Archives: Storage

Determining IOPS per VM

We are researching a refresh of our virtual desktop environment (which I still have yet to describe here) and the vendor we are working with had some questions around our current VDI storage utilization, especially how many IOPS per concurrent XP desktop as well as the Read/Write ratio.

I had never actually computed these since we haven’t had any storage issues lately and the storage that we’re using is more than adequate (actually overkill).

Anyway, since vSphere Client doesn’t exactly have a line on the VM Resources area indicating current IOPS (would be nice), we have to figure them out. If we look at the Performance tab for a VM, we can look at the disk rate usage but at least for me, choosing any of the “Summation” counters such as “Disk Read Requests”, “Disk Write Requests”, or “Disk Commands Issued” just resulted in a performance graph that never actually loaded. But that’s okay because we don’t want to take one VM’s storage profile and assume all the other VMs are behaving the same way. Maybe the user assigned to this VM is a power user who is always installing apps, or maybe they never log in to their desktop at all.

Therefore we have to go up to the host level. I have between 9 and 10 hosts across my VDI clusters so I picked one of my clusters and went to the Hosts tab and sorted by % Memory to find the host that is using the most memory. This  indicates to me that it is hosting the most virtual machines in the cluster. All our VDI VMs have the same amount of memory assigned (512mb) so I knew this would be the easiest way to find out which host in the cluster had the most VMs (would be nice to have a column in the Hosts tab that indicated how many VMs are on the host!)

Now that I know which host has the most desktops, I can look at the host’s disk performance and divide that by the number of running VMs. With a lot of VMs on this host, I can be confident that the numbers I calculate will be a truer average than choosing a lightly loaded host.

So on my heavily loaded host, I went to the Performance tab and clicked on “Chart Options”. In there I chose Disk real-time stats  (since the counters I’m looking for are only recorded in real-time and not kept longer than an hour). I chose all my naa.* objects which are my datastore LUNs (one LUN per datastore, and I ignored the mpx.* object which is the local SCSI controller and the host object itself).

For Counters, I chose “Disk Commands Issued”. When the graph rendered, I saved it as an Excel spreadsheet. I repeated this for “Disk Read Requests” and then also “Disk Write Requests”. I could have had all 3 counters in one graph/spreadsheet but I wanted to make things easy on myself when calculating the averages.

I should point out that it would be a good idea to collect this data during an hour where normal activity is taking place – not first thing in the morning when people are logging in and firing up various applications, and not in the evening when fewer people are logged in. Late in the morning (but not too close to lunch) would be a good time. But to play devil’s advocate, it may be a good idea to do this during the busiest time for the environment because the future storage needs to be able to handle that load. Look at the host graph for Disk Usage over a week and try to spot a trend for the busiest day/time. Possibly export to Excel to get a more granular look at the data.

Now in the spreadsheets, each row is a collection of performance data. The first column is a timestamp for the collection date/time which are 20 seconds apart (the collection interval). The next columns are for the counter in question for each LUN. So to get the average number of commands over the past hour for the LUN, I used AVERAGE for each column. This gave me the average number of commands issued over the last hour for each collection period. Dividing this number by 20 resulted in the average commands per second for each LUN. Adding up the average commands per second for each LUN gives me the average commands per second for the server, over the past hour.

With the average commands per second for the server over the hour, I then divide by the number of VMs on the server, 43, and I get the following results:

  • average read/write requests per vm per second: 6.69
  • average read requests per vm per second: 5.30
  • average write requests per vm per second: 1.39

Taking the individual read or write request numbers and dividing by read/write sum, I find the follow percentages:

  • read: 79.23%
  • write: 20.76%

This ratio is pretty much identical to the common assumption that Windows XP virtual desktops have an 80:20 read:write ratio.

Armed with this information, I’m sure the vendor can put together a storage solution which will adequately host our new virtual desktop infrastructure.

It would be nice if VMware could add these types of calculations in somewhere so that this manual math is not needed, but I’m glad I could at least export the chart data and manipulate it in Excel.