如何在多处理器/多核系统上获得准确的CPU使用率

时间:2011-05-10 20:01:08

标签: .net multicore performancecounter

或许这个问题更像是“我在这里做了什么明显的错误?”

我有一个测试应用程序除了查看自己的cpu使用情况外什么都不做。看起来有点像这样:

protected PerformanceTrace()
{
   Process currentProcess = Process.GetCurrentProcess();
   this.cpuCounter = new PerformanceCounter("Process", "% Processor Time", currentProcess.ProcessName);
   this.coreCount = Environment.ProcessorCount;
}

private int coreCount;
private DateTime lastCpuRead = DateTime.MinValue;
private float _cpuUsage;
private float CpuUsage
{
   get
   {
      if ((DateTime.Now - this.lastCpuRead) > TimeSpan.FromSeconds(1.0))
      {
         this._cpuUsage = this.cpuCounter.NextValue();
      }
      return this._cpuUsage / this.coreCount;
   }
}

非常频繁地读取CpuUsage属性。事情就是这样:

在我的机器上,Environment.ProcessorCount产生的值为2.但是,来自计数器的值通常高达800.我假设它与多核和超线程有关。我该怎么做才能获得我正在寻找的实际价值? (此特定过程的处理器总时间百分比)

1 个答案:

答案 0 :(得分:0)

您必须将性能计数器的数量除以CPU数量乘以每个CPU的实际线程数 - 每个核心一个,如果超线程是一个因素,则每个核心加一个。

在C#中,我不知道如何确定这一点。在本机代码中,您可以使用GetLogicalProcessorInformationits associated structure来计算逻辑处理器,包括共享核心的处理器。