vCenter's default host CPU performance chart uses the cpu.usage.average counter. This counter overstates actual host capacity consumption due to two factors:
Turbo Boost frequency scaling
The cpu.usage counter is frequency-based. It measures CPU time in timer cycles rather than wall-clock time. When processor cores run above their base frequency due to Turbo Boost, the counter registers more cycles per second than the base frequency accounts for. This inflates the reported value even when logical CPU threads are idle.
For example, on a host with a 2.80 GHz base frequency and 3.50 GHz turbo, a fully busy core reports approximately 125% usage rather than 100%. This inflation scales with the degree of turbo activity across all cores. In practice, this factor alone can add 4-12% or more to the reported host CPU usage value.
Hyperthreading accounting
The cpu.usage counter at the ESXi host level does not properly distinguish between physical cores and logical threads. It rolls up logical CPU busy time in a way that reflects physical core saturation rather than logical thread availability. On hosts with Hyperthreading enabled, this further inflates the reported value.
The combined effect of these two factors can cause cpu.usage to report 75-85% or higher while actual thread-level scheduling demand is only 38-55%. Both numbers are valid measurements, but they measure different things. Only the time-based counter accurately reflects remaining host scheduling capacity.
A different counter, cpu.utilization, measures time-based scheduling demand on logical CPUs. It is not affected by Turbo Boost frequency and accounts for Hyperthreading correctly. This counter answers the capacity question: "What percentage of my logical CPU threads are busy?"
The cpu.utilization counter requires Statistics Level 2 in vCenter. The default Statistics Level 1 only collects cpu.usage. This means most vCenter environments show the counter that overstates capacity consumption by default and do not show the one that accurately reflects it.
Use cpu.utilization (%) instead of cpu.usage (%) for host CPU capacity assessment. In esxtop, the equivalent counter is % Processor Time (not % Used).
The cpu.utilization counter is time-based and Hyperthreading-aware. It is not inflated by Turbo Boost. When this counter approaches 100%, the host is running out of scheduling capacity.
Plan capacity against the processor's base frequency, not turbo. Turbo Boost availability depends on thermal conditions, power budget, and the number of active cores. As a host gets busier, turbo diminishes. The cpu.utilization counter handles this correctly because it does not factor in frequency.
Capacity thresholds:
| Metric | Source | Threshold |
|---|---|---|
| Host CPU Utilization (%) | cpu.utilization in vCenter or % Processor Time in esxtop |
Sustained above 70-80% warrants attention |
| VM CPU Ready (%) | cpu.ready in vCenter or %RDY in esxtop (per vCPU) |
Above 5% = warning; above 10% = action needed |
| VM CPU CoStop (%) | cpu.costop in vCenter or %CSTP in esxtop |
Any sustained value above 0% warrants review |
The cpu.utilization counter is not collected at the default Statistics Level 1. Choose one of the following options to make it available:
Option A: Raise the statistics collection level
This enables all Level 2 counters. Database storage requirements increase modestly. Levels 1 and 2 are both suitable for normal production use.
Option B: Remap the single counter to Level 1
Use the LevelMappingUtility PowerCLI module to map the cpu.utilization counter to Level 1 without raising the full statistics level. This approach avoids the additional database load of a full Level 2 collection.
See Persisting vSphere metrics without increasing statistic levels for instructions.
After enabling the counter, build a custom chart:
You can display Utilization alongside Usage to see both values. The gap between them on the same host at the same time is a rough indicator of how much Turbo Boost and Hyperthreading accounting inflate the default chart.
VMware Aria Operations (formerly vRealize Operations) capacity and contention dashboards already account for Hyperthreading and frequency effects. The CPU Contention (%) metric in Aria Operations 8.18 and later is designed for this scenario.
For versions before 8.18, see VM CPU Contention metric change after upgrade to Aria Operations 8.18.x for details on how the contention calculation changed.
To verify host capacity directly from the ESXi command line:
esxtop.%Processor Time in the host summary line. This is the time-based capacity metric.%Used. The gap between them reflects Turbo Boost and Hyperthreading inflation.To see the degree of Turbo Boost per physical core:
%A/MPERF field.Note: The %A/MPERF counter is only valid when the core is in C0 (active running) state. See Testing CPU max Turbo Boost frequency in ESXi for details.
High utilization alone does not confirm a capacity problem. Contention metrics confirm whether VMs are actually affected:
%Ready measures the time a VM was ready to run but had to wait for a physical CPU. This is the primary indicator that a host is running out of CPU capacity. Values above 5% per vCPU indicate a real impact on VM performance.%CoStop measures the time a multi-vCPU VM waited because the scheduler could not schedule all of its vCPUs together. Elevated %CoStop often indicates the VM has more vCPUs than its workload needs.If cpu.utilization is high but %Ready and %CoStop are low across all VMs, the host still has effective capacity and VMs are not being impacted.
For more information on using %Ready, %CoStop, %Wait, and %Run together to assess VM CPU health, see Troubleshooting a virtual machine that has stopped responding: VMM and Guest CPU usage comparison.