CPU 使用性能计数器在任务管理器中的用法

CPU Usage in Task Manager using Performance Counters

[我的尝试]

已经通过

  1. How to get the CPU Usage in C#? 但是处理器的“_Total”实例会给我 CPU 的总消耗量,而不是特定的应用程序或 'process'

  2. In a C# Program, I am trying to get the CPU usage percentage of the application but it always shows 100

  3. What exactly is CPU Time in task manager? ,对其进行了解释,但没有说明如何检索该值。

引用后http://social.technet.microsoft.com/wiki/contents/articles/12984.understanding-processor-processor-time-and-process-processor-time.aspx

我明白了

TotalProcessorTimeCounter = new PerformanceCounter("Process", "% Processor Time", processName);

的基线为 (No.of 逻辑 CPU*100) 基本上,这不会给我超过 CPU 消耗的 100% 的比例。

尝试深入研究任务管理器,发现任务管理器->处理器-> CPU 使用量为 100。

Processor\% Processor Time 对象不将进程名称作为输入。它只有“_Total”作为输入。

[问题]

对于多核系统的特定进程,如何使用规模超过 100 的性能计数器获取此数据(CPU 消耗)?

这为我提供了您在任务管理器(在 Details 选项卡中)中获得的确切数字,这是您想要的吗?

// Declare the counter somewhere
var process_cpu = new PerformanceCounter(
                                   "Process", 
                                   "% Processor Time", 
                                   Process.GetCurrentProcess().ProcessName
                                        );
// Read periodically
var processUsage = process_cpu.NextValue() / Environment.ProcessorCount;

看完这个性能计数器文档后https://social.technet.microsoft.com/wiki/contents/articles/12984.understanding-processor-processor-time-and-process-processor-time.aspx我意识到得到这个值的正确方法实际上是取100减去所有处理器的空闲时间。

% Processor Time is the percentage of elapsed time that the processor spends to execute a non-Idle thread.

var allIdle = new PerformanceCounter(
    "Processor", 
    "% Idle Time", 
    "_Total"
);

int cpu = 100 - allIdle;

这给出的值与任务管理器显示的值非常接近,可能只是由于四舍五入或轮询计数器的特定时间而在某些点上有所不同。

如果你使用这个,你可以得到与任务管理器相同的结果:

cpuCounter = new PerformanceCounter(
        "Processor Information",
        "% Processor Utility",
        "_Total",
        true
    );