VMware App Volumes on Nutanix Best Practices with #UberAgent

Well I am happy to say there really isn’t a lot of knowledge needed to wrap up the best practices for running App Volumes on Nutanix.

In general create 1 container for all of your App Stacks and turn on inline dedupe(Performance Tier). Could you put the App Stacks on the same volume as your desktops? Sure but then you can’t inline dedupe with no performance penalty. By turning inline dedupe on any time you go to create or update your App Stacks your applications will get fingerprinted. When the App Stack gets attached to your desktop it will be a read heavy workload. Any reads that have fingerprints associated with them will go into the content cache which is deduped on read. Your applications have a great chance to be served out of RAM instead of SSD or HDD! The RAM happens to be sitting right beside the CPU so you’ll save some CPU cycles to boot from the Nutanix Controller Virtual Machine(CVM). With the use of Nutanix Shadow Clones all of the caching can be done locally regardless of were the AppStack vmdk is being hosted.

Because you don’t have to keep inline dedupe turned on you can turn on inline compression for desktops. VAAI and inline compression will save a ton space if your plan on doing full clone desktops. The space saved will allow you not to buy storage heavy nodes and save on power and cooling too. VAAI can save around 20X of space and inline compression can save over 2X plus performance improvements if you’re moving big files around on the desktops.

Inline Compression Savings

Inline Compression Savings

I was running Uber Agent and Splunk to grab some results when I was working on Horizon DaaS thanks to Helge Klein . There is a ton of information that the Uber Agent can grab for you.

Here are the log on times for 300 users in a 48 minute window generated with LoginVSI and inline compression turned on.

UberAgent - Logon Times

UberAgent – Logon Times

I found attaching an App Stack to a desktop added just under 2s to the logon time compared to applications that were nativity installed. Pretty small penalty if you consider the consequence of updating your apps with View Composer or traditional methods.

One graph that I thought was super interesting that was generated UberAgent was the Total Start IO. The total number of IOs generated from the applications starting up.

UberAgent - showing how IOs are used starting applications

UberAgent – showing how IOs are used starting applications

Imagine if you could get all of those IOs severed from a dedupe RAM cache? 🙂

The below graph is taken from the Prism UI. It shows in blue the hit rate in the content cache which is over 97% and the green line shows the hits.

App Stacks being delivered with RAM

App Stacks being delivered with RAM

The below picture shows the physical savings with inline dedupe turned on from a performance perspective. You can also manually fingerprint your golden image since it won’t be changing much and also enjoy the benefits of inline dedupe without the overhead.

Inline dedupe saving  from the applications and fingerprinting the golden image.

Inline dedupe saving from the applications and fingerprinting the golden image.

The next graph is just the total number of IOPS. Why? Because everyone loves IOPS! Just over 4,500 IOPS. I turned off video during the test so more time could be spent launching applications.


To recap, 1 container for all of your applications and turn on inline deupe => done.


  1. Hi Dwayne, would you still recommend a new container for app stacks if my ntnx cluster currently has both an inline dedupe container for full clone desktops and a non dedupe container for linked clone pools? Also can ntnx backup / replicate the app stack vmdk’s without them being attached to a VM?

    • dlessner says:

      Yes I would still have a separate container for AppStacks. You can protect individual files with Nutanix DR and you can also protect a whole container and that’s what I would recommend. You want to keep inline dedupe for performance turned on the AppStack container.

  2. How about enabling “Erasure Coding”?

Speak Your Mind