按进程ID而不是名称的性能计数器

本文关键字:性能计数器 进程 ID | 更新日期: 2023-09-27 18:22:11

我正在跟踪同一应用程序的多个实例,需要获取两个进程的内存和cpu使用情况。然而,我似乎无法找到使用性能计数器的方法,也不知道哪个结果适用于哪个进程。我已经看到,我可以将#1等附加到名称的末尾,以获得每个名称的结果,但这并不能告诉我哪一个用于哪个进程。

如何确定进程ID或将进程ID传递给计数器,以获得每个具有相同名称的进程的结果?

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;

按进程ID而不是名称的性能计数器

这个相关问题的答案可能有效:

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 ...");
}

如果您不介意在计算机范围内更改注册表,您可以将Windows配置为使用ProcessName_ProcessID形式作为Perf Counter实例名称,而不是附加#1、#2等:

创建DWORD HKEY_LOCAL_MACHINE'SYSTEM'CurrentControlSet'Services'PerfProc'Performance'ProcessNameFormat并将其值设置为2。

如果您坚持使用#1、#2等形式,请注意给定进程的实例名称在进程的生存期内可能会更改!