을 얻을 성능을 카운터는 인스턴스 이름(w3wp#XX)서 ASP.NET 작업자 프로세스 ID
-
02-07-2019 - |
문제
나는 일부를 표시 메모리 통계(작업 집합,GCs etc.) 에 사용하는 웹 페이지.물/프로세스 성능을 카운터입니다.불행하게도,여러 개 있는 경우 응용 프로그램 풀에서는 서버,그들은 차별화된 인덱스를 사용하여(#1,#2 등) 하지만 내가 알지 못하는 방법과 일치하는 프로세스 ID(나)해당#xx 인덱스입니다.이 있는 프로그래밍 방식(서 ASP.NET 웹 페이지)?
해결책
첫 번째서 구글:
여러 CLR 성과 카운터 표시되는 이름의 닮은"W3wp#1"
할 때 여러 ASP.NET 작업자 프로세스 실행되는,일반적인 언어 런타임 (CLR)성능을 카운터는 것입 이름과 유사한"W3wp#1"또는 "W3sp#2"하고있다.이는 해결 습니다.NET Framework2.0 을 포함 카운터 이라는 프로세스 ID.NET CLR 메모리 성능을 개체입니다.이 카운터 전시 프로세스 ID 한 인스턴스입니다.당신이 사용할 수 있는 이 카운터 결정 CLR 성과 카운터 과 연결된 프로세스입니다.
도 KB281884:
기본적으로,성능 모니터링 (성.msc)여러 표시 프로세스는 같은 이름을 가진 를 열거하는 프로세스 다음 방법:
공정#1 공정#2 프로세스#3
성능 모니터를 표시할 수도 있습니다 이러한 프로세스에 추가하여 프로세스 ID(PID)에 이름 다음 방법:
Process_PID
다른 팁
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 ...");
}
예여 chiru 에서 작동하지 않는 특정한 경우-당신은 두 가지 버전의 동일한 프로그램으로,동일한 이름이며,하나하지 않습니다.net 를 시작하고.net 버전 후 non-.net 버전입니다.니다.Net 버전이라는 것 으로 1 위이지만 액세스할 때 CLR perf 카운터를 사용하여 이름,인스턴스 이름은 카운터에서 이름 withouth#1 개,그래서 당신은 실패입니다.
닉.
도 변경의 레지스트리 설정을 보면 매우 쉬운,불행히도 대부분의 우리에게 필요 없는 권한이 그것을 서버에서(또는 우리가 원하는 터치!).에는 케이스,거기 작은 해결 방법입니다.나는 이에 대한 블로그 기.
내가 알고있는 대답하기 전에,하지만 단지의 이익을 위해 완전한 작동 코드시 이 솔루션입니다.이 코드는 방법에 따라 제출하여 M4N 에서 이러 체인:
public static long GetProcessPrivateWorkingSet64Size(int process_id)
{
long process_size = 0;
Process process = Process.GetProcessById(process_id);
if (process == null) return process_size;
string instanceName = GetProcessInstanceName(process.Id);
var counter = new PerformanceCounter("Process", "Working Set - Private", instanceName, true);
process_size = Convert.ToInt32(counter.NextValue()) / 1024;
return process_size;
}
public static string GetProcessInstanceName(int process_id)
{
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 == process_id)
return instance;
}
}
throw new Exception("Could not find performance counter ");
}
또한,당신이 얻고 싶은 경우에는 총 메모리의 인스턴스가 여러 개의 동일한 프로세스를 사용하여 위의 방법으로 다음 중 하나:
public static long GetPrivateWorkingSetForAllProcesses(string ProcessName)
{
long totalMem = 0;
Process[] process = Process.GetProcessesByName(ProcessName);
foreach (Process proc in process)
{
long memsize = GetProcessPrivateWorkingSet64Size(proc.Id);
totalMem += memsize;
}
return totalMem;
}