XPerf Szenario: Hohe CPU Auslastung

Im vorhergehenden Artikel; Einführung zum Windows Performance Toolkit ging es darum, was das Windows Performance Toolkit ist, und woher man es erhält. Heute geht es darum zu verstehen, wie man mit XPerf, eine hohe CPU Auslastung analysieren kann.

Beispiel Command um eine hohe CPU Auslastung zu loggen:

  • Command Prompt öffnen
  • xperf.exe –on Latency
  • Fehler reproduzieren
  • XPerf.exe -d *name_der_datei*.etl

Syntax Erklärung:

Latency steht für eine Kernel Gruppe, die aus 8 Kernelflags besteht. Jede einzelne loggt bestimmte Informationen, und wird dann zu einer ETL Datei zusammengeführt.

  • PROC_THREAD:
    • Nützlich um festzustellen, wann welcher Prozess bzw. Thread gestartet oder beendet wird.
  • LOADER:
    • Informiert welche Images (EXE / DLL) im Kernel Bereich geladen werden.
  • DISK_IO:
    • Festplattenauslastung
  • HARD_FAULTS:
    • Information wann ein Hard Fault geschieht, und was es verursacht.
    • Hard Faults Erklärung:
      • Pages eines RAM, die entweder vom RAM auf die Festplatte ausgelagert werden, oder von der Festplatte wieder in das RAM eingelagert werden.
  • DPC:
    • Zeitpunkt wann ein Deferred Procedure Call geschieht.
    • Deferred Procedure Call Erklärung:
      • Ein DPC wird ausgelöst, damit ein Interrupt (z.B. Disk I/O, Netzwerk Traffic) der sonst auf einem zu hohen IRQL läuft und somit die gesamte CPU blockieren würde. Der DPC läuft auf einem viel niedrigeren Interrupt Level, und arbeitet diese Interrupts in einem niedrigeren IRQL ab. DPC´s werden in eine Q gestellt und dort abgearbeitet.
  • INTERRUPT:
    • Wann ein Interrupt passiert.
    • Interrupt Erklärung:
      • Wenn ein Request wie z.B. eingehender Netzwerk Traffic für die Hardware da ist, löst es im Betriebsystem ein Interrupt aus. Dadurch wird die CPU von seiner aktuellen Tätigkeiten gelöst, und bearbeitet umgehend diesen Request.
  • CSWITCH:
    • Informiert wann ein Context Switch geschieht, und somit ein Thread entweder auf die CPU kommt oder entfernt wird.

    • Context Switch Erklärung:

  • PROFILE:
    • Loggt auf die Millisekunde genau, was die CPU ausführt.

Sobald der Trace über XPerfview.exe geöffnet wurde, sieht man zwei verschieden CPU Graphen, CPU Sampling und CPU Usage. Obwohl beide Informationen auf dem ersten Blick ähnlich aussehen, sind sie trotzdem unterschiedlich. Die CPU Sampling Graphen, erhalten die Informationen vom Provider PROFILE, die CPU Usage Graphen vom Provider CSWITCH.

Informationen die man durch die beiden Graphen erhält:

CPU Usage: Wie viel Zeit hat jeder einzelne Thread genau, zur Ausführung auf der CPU. 

CPU Sampling: Dadurch, dass der PROFILE Provider die Stacks mit einsammelt, kann über CPU Sampling genau angezeigt werden, was der einzelne Thread im User bzw. im Kernel Modus durchführt.

Deswegen ist meine persönliche Empfehlung, erst mit CPU Usage zu überprüfen welcher Thread das Problem bereitet, und danach mit CPU Sampling, zu schauen, was der Thread versucht auszuführen.

CPU Sampling by CPU / CPU Usage by CPU:

      

Die oben abgebildeten Graphen zeigen die Auslastung je CPU an.

CPU Sampling by Process / CPU Usage by Process:

      

Hierüber kann auf dem ersten Blick eingesehen werden, welcher Prozess eine hohe CPU Auslastung verursacht.

CPU Sampling by Thread / CPU Usage by Thread:

      

Hier erfährt man welcher Thread, von einem Prozess, die hohe CPU Auslastung verursacht.

Nachdem die einzelnen Graphen überprüft wurden, kann man tiefer in die Analyse gehen. Hierfür, mit der rechten Maustaste auf einen der Graphen klicken, und Summary Table's auswählen:

CPU Sampling by Process Summary Table:

CPU Usage by Process Summary Table:

In diesem Beispiel Trace, kann man innerhalb der Summary Tables erkennen, dass der Grund für die Hohe CPU Auslastung die CPU100.exe ist, die mit seinen Threads insgesamt 97,04% der CPU belegt.

Kleiner Tipp, die Trennleiste nennt man die Golden Bar. Der Unterschied zwischen dem linken zum rechten Bereich ist, dass rechts die Daten zum sortieren genutzt werden, und sobald man diese nach links zieht eine Gruppierung der Daten erfolgt.