How large should we make our PVS Accelerator cache? Too large and we waste resources. Too small and we lose the performance.
Let’s take a step back and recall our best practice for sizing the RAM on Provisioning Services. We would typically say allocate 2GB of RAM for each vDisk image the server provides. This simple recommendation gives the PVS server enough RAM to cache portions of the image in Windows system cache, which reduces local read IO. So for a PVS server delivering
- 1 image: we would allocate 2GB of RAM (plus 4GB more for the PVS server itself)
- 2 images: we would allocate 4GB of RAM (plus 4GB more for the PVS server itself)
- 4 images: we would allocate 8GB of RAM (plus 4GB more for the PVS server itself)
Let’s now focus on the XenServer portion of PVS Accelerator. If we use RAM as our PVS Accelerator cache, how many GB should we allocate?
I decided to test this out. I first set my PVS Accelerator cache to use 2GB of RAM.
Once configured, I booted and logged into a single VM. I then started a second VM on the same XenServer host.
Let’s first look at the Windows Server 2012R2 results:
When the first VM starts, the cache is empty so while the VM boots and a user logs in, the cache gets populated. When the second VM starts, it doesn’t increase the size of the cache because everything it needs to boot and log on a user has already been cached.
The expectation is that Windows 10 should show a similar behavior.
The difference between Windows 10 and Windows 2012R2 in regards to PVS Accelerator is the amount of cache consumed during bootup and logon. Windows 10 uses significantly more cache than Windows 2012R2.
Windows 2012R2 uses 40% while Windows 10 using 80%. So based on this, what should we allocate per XenServer host? 2GB? 1.5? 2.5?
First, remember that the boot process is weighted heavily on reads. The read/write ratio is close to the following:
- Boot: 80% Reads : 20% Writes
- Logon: 50% Reads : 50% Writes
- Steady State: 10% Reads : 90% Writes
Second, these graphs only show boot and logon. Users haven’t loaded any applications, which will initiate read operations, thus increasing the cache utilization.
Third, we have a limited supply of RAM. Our goal isn’t to eliminate all reads, it is to significantly reduce them.
Based on that, I’d start with the following and MONITOR:
- Windows 10: 2.5GB per image per host
- Windows 2012R2: 2GB per image per host
Remember, the key is “per image per host”.
The PVS Accelerator cache is host specific. If my XenServer host is supporting VMs using 4 different images, I need my PVS Accelerator cache to be large enough to cache enough of the read IO to be beneficial across all 4 images.
If our environment is large enough, we will want to look at segmenting our XenServer hosts into groups of servers that host a few images. That way we can reduce RAM allocation for PVS Accelerator.