Счетчик производительности по идентификатору процесса вместо имени? - PullRequest
25 голосов
/ 02 февраля 2012

Я отслеживаю несколько экземпляров одного и того же приложения, и мне нужно получить память и использование процессора обоими процессами.Тем не менее, я не могу найти способ использовать счетчик производительности и знать, какой результат для какого процесса.Я видел, что могу добавить # 1 и так далее в конец имени, чтобы получить результаты для каждого, но это не говорит мне, какой из них предназначен для какого процесса.

Как определить идентификатор процесса или передать идентификатор процесса счетчику, чтобы получить результат для каждого процесса с одинаковым именем?

PerformanceCounterCPU.CategoryName = "Process";
PerformanceCounterCPU.CounterName = "% Processor Time";
PerformanceCounterCPU.InstanceName = proc.ProcessHandle.ProcessName;

PerformanceCounterMemory.CategoryName = "Process";
PerformanceCounterMemory.CounterName = "Working Set - Private";
PerformanceCounterMemory.InstanceName = proc.ProcessHandle.ProcessName;

Ответы [ 2 ]

30 голосов
/ 02 февраля 2012

Этот ответ на связанный вопрос может работать:

private static string GetProcessInstanceName(int pid)
{
  PerformanceCounterCategory cat = new PerformanceCounterCategory("Process");

  string[] instances = cat.GetInstanceNames();
  foreach (string instance in instances)
  {

     using (PerformanceCounter cnt = new PerformanceCounter("Process",  
          "ID Process", instance, true))
     {
        int val = (int) cnt.RawValue;
        if (val == pid)
        {
           return instance;
        }
     }
  }
  throw new Exception("Could not find performance counter " + 
      "instance name for current process. This is truly strange ...");
}
1 голос
/ 19 июля 2017

Если вы не возражаете против изменения реестра в масштабе всей машины, вы можете настроить Windows на использование формы ProcessName_ProcessID для имен экземпляров Perf Counter вместо добавления # 1, # 2 и т. Д .:

Создайте DWORD HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PerfProc\Performance\ProcessNameFormat и установите его значение равным 2.

Если вы придерживаетесь формы # 1, # 2 и т. Д., Помните, что имя экземпляра для данного процесса может изменитьза время жизни процесса !

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