During a whiteboard session laying out the Citrix Flexcast models, someone asked how Provisioning Server reduces the amount of IOPS that the underlying disks or storage array sustain as part of a VDI deployment. This is usually to compare it against things like Citrix's MCS or VMware's Linked Clone technology, which use a "master image" machine as the base image of additional machines, and thus receives high levels of disk activity (very read intensive especially during provisioning, see<a href="http://egroup.jasonmangone.com/emc-vnx-fast-cache-ten-10k-drives-17000-iops" target="_blank"> this post </a>which shows the breakdown of IO from the viewpoint of a storage array).

First, it's important to understand that the PVS server streams a virtual hard disk over the network to a target device, and the virtual hard disk itself is stored in a single file, which can be locally, on a file share on a file server, on a storage array, etc. We commonly find this on a CIFS share, where the data resides on a highly redundant system that provides the necessary level of availability/redundancy and bandwidth (something like an EMC VNX or Celerra).

In a XenDesktop VDI deployment, the target device is a virtual machine running on your hypervisor of choice (Citrix supports hypervisors from Microsoft and VMware in addition to their own). So we'll start from here.

Without going into the details of the process-- A virtual machine turns on, PXE boots and based on its vDisk assignment on the PVS Server itself, a vDisk is mounted on the PVS Server. The virtual machine then boots, and <strong>only the data needed</strong> is streamed to it in real-time (as opposed to streaming the entire disk itself). Citrix's internal testing has showed about 120MB of the image is streamed for XP, and about 200MB for Windows 7. Here's where things get fun.

<!--more-->

As much of the vDisk as possible (and I imagine based on what's actually used/pulled from the vDisk actively) get stored in RAM on the PVS server itself. When a virtual machine needs something else from the virtual hard disk, the PVS streams is down over the network, and as best as possible, delivers this through RAM instead of hitting the underlying disk with a read operation. This means you should be generous with the RAM you put in your PVS servers.

Because of this, it's common to find IO profiles in PVS environments that are 80% writes, and only 20% reads, sometimes even higher (90/10). This is the first level of IOPS savings resulting from the use of PVS. UPDATE: I forgot to mention but this is not JUST for VDI, but works to physical target devices as well.

Here's a visual layout of how this works. Notice the light blue sections are possible locations for the write cache, which allows you to spread the remaining "write" workload across possible VMFS data stores, local to the PVS server itself, or even in the target device's RAM (which in our case is a virtual machine).

The purple looking color shows locations where you could store the virtual hard disks themselves (keep in mind that you want these on something highly available).

<img class="aligncenter" src="http://img855.imageshack.us/img855/707/citrixpvs.png" alt="" width="867" height="510" />