User:Vladislav
Programs that are aware of hyperthreading are able to distinguish between a physical core and a logical (virtual) core, and allocate resources accordingly.
Hyperthreading decreases the cost of context-switching by allowing the states of two processes to be stored at any given time, instead of just one state at a time. Context-switching is typically considered to be very expensive, because you have to load the entire state of a process into the CPU. This means that if you have a CPU-intensive process running, the hyperthreaded CPU can frequently switch between that process and others without incurring much of a performance hit.
The advantage of running virtual servers is that you can create a large pool of resources which can be allocated to different servers on the fly, as needed. This includes reallocating CPU cores and balancing the load across all the available cores. If the hypervisor doesn't know the difference between a physical core and a logical core, then you're right--some physical cores may sit idle while others are pegged at 100% CPU utilization while both of their logical cores are competing for CPU time. However, if the hypervisor is able to tell the difference between physical and logical cores, it will try to balance the CPU load across the physical CPUs before allocating multiple processes to two logical cores that belong to the same physical core.