Как получить точное использование процессора для процесса в многопроцессорной / многоядерной системе - PullRequest
5 голосов
/ 11 мая 2011

Или, может быть, вопрос больше похож на «Что я здесь делаю явно неправильно?»

У меня есть тестовое приложение, которое ничего не делает, кроме как наблюдает за использованием своего собственного процессора. Это выглядит примерно так:

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 голосов
/ 11 мая 2011

Вы правы - вам нужно разделить число от счетчиков производительности на количество процессоров, умноженное на количество реальных потоков на процессор - один на ядро, плюс один на ядро, если коэффициент гиперпоточности является фактором.

В C # я не знаю, как это определить. В нативном коде вы можете использовать GetLogicalProcessorInformation и связанную с ним структуру для подсчета логических процессоров, включая те, которые имеют общее ядро.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...