I see there is a great deal of discussion about ready time within the guest.. Of course this is where the users will feel it and us Admins see it via performance monitoring.
A very basic fact.. The more cores assigned to the guest the higher readytime values you will see. Using esxtop is a far better way to evaluate if you really do have ready time issues. Via esxtop any readytime value with double digits is of concern. Any value over 20 is likely to impact the users.
*****A little more on the guest before discussion things from a host/hardware perspective.***
If you look at why visualization originally gained popularity, it was because we all had hundreds of expensive servers which were utilizing 2-20% of their resources. So we would pile as many systems onto an ESX server as we could, ready time was acceptable as the servers were not forward facing (as in customers were not on the console) a few ms of latency was acceptable for a file to be retreaved or written, a DB to be accessed etc..
We all pushed back at the idea of virtualising servers which had heavy resource requirements. This was somewhat a very sensible thing..
Times have moved on, we now have high percentages of our servers virtualised. To make the environment easier to manage if we structure as many servers in s similar model so we virtualise many servers which really are not ideally suited for virtualisation.
Database servers are the obvious one to mention, but we do it anyway because it gives us centralized management and simplistic DR, backup etc..
Citrix is another which is not ideal for virtualisation.. But we do it. Because it's forward facing a few ms of latency is felt by the user and seen as a jerky mouse movement.
We have built and manage a large Citrix XenApp environment. We have found some best practices to follow.
Do not over commit resources.
Look at your physical CPU to allocated CPU rates. Do not exceed 1 to 1 where XenApp is concerned. VMWare in fact advise preallocate/reserving ALL guest resources..
More servers with less vCPU. The most effective server would have 1 vCPU but that's not practical.. Limit XenApp to 4 vCPU's. if you need more capacity build another XenApp server.
Look at your application base. If you have ugly apps which are resource pigs push them to yet another XenApp server. eg. one user opens an application which loads a 3GB jvm all 19 others suffer.. WEB pages which are flash intensive can grab loads of CPU.. Client side rendering or GRID off load cards are the only solution here. or just block it at the firewall or of course degrade it.
If you have slow disk subsystems you could use RAM caching to speed up disk activity..
I would ask some more questions about the environement from a hypervisor perspective.
What version of ESXi are you running
Which build is this based on eg. ESXi 5.0 u2 HP release or VMWare release.
What are your firmware levels baselined at on the chassis and blade.
What type of storage are you using and over what medium are you connecting.
cheers