web-dev-qa-db-ja.com

名前ではなくプロセスID別のパフォーマンスカウンター?

同じアプリケーションの複数のインスタンスを追跡していて、両方のプロセスのメモリと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;
25
JeremyK

この回答 関連する質問が機能する可能性があります:

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

マシン全体のレジストリ変更を気にしない場合は、#1、#2などを追加するのではなく、 パフォーマンスカウンターインスタンス名にProcessName_ProcessIDの形式を使用するようにWindowsを構成する を使用できます。

DWORDを作成HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PerfProc\Performance\ProcessNameFormatとその値を2に設定します。

#1、#2などのフォームを使用する場合は、注意してください 特定のプロセスのインスタンス名はプロセスの存続期間中に変更される可能性があります

1
Seb Wills