This quick write-up isn’t anything advanced. Most of you out there know this, but some may still question it. We know there is a lot of documentation around PVS and Martin Zugec is updating a lot of this within Citrix Tech Zone. This is more of a confirmation that running a defrag on the VHDX on a merged vDisk is still needed on today’s PVS server vDisk. I reached out to some guys on Slack, as I knew I would get a solid answer fast. As you can see, it is still needed. Some rebuild images, and some just do what I do, which is the manual way (and which can be automated as well).
Some people today may think, is this needed when I have SSD/NVMe. Yes, it is, because we are talking about all the version changes, and it’s the actual VHDX itself. Think of how you shrink FSLogix VHDX/VHD. To me, it’s the same concept. The type of storage doesn’t matter because it's not at the OS layer. It’s about keeping the VHDX clean, optimized, and reducing any write cache bloats that will occur from the fragmentation on the VHDX as a whole. Now, some people may think, 'why do it the long and manual way? Automate it...' Yes, and I agree. However, I need to make sure the steps are solid, as I have destroyed things with Automation. It's really around me not fully testing the script, which is on me.
My advice is to first read this blog, as it will shed a lot of light on what I am talking about and much more.
"Defragment the vDisk before deploying the image and after major changes. Defragmenting the vDisk resulted in write cache savings of up to 30% or more during testing. This will impact any of you who use versioning as defragmenting a versioned vDisk is not recommended. Defragmenting a versioned vDisk will create excessively large versioned disks (.AVHD files). Run defragmentation after merging the vDisk versions. Note: Defragment the vDisk by mounting the .VHD on the PVS server and running manual defragmentation on it. This allows for a more robust defragmentation as the OS is not loaded. An additional 15% reduction in the write cache size was seen with this approach over standard defragmentation."
Here is a good script to defrag and shrink the VHDX:
Put the devices into Maintenance Mode in Studio. (No devices can be streaming off the vDisk to defrag the vDisk).
Make sure the connections say “0”:
You could copy the merged vDisk off and import it to do all the work if needed. Then, you would need to mess with the active streaming devices. And after you're complete, just update all the targets.
I didn’t do it this way, but it is an option.
Also, make sure you have no locks. As per my example above, XD7CALLTST has none.
Now, Merge the selected vDisk.
Select "Merged base -Last base + all updates from that base" and then select "Test" mode.
Wait for the percentage to complete 100%.
Once it’s merged, it will look like this:
Now click on the vDisk and click "Mount vDisk."
The icon will look like this on the vDisk:
Now open up File Explorer, and find the drive.
Analyze it to see if it’s needed.
Now defrag it.
Once completed, go back and select "Unmount."
The Icon will go back to the original look:
At this point, I boot up my Maintenance device to make sure things are good.
And you see its number: 3.
Once the machine boots up, you will see it in use in the “show vDisk Usage” box.
Now that the machine is up, log in, and make sure it’s good.
Now shut it down, and promote to PROD.
You will see the “show vDisk Usage” go to no devices.
Promote to Prod. Select "Immediately" or you can schedule it.
It will now look like this:
Now copy the new Vdisk #3 file to your other PVS servers to get this all green:
Copy from the server you did the work on. In my case, VS1PVS03.
Once the copy is completed, the replication will show green.
PVS Target check:
At this point, I booted it up and it was golden.
This can be automated: https://dennisspan.com/automate-vhd-offline-defrag-for-citrix-provisioning-server/
Total Breakdown of why it’s needed: