【问题标题】:How to get accurate CPU usage for a process on a multi-processor / multi-core system如何在多处理器/多核系统上获取进程的准确 CPU 使用率
【发布时间】:2011-08-22 18:45:43
【问题描述】:

或者问题更像是“我在这里做错了什么?”

我有一个测试应用程序,它只观察自己的 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。我假设它与多核和超线程有关。我能做些什么来获得我正在寻找的实际价值? (此特定进程的总处理器时间百分比)

【问题讨论】:

    标签: .net multicore performancecounter


    【解决方案1】:

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

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

    【讨论】:

    • 我就是这么想的。现在如何确定每个 CPU 的线程数?
    • 或者说核心数。
    • 谢谢!也许我可以弄清楚如何让它为我工作。
    • 或者,您可以使用性能计数器隐式地为您提供逻辑处理器实例的计数。
    • 除非我记错了,Environment.ProcessorCount 提供的是逻辑处理器的数量,而不是物理处理器;这就是为什么我对我所看到的结果感到惊讶。
    猜你喜欢
    • 1970-01-01
    • 2019-05-19
    • 1970-01-01
    • 1970-01-01
    • 2012-08-26
    • 2013-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多