을 얻을 성능을 카운터는 인스턴스 이름(w3wp#XX)서 ASP.NET 작업자 프로세스 ID

StackOverflow https://stackoverflow.com/questions/113930

문제

나는 일부를 표시 메모리 통계(작업 집합,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;
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top