Kann ein C# -Programm irgendwie eine eigene CPU -Verwendung messen?
-
07-07-2019 - |
Frage
Ich arbeite an einem Hintergrundprogramm, das lange läuft, und ich habe ein externes Protokollierungsprogramm (SmartInspect) dass ich regelmäßig mit einigen Werten füttern möchte, um es in Echtzeit beim Debuggen zu überwachen.
Ich weiß X% CPU, markieren Sie dies im Protokoll.
Ich habe einen Hintergrund -Thread, der regelmäßig Statistiken an SmartInspekte vermittelt, wie Speicherverbrauch, Arbeitssatz usw.
Ist es für diesen Thread möglich, ein einigermaßen genaues Maß dafür zu erhalten, wie viel von den CPU -Ressourcen des Computers er verbraucht? Das Hauptprogramm ist eine einsthread-Anwendung (abgesehen von dem Watchdog-Thread, der Statistiken protokolliert). Wenn also eine Technik beschränkt ist Wie viel verwendet ein einzelner Thread? Dann wäre das auch gut.
Ich fand einige Einträge, die mit etwas genannt werden Reisung Für Linux und C. gibt es etwas Ähnliches, das ich dafür verwenden kann?
Bearbeiten: OK, ich habe den Performance-Counter-Weg ausprobiert, aber jedes Mal, wenn es sich um die Speicherverwendung und die Müllkollektion handelt, fügte es jedes Mal eine Menge GC-Daten hinzu. Ich schätze, ich werde diesen Teil vorerst einfach auslassen.
Lösung
Sie können auch verwenden Systemdiagnose.Process.totalProcessortime und Systemdiagnose.ProcessThread.totalProcessortime Eigenschaften zur Berechnung Ihrer Prozessorverwendung als diese Artikel beschreibt.
Andere Tipps
Sich ansehen System.Diagnostics.PerformanceCounter
. Wenn Sie hochlaufen perfmon.exe
, Sie werden den Bereich der Leistungszähler sehen, die Ihnen zur Verfügung stehen (setzen Sie das "Leistungsobjekt" auf "Prozess"), von denen eine "% Prozessorzeit" ist.
Sie können durch das System.diagnostic.performanceCounter -Klasse. Hier ist ein Beispiel dafür, dass jemand die CPU -Nutzung überwacht:
Beachten Sie, dass dies erhöhte Privilegien erfordert. Und es kann einen Performance -Treffer geben.
Es ist gut, dass Sie sich bei Monitoren wie SmartInspect anmelden. Windows selbst sammelt jedoch die Daten für jede Ressource in diesem Fall in Ihrem Programm (oder Prozess). WMI ist der Standard für die Anwendungsüberwachung. Wir können die von WMI erfassten Daten anzeigen. Viele Anwendungsmanagement-, Gesundheitsüberwachungs- oder Applicaiton -Überwachungstools unterstützen die WMI.
Daher würde ich Sie nicht empfehlen, Ihre CPU -Verwendung in der Anwendung in einer Protokolldatei zu protokollieren.
Wenn Sie der Meinung sind, dass Verfügbarkeit und Leistung kritisch sind, entscheiden Sie sich für Lösungen wie Microsoft Operations Manager Solution.
Um eine Vorstellung von WMI zu bekommen und die Liste der Prozesse zu erhalten, siehe unten: - Win32_PerfFormattedData_PerfProc_Process
Um die CPU -Zeit zu erhalten, ist Filter processIDSiehe diesen Artikel- Sie können die prozessID von Win32_Process -Klasse erhalten.
WMI hat C# leicht gemacht von Kevin Matthew Goss
oConn.Username = "JohnDoe";
oConn.Password = "JohnsPass";
System.Management.ManagementScope oMs = new System.Management.ManagementScope("\\MachineX", oConn);
//get Fixed disk stats
System.Management.ObjectQuery oQuery = new System.Management.ObjectQuery("select FreeSpace,Size,Name from Win32_LogicalDisk where DriveType=3");
//Execute the query
ManagementObjectSearcher oSearcher = new ManagementObjectSearcher(oMs,oQuery);
//Get the results
ManagementObjectCollection oReturnCollection = oSearcher.Get();
//loop through found drives and write out info
foreach( ManagementObject oReturn in oReturnCollection )
{
// Disk name
Console.WriteLine("Name : " + oReturn["Name"].ToString());
// Free Space in bytes
Console.WriteLine("FreeSpace: " + oReturn["FreeSpace"].ToString());
// Size in bytes
Console.WriteLine("Size: " + oReturn["Size"].ToString());
}
Sie können den Prozess auch vom Remote -System überwachen.
In diesem Code -Projektartikel wird beschrieben, wie der Hochleistungs -Timer verwendet wird:
http://www.codeprroject.com/kb/cs/highperformancetimercshar.aspx
Sie können es verwenden, um die Ausführung Ihres Codes zu zeitieren.
Hier finden Sie eine Reihe von Open Source C# -Profilern: