5 Stimmen

Wie man die genaue CPU-Auslastung eines Prozesses auf einem Multiprozessor-/Multicore-System ermittelt

Oder vielleicht lautet die Frage eher: "Was mache ich hier krass falsch?"

Ich habe eine Testanwendung, die nichts anderes tut, als ihren eigenen CPU-Verbrauch zu überwachen. Es sieht ein wenig so aus wie dieses:

protected PerformanceTrace()
{
   Process currentProcess = Process.GetCurrentProcess();
   this.cpuCounter = new PerformanceCounter("Process", "% Processor Time", currentProcess.ProcessName);
   this.coreCount = Environment.ProcessorCount;
}

private int coreCount;
private DateTime lastCpuRead = DateTime.MinValue;
private float _cpuUsage;
private float CpuUsage
{
   get
   {
      if ((DateTime.Now - this.lastCpuRead) > TimeSpan.FromSeconds(1.0))
      {
         this._cpuUsage = this.cpuCounter.NextValue();
      }
      return this._cpuUsage / this.coreCount;
   }
}

Die Eigenschaft CpuUsage wird sehr häufig gelesen. Hier ist die Sache:

Auf meinem Rechner, Environment.ProcessorCount ergibt einen Wert von 2. Der Wert, der vom Zähler kommt, ist jedoch oft bis zu 800. Ich vermute, dass dies etwas mit mehreren Kernen und Hyperthreading zu tun hat. Was kann ich tun, um den tatsächlichen Wert zu erhalten, den ich suche? (Die gesamte prozentuale Prozessorzeit für diesen bestimmten Prozess)

0voto

Steve Townsend Punkte 52288

Sie haben recht - Sie müssen die Zahl aus den Leistungszählern durch die Anzahl der CPUs mal die Anzahl der echten Threads pro CPU teilen - einen pro Kern, plus einen pro Kern, wenn Hyperthreading ein Faktor ist.

In C# weiß ich nicht, wie ich das feststellen kann. In nativem Code können Sie verwenden GetLogicalProcessorInformation y seine zugehörige Struktur um die logischen Prozessoren zu zählen, einschließlich derer, die sich einen Kern teilen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X