A number of people have asked me about the fact that the CPU usage reported on the Hyper-V Management console does not match the CPU usage reported under task manager. The answer to this is fairly complicated – so I thought it would make a good blog post. To set the stage I need a diagram:
The first part of the answer is that when you run Task Manager in the parent partition (remembering that it is "just another partition on the system") it knows nothing about CPU usage that is happening in the hypervisor or in child partitions. Indeed – I have had systems where the CPU usage was so high that the entire system was starting to get unresponsive – but when I opened task manager in the parent partition it told me that the CPU load was only 30% (which was correct, as the CPU load in the parent partition was only 30%).
The second part of the answer is that it is actually quite hard to come up with a true number that indicates how much CPU is being used by a virtual machine. The reason for this is that virtual machine CPU usage happens in many places:
- The first, and most obvious, place that CPU gets used is inside the child partition. This is the information that is displayed in the Hyper-V manager. To get this outside of the Hyper-V Manager open up "perfmon", go to the Performance Monitor and look at the % Guest Run Time counter under the Hyper-V Hypervisor Virtual Processor section.
- The next place that CPU is used is actually the time spent in the hypervisor handling intercepts, switching contexts, etc… To get this information open up "perfmon", go to the Performance Monitor and look at the % Hypervisor Run Time counter under the Hyper-V Hypervisor Virtual Processor section.
- The final place that CPU gets used is in the worker process in the parent partition. Each running virtual machine has a worker process in the parent partition. This is where code gets run for operations like saving state or snapshotting. It is also where code gets runs for our emulated devices.