Obtener el Rendimiento de Contador Nombre de la Instancia (w3wp#XX) de la ASP.NET proceso de trabajo de IDENTIFICACIÓN de

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

Pregunta

Me gustaría mostrar algunas estadísticas de la memoria (conjunto de trabajo, GCs, etc.) en una página web utilizando el .NET/Proceso de contadores de rendimiento.Por desgracia, si hay varios grupos de aplicaciones en el servidor, que se diferencian mediante un índice (#1, #2, etc.) pero no sé cómo hacer coincidir un IDENTIFICADOR de proceso (que tengo) para que #xx índice.Es allí una manera programática (de un ASP.NET la página web)?

¿Fue útil?

Solución

El primer golpe en Google:

Varios CLR contadores de rendimiento parecen que tienen nombres similares a "W3wp#1"

Cuando varios ASP.NET los procesos de trabajo se están ejecutando, Common Language Runtime (CLR) de los contadores de rendimiento se han nombres similares a "W3wp#1" o "W3sp#2"y así sucesivamente.Esto se solucione en .NET Framework 2.0 para incluir un contador llamado Proceso de IDENTIFICACIÓN en el .NET CLR rendimiento de la Memoria del objeto.Este contador muestra el IDENTIFICADOR de proceso para un ejemplo.Usted puede utilizar este contador para determinar el rendimiento de CLR contador que se asocia con un proceso.

También KB 281884:

De forma predeterminada, el Monitor de Rendimiento (Perfmon.msc) muestra varios los procesos que tienen el mismo nombre enumerar los procesos en la siguiente manera:

Proceso#1#2 Proceso#3

Monitor de rendimiento también puede mostrar estos procesos anexando el IDENTIFICADOR de proceso (PID) para el nombre en el siguiente manera:

Process_PID

Otros consejos

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

El ejemplo por chiru no funciona en un caso concreto, cuando se tienen dos versiones del mismo programa, el mismo nombre, y uno no es .neto y de iniciar el .net versión después de la non-.net versión.El .Net versión será nombrado applicaion#1, pero al acceder a la CLR perf contadores con este nombre, los nombres de instancia en el contador tiene el nombre sin el #1, por lo que obtener los fracasos.

Nick.

Aunque el cambio de la configuración del registro de aspecto bastante fácil, por desgracia la mayoría de nosotros no tenemos los derechos para hacerlo en el servidor (o no queremos tocar!).En ese caso, hay una pequeña solución.He blogueado acerca de este aquí.

Sé que ha sido contestado antes, pero sólo por el bien de completar código de trabajo estoy publicando esta solución.Tenga en cuenta que este código se basa en el método presentado por M4N en esta cadena:

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

También, si usted desea conseguir el total de la memoria de varias instancias de un mismo proceso, el uso de los métodos anteriores con el siguiente:

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;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top