2011-01-13 18 views
51

Wie kann ich die CPU und Speicherauslastung eines bestimmten Prozesses mit der .NET PerformanceCounter Klasse bekommen? Und was ist der Unterschied zwischenWas ist der korrekte Leistungsindikator, um die CPU- und Speichernutzung eines Prozesses zu erhalten?

Processor\% Processor Time und Process\% Processor Time?

Ich bin ein wenig verwirrt zwischen diesen beiden.

+3

Es gibt keine richtige Art und Weise die Speichernutzung zu messen. Speicher kann auf viele verschiedene Arten verwendet werden. Zählen Sie beispielsweise Speicher, der auf Festplatte oder Speicher ausgelagert wurde, der gerade reserviert/festgeschrieben ist, aber noch nicht geschrieben wurde, ... – CodesInChaos

Antwort

91

Von this Beitrag:

Um den gesamten PC-CPU und Speicherverbrauch zu erhalten:

using System.Diagnostics; 

Dann global deklarieren:

private PerformanceCounter theCPUCounter = 
    new PerformanceCounter("Processor", "% Processor Time", "_Total"); 

Dann die CPU-Zeit zu bekommen, einfach Rufen Sie die NextValue() Methode an:

this.theCPUCounter.NextValue(); 

Dies wird Ihnen die CPU-Auslastung

Wie für die Speichernutzung, die gleiche Sache erhalten gilt glaube ich:

private PerformanceCounter theMemCounter = 
    new PerformanceCounter("Memory", "Available MBytes"); 

Dann die Speichernutzung zu erhalten, rufen Sie einfach die NextValue() Methode:

this.theMemCounter.NextValue(); 

Für einen bestimmten Prozess CPU- und Speicherauslastung:

private PerformanceCounter theCPUCounter = 
    new PerformanceCounter("Process", "% Processor Time",    
    Process.GetCurrentProcess().ProcessName); 

Dabei ist Process.GetCurrentProcess().ProcessName der Name des Prozesses, über den Sie Informationen erhalten möchten.

private PerformanceCounter theMemCounter = 
    new PerformanceCounter("Process", "Working Set", 
    Process.GetCurrentProcess().ProcessName); 

wo Process.GetCurrentProcess().ProcessName ist der Prozessname Sie die Informationen über bekommen möchten.

Beachten Sie, dass Arbeitssatz nicht in seinem eigenen Recht ausreichend sein kann, um den Prozess Speicherbedarf zu bestimmen - siehe What is private bytes, virtual bytes, working set?

alle Kategorien abzurufen, siehe Walkthrough: Retrieving Categories and Counters

Der Unterschied zwischen Processor\% Processor Time und Process\% Processor Time ist Processor ist vom PC selbst und Process ist pro einzelnen Prozess. Die Prozessorzeit des Prozessors würde also auf dem PC liegen. Die Prozessorzeit eines Prozesses wäre die angegebene Prozessverwendung. Für vollständige Beschreibung der Kategorienamen: Performance Monitor Counters

Eine Alternative zur Verwendung der Performance Counter

Verwenden System.Diagnostics.Process.TotalProcessorTime und System.Diagnostics.ProcessThread.TotalProcessorTime Eigenschaften Ihrer Prozessornutzung zu berechnen, wie dies article beschreibt.

+1

Gibt es jedoch die CPU/Mem-Auslastung des aktuellen Prozesses, von der die Funktion aufgerufen wird? –

+0

Die Speichernutzung ist nicht verfügbar. Wie bekomme ich die Megabytes, die nicht verfügbar sind? –

+1

Wenn ich denCPUCounter wie oben erstellen, erhalte ich eine InvalidOPerationException: "Counter Name Daten können nicht geladen werden, weil ein ungültiger Index '' aus der Registrierung gelesen wurde." – Ted

3

Pelo Hyper-V:

private PerformanceCounter theMemCounter = new PerformanceCounter(
    "Hyper-v Dynamic Memory VM", 
    "Physical Memory", 
    Process.GetCurrentProcess().ProcessName);