Laden...

[System.Diagnostics.Process] %-CPU-Usage ermitteln

Erstellt von Golo Roden vor 17 Jahren Letzter Beitrag vor 17 Jahren 3.507 Views
Golo Roden Themenstarter:in
4.207 Beiträge seit 2003
vor 17 Jahren
[System.Diagnostics.Process] %-CPU-Usage ermitteln

Hallo,

wie kann ich für den aktuellen Prozess die prozentuale CPU-Usage ermitteln?

Mein erster Ansatz, mir diesen Wert per PerformanceCounter zu holen, ist leider fehlgeschlagen, da allein das Abrufen des PerformanceCounters den Wert um circa 40 bis 50 % nach oben treibt 😦.

Gibt es einen Win32-Call, den man hierfür verwenden kann?

Viele Grüße,

Golo

Wissensvermittler und Technologieberater
für .NET, Codequalität und agile Methoden

www.goloroden.de
www.des-eisbaeren-blog.de

2.921 Beiträge seit 2005
vor 17 Jahren

Ich hab mal versucht das herauszufinden.

Folgendes funktioniert bei mir und gibt die Loadpercentages an (Abfrage über WMI):


using System.Management;
        private string LoadTime()
        {
            ObjectQuery objectQuery = new ObjectQuery("SELECT * FROM CIM_Processor");
            ManagementObjectSearcher query = new ManagementObjectSearcher(objectQuery);

            string sLoad = "";
            foreach (ManagementObject managementObject in query.Get())
            {
                sLoad = managementObject["LoadPercentage"].ToString();
            }
            return sLoad;
        }

Achtung: Es muss noch die

System.Management.dll

eingebunden werden.

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.

Golo Roden Themenstarter:in
4.207 Beiträge seit 2003
vor 17 Jahren

Hallo,

danke erst einmal für den Code. Allerdings verstehe ich nicht wirklich, was Du dort machst.

  1. Wozu benötigst Du die foreach-Schleife? Dadurch, dass sLoad in jedem Durchlauf überschrieben wird, ermittelst Du letztlich doch nur den letzten Wert, was ohne Schleife doch deutlich performanter ginge?

  2. LoadPercentage gibt mir die Prozessorlast des gesamten Prozessors wieder, nicht die des aktuellen Prozesses, oder?

Viele Grüße,

Golo

Wissensvermittler und Technologieberater
für .NET, Codequalität und agile Methoden

www.goloroden.de
www.des-eisbaeren-blog.de

2.921 Beiträge seit 2005
vor 17 Jahren
  1. Naja, auf Performance habe ich in diesem Falle nicht geachtet, da ich ja nur ausprobieren wollte, wie das überhaupt geht. Natürlich reicht ein Aufruf.

  2. Ja, stimmt es gibt die komplette CPU-Load-Usage zurück.

Zur Frage: Was ich da mache...

WMI stellt in diesem Fall Objekte bereit die quasi mit SQL-Abfragen ausgewertet werden können.
Und da ich "select *" gemacht habe, bekomme ich in diesem Falle alle Werte von CIM_Processor (CPU-Load) zurück.

Aber ich glaube

Win32_PerfFormattedData_PerfProc_Process class [WMI]
Windows SDK für Windows 2003, gilt ab XP

ist was Du suchst.

Hier noch ein Auszug aus dem SDK:

"The Win32_PerfFormattedData_PerfProc_Process "cooked" data performance counter class represents calculated counters that monitor running application program and system processes. All the threads in a process share the same address space and have access to the same data."

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.

S
8.746 Beiträge seit 2005
vor 17 Jahren

Original von Golo Haas

  1. LoadPercentage gibt mir die Prozessorlast des gesamten Prozessors wieder, nicht die des aktuellen Prozesses, oder?

In einer der letzten c`ts war übrigens ein Artikel, wie dieser Wert zu interpretieren ist. Je nach verwendetem Prozessor muss man nämlich das Ergebnis noch nachbearbeiten. Stichwort: MP, Multi-Core, HT. So zeigt z.B. auch der Taskmanager die Prozessorlast je virtuellem Proz. an. Die reale Auslastung des Prozessors ist die Summe beider Werte.

T
64 Beiträge seit 2005
vor 17 Jahren

gibt es die möglichkeit dies auch durch ein lokales Netzwerk zu routen? Ich würde gerne die CPU's (4 pro Server) in einer Software sehen.
Es wären 5 Server die zu überwachen wären mit jeweils 4 CPU's

Danke euch im Voraus

S
143 Beiträge seit 2006
vor 17 Jahren

Hallo!
Schaut euch mal die Leistungsanzeige unter Verwaltung an. Da ist eigentlich alles drin, was man braucht.
Hier ein Beispiel für die CPU-Last des aspnet_wp Prozesses:


        private void button5_Click(object sender, EventArgs e)
        {
            PerformanceCounter p = new PerformanceCounter("Process", "% Processor Time", "aspnet_wp");
            Console.WriteLine(p.NextValue());
        }