Frage

Ich möchte einige Speicherstatistik angezeigt werden (Arbeitssatz, GCs etc.) auf einer Webseite, die .NET / Prozessleistungsindikatoren verwenden. wenn es leider mehrere Anwendungspools auf dem Server sind, werden sie mit einem Index (# 1, # 2 etc.) differenziert, aber ich weiß nicht, wie ein Prozess-ID übereinstimmen (was ich habe) zu diesem #xx Index. Gibt es eine programmatische Art und Weise (von einer ASP.NET Web-Seite)?

War es hilfreich?

Lösung

Der erste Treffer bei Google:

Mehrere CLR-Leistungsindikatoren angezeigt, die Namen haben „W3wp ähneln # 1"

  

Wenn mehrere ASP.NET Worker-Prozesse   Common Language Runtime ausgeführt werden,   (CLR) Leistungsindikatoren haben   Namen „W3wp # 1“ ähneln oder   "W3sp # 2" und so weiter. Dies wurde behoben   in .NET Framework 2.0 enthält eine   Zähler genannt Prozess-ID in der NET   CLR-Speicher-Leistungsobjekt. Diese   Zähler zeigen den Prozeß-ID für ein   Beispiel. Sie können diese Zähler verwenden, um   bestimmen den CLR-Leistungsindikatoren   das mit einem Prozess verbunden ist.

Auch KB 281884 :

  

In der Standardeinstellung Performance Monitor   (Perfmon.msc) zeigt mehr   Prozesse, die den gleichen Namen haben durch   Aufzählen der Prozesse in der   wie folgt:

     

Prozess # 1 Verfahren # 2 Prozess # 3

     

Performance Monitor kann auch angezeigt werden   diese Prozesse durch die Anhänge   Prozess-ID (PID) auf den Namen in der   wie folgt:

     

Process_PID

Andere Tipps

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

Das Beispiel von chiru funktioniert nicht in einem konkreten Fall - wenn Sie zwei Versionen des gleichen Programms haben, das gleiche genannt, und man ist nicht .net und starten Sie die .net-Version nach der non-.net Version. Die .NET-Version wird applicaion # 1 genannt werden, aber wenn Sie die CLR perf Zähler mit diesen Namen zugreifen, auf dem Tresen die Instanznamen haben den Namen withouth die # 1, so dass Sie Ausfälle erhalten.

Nick.

Auch wenn die Registrierungseinstellungen zu ändern schauen ganz einfach, leider die meisten von uns nicht die Rechte haben, um es auf dem Server zu tun (oder wir nicht wollen, es zu berühren!). In diesem Fall gibt es eine kleine Abhilfe. Ich habe über dieses gebloggt hier .

Ich weiß es vorher beantwortet wurde, aber nur im Interesse des gesamten Arbeits Code Ich poste diese Lösung. Bitte beachten Sie diesen Code basiert auf der Methode von M4N in dieser Kette vorgelegt:

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

Auch wenn Sie den Gesamtspeicher von mehreren Instanzen des gleichen Prozesses die obigen Verfahren mit dem folgenden benutzen Sie wollen:

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;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top