One of my larger projects recently has been to virtualize a Tier 1 Java application on vSphere for the State of Wisconsin. This application previously ran on WebSphere 5 and Oracle 9i, on some older physical boxes. As part of the upgrade we’re moving to WebSphere 7 and Oracle 11g, all 100% virtualized on vSphere. It was a big sell for the CIO and department, and so far it has been working great. Our production go live is the upcoming July 4th weekend.
As part of a bunch of Load Testing, I took a few minutes to grab some storage performance data using vscsiStats. A full dive into vscsiStats is out of the scope of this post, however I will link some great resources at the end of the article.
First, a bit about how I designed the Oracle environment. Taking advantage of Oracle ASM was really a big plus, however a lot of people were pretty nervous about the extra layer of management/abstraction (myself included). For the purposes of the design, however, it ended up working pretty well. In general, this design was really meant to meet a lot of the best practices regarding Oracle 11g on a vSphere platform.
Here’s a look at how one of the Database VMs was designed. Notice that there are really two ASM volumes, DATA and RECOVERY, that were designed to meet those obvious database needs. Both volumes are set to External redundancy to really allow our HP EVA 8400 to do the striping.

Each volume is served by a handful of .vmdk’s on separate dedicated datastores. These datastores are then mapped to LUNs in a 1:1 fashion. The disk size, for now, is 250GB, meaning the DATA volume has 4 disks for a total size of 1TB. In addition, the disks contributing to the DATA volume are on a separate virtual SCSI controller to take advantage of the paravirtualized SCSI driver.
Now for the interesting stuff. Here is some data gathered by vscsiStats collected over approximately 15 minutes during a load test designed to simulate about 85% of our normal production load.
The first interesting statistic to look at is the average IO size. Here is the IO Length profile for the DATA disks and RECOVERY disks respectively. Each member of the group shares a similar profile.


From the graphs we can see the majority of DATA IOs are 8KB. Conversely, the majority of IOs for RECOVERY are 1KB or 16KB (75%/25% mix). This tells me to optimize my corresponding SAN disk groups for this IO profile (stripe size). I believe the EVA has a hard coded 128KB stripe size (which is also the ASM default) so I guess the point is moot. Unfortunately in my world I don’t have spindles dedicated to this application, but it might be a good justification to management about why we need more disks.
Next, I wanted to take a look at the access profile to confirm what any DBA/SA would expect. The DATA disk group should be highly random in nature, and could benefit from faster spindles (15k SAS or SSD). The RECOVERY disk group, meanwhile, is handling logging and should appear highly sequential. This could be a case for 10k disk or even NL-SATA. The following graphs confirm.
By and large, we see successive R/W opperations having to travel the maximum positive or negative distance from the previous IO about half the time. However there is what I would call a “less random” aspect to this as well.

The RECOVERY group (logging) is about as sequential as you can get.

Finally, I wanted to take a look at what effect all of this had on overall latency. The RECOVERY volume shows sub .5ms latency about 75% of the time, which feels pretty decent to me.

Latency on the DATA volumes is somewhat less than ideal, in my opinion. About half of the IOs are coming in under .5ms, while the other half are taking longer than 5ms, with up to a quarter taking 15ms. However with multiple disks serving the volume the burden is eased somewhat. We’re getting fairly decent average transaction times of about .114s per transaction, so not bad.
EDIT: In retrospect, I was a bit censorious regarding the DATA volume latencies, especially when compared to the previous environment. If you look at read and write latencies for this disk group individually it was actually quite impressive.

All in all, vscsiStats is an outstanding (free!) tool for profiling your storage workloads. This is especially great in our case as we justify to the world how virtualizing tier 1 Oracle workloads on vSphere was indeed a great idea!
Please feel free to leave comments, questions, concerns, general theories, etc!
Extra Resources:
http://communities.vmware.com/docs/DOC-10095
http://www.yellow-bricks.com/2009/12/17/vscsistats/