【问题标题】:Performance Counter by Process ID instead of name?按进程 ID 而不是名称的性能计数器?
【发布时间】:2012-02-25 06:58:51
【问题描述】:

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

如何确定 ProcessId 或将进程 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;

【问题讨论】:

  • 哇!两年前我完全遇到了同样的问题,当时我没有找到任何答案......现在也在等待答案;)
  • 谢谢本。不幸的是,我过去提出的问题很少见,也没有得到解决。我最终放弃了使用这些问题中的方法。
  • 肯,下面的答案成功了
  • 是的,但恕我直言,这并不是很简单。这实际上应该有效,但我期望更简单、更健壮的东西。据我所知,具有相同名称的不同可执行文件可能会出现一些问题(实际上不记得了)。
  • 我喜欢当我回去看到我的一个老问题并想知道,我到底为什么需要这些信息......然后一切都回到了我身边。编程的乐趣。

标签: c# performancecounter


【解决方案1】:

This answer 到一个相关问题可能有效:

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

【讨论】:

  • 为了提供信誉,这最初来自一个旧的 Ingo Rammer 博客(他的文章在我早期的 .NET 时代教会了我很多东西):weblogs.thinktecture.com/ingo/2004/06/…
  • 很高兴知道。我记下了我复制它的来源,这对我来说已经足够了。
  • 人们不得不想知道编程 API 是如何最终使用名称而不是标识符来识别进程的。这个答案适用于极端情况,如果多个实例正在运行,Process.GetCurrentProcess().ProcessName 返回一个完全无用的值。
  • 这个解决方案只有一个问题 - “内存流量”。因此,如果您在代码中频繁调用此方法,则会产生大量内存不足(PerfomanceCounter 类内部的字节数组)。
  • 它也非常消耗 CPU。
【解决方案2】:

如果您不介意机器范围的注册表更改,您可以configure Windows to use the form ProcessName_ProcessID for Perf Counter instance names,而不是附加 #1、#2 等:

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

如果您坚持使用#1、#2 等形式,请注意the instance name for a given process can change during the process' lifetime

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-11
    • 1970-01-01
    • 1970-01-01
    • 2017-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多