C#.NET / Prozessanalyse

Prozessanalyse

Prozessanalyse

➪ Eine häufige Aufgabe ist die Analyse laufender Prozesse. Hier bieten diverse Klassen hilfreiche Unterstützung.

Auf dieser Seite:

pic/cs_Arbeitsspeicher_Analyse.png

Von Interesse ist die Auswertung im Rahmen der Prozessanalyse. Der erste Schritt ist hier die Klasse System.Diagnostics.Process, die über ihre static-Methode GetProcesses() ein Array aller auf dem lokalen Computer ausgeführten Prozesse bereitstellt. Über Id kann die jeweilige Prozess-Id abgerufen werden.


foreach(Process p in Process.GetProcesses())
{
    Console.WriteLine($"Prozess-ID: {p.Id}");
}

Möchten Sie nur den aktuellen Prozess ansprechen, so kommen Sie mit GetCurrentProcess() ans Ziel.


Console.WriteLine(Process.GetCurrentProcess().Id);

Das Gegenstück in WMI sieht so aus: select * from Win32_Process gibt Ihnen die Liste aller Prozesse zurück. Über die Properties der einzelnen ManagementObject mo kriegen Sie die gewünschte ProcessId heraus.


System.Management.ManagementObjectSearcher mc;
mc = new System.Management.ManagementObjectSearcher();
mc.Query.QueryString = "select * from Win32_Process";
foreach (System.Management.ManagementObject mo in mc.Get())
{
    Console.WriteLine(mo.Properties["ProcessId"].Value);                
}

Nun können Sie beides miteinander verbinden.


int pid = Process.GetCurrentProcess().Id;
mc.Query.QueryString = String.Format
                      ("select * from Win32_Process 
                        where ProcessId={0}", pid);
foreach (System.Management.ManagementObject mo in mc.Get())
{
    Console.WriteLine(mo.Properties["ProcessId"].Value);
}

Zur vebesserten Übersicht lohnt es sich, sämtliche Properties und deren Werte in einer Schleife zu durchlaufen.


foreach (System.Management.ManagementObject mo in mc.Get())
{
    Console.WriteLine(mo.Properties["ProcessId"].Value);
    foreach (System.Management.PropertyData o in mo.Properties)
    {
        Console.WriteLine("\t{0}\t{1}", o.Name, o.Value);                    
    }
}

Hier finden Sie einige Properties, deren Werte für die Prozessanalyse interessant sein können.

Analyse mit System.Diagnostics.Process

Erste Ergebnisse erhalten Sie über die Auswertung einiger spezieller Properties der Process-Klasse.


Process p = Process.GetCurrentProcess();
Console.WriteLine($"p.WorkingSet64           : {p.WorkingSet64,15:N0}");
Console.WriteLine($"p.PrivateMemorySize64    : {p.PrivateMemorySize64,15:N0}");
Console.WriteLine($"p.VirtualMemorySize64    : {p.VirtualMemorySize64,15:N0}");
Console.WriteLine($"p.PeakVirtualMemorySize64: {p.PeakVirtualMemorySize64,15:N0}");
Console.WriteLine($"p.UserProcessorTime.Ticks: {p.UserProcessorTime.Ticks,15:N0}");

Möchten Sie die Inanspruchnahme des Arbeitsspeichers im Programmverlauf wiederholt auswerten (etwa im Rahmen einer Schleife), kann es nötig sein, p = Process.GetCurrentProcess(); bei jedem Schleifendurchlauf zu aktualisieren. Andernfalls wird der Ursprungswert wiederholt angezeigt, was irreführend wirken kann.

Die Klasse System.Diagnostics.PerformanceCounter

Auch die Klasse System.Diagnostics.PerformanceCounter ist in der Lage, den aktuellen Prozess zu analysieren. Über NextValue() wird der jeweilige Wert laufend aktualisiert.


bool fertig = false;
Process p   = Process.GetCurrentProcess();
PerformanceCounter pcram;
PerformanceCounter pccpu;
pcram = new PerformanceCounter("Process", "Working Set", p.ProcessName);
pccpu = new PerformanceCounter("Process", "% Processor Time", p.ProcessName);
while (!fertig)
{
    System.Threading.Thread.Sleep(1);
    double ram = pcram.NextValue();
    double cpu = pccpu.NextValue();
    Console.WriteLine("RAM : {0,15:N0} B", ram);
    Console.WriteLine("RAM : {0,15:N0} MB", (ram / 1024 / 1024));
    Console.WriteLine("CPU : {0,15:N0} %", (cpu));
    fertig = true;
}

WMI: Die Klasse System.Management.ManagementObjectSearcher


int pid = Process.GetCurrentProcess().Id;
System.Management.ManagementObjectSearcher mc;
mc = new System.Management.ManagementObjectSearcher();
mc.Query.QueryString = $"select * from Win32_Process where ProcessId={pid}";
string propname = "";
foreach (System.Management.ManagementObject mo in mc.Get())
{
    propname = "MaximumWorkingSetSize";
    Console.WriteLine("{0} : {1,15:N0}", propname,
        Convert.ToInt64(mo.Properties[propname].Value));
    propname = "MinimumWorkingSetSize";
    Console.WriteLine("{0} : {1,15:N0}", propname,
        Convert.ToInt64(mo.Properties[propname].Value));
    propname = "PeakVirtualSize";
    Console.WriteLine("{0}       : {1,15:N0}", propname,
        Convert.ToInt64(mo.Properties[propname].Value));
    propname = "PeakWorkingSetSize";
    Console.WriteLine("{0}    : {1,15:N0}", propname,
        Convert.ToInt64(mo.Properties[propname].Value));
    propname = "VirtualSize";
    Console.WriteLine("{0}           : {1,15:N0}", propname,
        Convert.ToInt64(mo.Properties[propname].Value));
    propname = "WorkingSetSize";
    Console.WriteLine("{0}        : {1,15:N0}", propname,
        Convert.ToInt64(mo.Properties[propname].Value));
}

wg / 11. Juli 2018



Fragen? Anmerkungen? Tipps?

Bitte nehmen Sie Kontakt zu mir auf.






Vielen Dank für Ihr Interesse an meiner Arbeit.


V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn

☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de

www.wilfried-grupe.de/cs_PerformanceMessung.html