When Task Manager tells you that overall CPU is 100%, you’d be led to believe that the system is working as hard as it can and has no additional processing capacity available. And when Task Manager reports a process’ CPU at 40%, intuitively you believe that the process is consuming 40% of the system’s total available CPU capacity. Those were reasonably accurate interpretations through Windows 7 and Windows Server 2008 R2. But with its redesign first introduced in Windows 8, Task Manager’s Processes and Performance tabs now rely on different metrics and present numbers that are misleading and that without additional context are completely meaningless.
Task Manager’s changes were intended to accommodate advances in chip technology. It is relatively straightforward to determine a processor’s utilization: how much time during a given interval that it spends busy vs. idle (*). Back when CPUs always used to operate at a fixed frequency, simple arithmetic told you how much work a CPU had performed. Modern CPUs offer improvements in energy efficiency, such as operating at reduced frequencies or shutting down completely during periods of lower demand, and running the processor core faster than the marked frequency during periods of higher demand. Therefore, a CPU’s utilization by itself no longer tells you as much as it used to about how much processing is being performed.
(*) In earlier versions of Windows, these were rough approximations. The accuracy of the available metrics improved from Windows XP to Vista to Win7, and their corresponding Server OSes.
To try to account for these complexities, Windows introduced the concept of processor utility along with performance counters that measure that utility. Windows defines a processor’s utility as the amount of work it completes as a percentage of the amount of work it could complete if it were running continually at its nominal performance level, and never enabling an enhanced performance mode. When a processor enables an enhanced performance mode — a regular occurrence — its utility percentage can easily exceed 100%. The possible upper bound is indeterminate and depends on a variety of factors that Windows cannot directly measure. Task Manager’s Processes and Performance tabs now use the “% Processor Utility” counter as the basis for their CPU numbers, rather than the “% Processor Time” counter Task Manager had relied upon and that is still used by Task Manager’s Details tab and by Sysinternals Process Explorer.
As a result, because dynamically-adjustable processors automatically enter an enhanced mode when under load, Task Manager’s CPU % for a process that is actively executing code will generally be significantly larger than its processor time. But because that number is placed on a scale that is capped at 100%, Task Manager makes it appear that the process is taking up more of the system’s computing capacity than it actually is. For a while, Task Manager itself would report overall CPU usage greater than 100%. Because that’s counterintuitive even to people who understand the concept of “utility,” Task Manager now caps the numbers it reports at 100%. That ends up further distorting what it reports. I’ll illustrate.
I’ve built a test utility that enables me to spin up an arbitrary number of CPU-bound (i.e., always busy) threads, and to set each thread’s processor affinity such that each thread runs on a separate processor. I’ve got a 12-processor system, so I will spin up six threads, each of which will run only on one of the first six processors.
In the screenshots below, Sysinternals Process Explorer and Task Manager’s Performance tab confirm that exactly half of the system’s twelve processors are fully utilized, and that the other processors are almost entirely idle. Note, though, that Process Explorer reports total CPU% at just over 50% while Task Manager reports 83%. Perhaps that should be 83% on a scale of 166%. But what does that even mean? “Percent” literally means “per hundred.” Well, Task Manager’s Performance tab also shows that the processors’ Base speed is 2.40 GHz but during this measurement their Speed is 3.94 GHz. It turns out that 83% times 2.40/3.94 is 50.56%, which is close to the actual utilization. 83 “percent” in this case is actually on a temporary scale of 164.17 (100% * 3.94/2.40). That explains how the numbers turn out that way, but doesn’t make them intuitive or meaningful.
Task Manager’s Processes tab reports that my test program is consuming 82.8%, almost all of the 83% total utilization it’s reporting. At the same moment, Task Manager’s Details tab says my program is consuming 50% of the CPU. The Details tab’s figures, based on “% Processor Time” rather than on “% Processor Utility,” make more intuitive sense than the Processes tab’s numbers.
Let’s take it up a notch and run eight CPU-bound threads, maxing out two-thirds of the processors while leaving the others idle. Task Manager’s Performance tab reports 100% CPU utilization, implying that the system is running at maximum capacity, while at the same time both it and Process Explorer clearly show that four of the twelve processors are sitting idle and available for work. Task Manager’s Processes tab says that the test program is consuming 100% of the CPU, while the Details tab reports that it’s consuming only 67% — two thirds of the available processing power.
The bottom line is that Task Manager’s CPU numbers can be misleading, counterintuitive, and ultimately meaningless. “% Processor Utility” is an arcane measurement at best and does not belong in an end-user diagnostic utility such as Task Manager.
See my colleague Jeff Stokes’ take on this issue here.