パフォーマンスカウンタでは「インスタンス名」を指定して、各種情報を取得します。ところがこのインスタンス名はプロセスが複数個起動していた場合、"hoge","hoge #1","hoge #2"となってしまい、非常に都合が悪い。IDE内のサーバエクスプローラで"hoge #1"のインスタンスを貼り付けても、それが測定したいインスタンスかどうかはわからないのです。さらに、プロセスを再起動してしまうと、インスタンスの順序も入れ替わります。
特にサーバのパフォーマンス測定をする場合、PID(=プロセスID)で指定したい場合があります。必要に迫られて、PIDからPerformanceCounterクラスに渡す、インスタンス名を取得する関数を書いてみました。こんな感じ。"servername"のところは取得したいコンピュータ名に置き換えてください。やっぱなおした。
public string LookupInstanceNamefromPID(long pid, string strServer) { string strReturn = ""; PerformanceCounterCategory oCategoly = new PerformanceCounterCategory("Process", strServer); if(oCategoly.CounterExists("ID Process") == true) { string[] strInstances = oCategoly.GetInstanceNames(); foreach(string strInstance in strInstances) { using(PerformanceCounter oPerfCounter = new PerformanceCounter("Process", "ID Process", strInstance, strServer)) { if(pid == oPerfCounter.RawValue){ strReturn = strInstance; break; } } } } return strReturn; }
Processカテゴリの"ID Process"というカウンタがそのままPIDになっています。これ、本来はWindows APIのPdhGetFormattedCounterValue()を使うんでしょうが、PerformanceCounterで"ID Process"のRawValueを取得すると、これがそのままPIDになっているので、特に細工なしで使っています。