Analysieren der CPU-Auslastung ohne Debuggen im Leistungs-Profiler (C#, Visual Basic, C++, F#)

Gilt für:JaVisual Studio NeinVisual Studio für MacNeinVisual Studio Code

Ein guter Ausgangspunkt für die Untersuchung von Leistungsproblemen in Ihrer App ist die CPU-Auslastung. Das Leistungstool für die CPU-Auslastung zeigt die CPU-Zeit und den prozentualen Anteil an, der für die Ausführung von Code in C++ und C#/Visual Basic verwendet wird.

Das CPU-Auslastungstool kann Ihnen bei Folgendem helfen:

  • Diagnostizieren einer Verlangsamung oder eines Hängenbleibens eines Prozesses in der Codebasis Ihres Teams. Das Tool kann Ihnen helfen, ein Problem mit dem Produktionscode Ihres Teams zu diagnostizieren. Das Tool bietet automatische Einblicke und verschiedene Ansichten Ihrer Daten, sodass Sie Leistungsprobleme analysieren und diagnostizieren können.

  • Identifizieren Sie Leistungsprobleme in DevOps-Szenarios, z. B. wenn ein Kunde meldet, dass einige Anfragen oder Bestellungen während Spitzenzeiten nicht bei der Einzelhandelswebsite ankommen. Die Probleme liegen häufig bei der Produktion, und es ist schwierig, zu diesem Zeitpunkt einen Debugprozess durchzuführen. Dieses Tool kann Ihnen aber dabei helfen, genügend Informationen und Beweise zu diesem Problem zu erfassen. Nach dem Erfassen einer Ablaufverfolgungsdatei kann die Analyse Ihnen schnell helfen, potenzielle Ursachen zu verstehen und Vorschläge im Kontext Ihres Codes zu geben, damit Sie die nächsten Schritte ausführen können, um das Problem zu beheben.

  • Wenn Ihr Latenzproblem nicht an einer API-Anforderung liegt, können Sie mit dem CPU-Auslastungstool nach einer hohen CPU-Auslastung und anderen verwandten Problemen suchen. Das CPU-Auslastungstool kann Ihnen helfen, Engpässe zu identifizieren, um Optimierungsmöglichkeiten einzugrenzen.

Das CPU-Nutzungstool ist sowohl für lokale Ablaufverfolgungssitzungen als auch für die Produktion hilfreich. Das CPU-Auslastungstool kann auch mithilfe der Tastenkombination Alt+F2 und dann durch Auswahl von CPU-Auslastung oder durch Öffnen einer bereits erfassten Ablaufverfolgung mithilfe eines Tools wie dotnet-trace oder dotnet-monitor initiiert werden. (Für .NET-Produktionscode würden Sie so am wahrscheinlichsten Ablaufverfolgungen erfassen.)

Das Tool für die CPU-Auslastung kann auf einem geöffneten Visual Studio-Projekt oder auf einer installierten Microsoft Store-App ausgeführt oder an eine laufende App oder einen laufenden Prozess angefügt werden. Sie können das Tool für die CPU-Auslastung mit oder ohne Debuggen ausführen. Weitere Informationen finden Sie unter Ausführen von Profilerstellungstools mit oder ohne Debugger.

Die folgenden Anweisungen zeigen, wie Sie das Tool für die CPU-Auslastung ohne den Debugger mit dem Visual Studio-Leistungsprofiler verwenden. In den Beispielen wird ein Releasebuild verwendet, der auf einem lokalen Computer erstellt wurde. Releasebuilds bieten die beste Ansicht der tatsächlichen App-Leistung. Informationen zur Analyse der CPU-Auslastung mit Debugbuilds (Debugger angefügt) finden Sie unter Messen der Anwendungsleistung durch Analyse der CPU-Nutzung.

In der Regel repliziert der lokale Computer die Ausführung der installierten App am besten. Führen Sie die App direkt auf dem Gerät und nicht über eine Remotedesktopverbindung aus, um Daten von einem Remotegerät zu sammeln.

Hinweis

Für die Verwendung des Leistungsprofilers ist Windows 7 oder höher erforderlich.

Erfassen von CPU-Auslastungsdaten

  1. Legen Sie im Visual Studio-Projekt die Konfiguration der Projektmappe auf Release fest, und wählen Sie als Bereitstellungsziel Lokaler Windows-Debugger (oder Lokaler Computer) aus.

    Wählen Sie „Release“ und „Lokaler Computer“ aus

    Wählen Sie „Release“ und „Lokaler Computer“ aus

  2. Wählen Sie Debuggen>Leistungsprofiler aus.

  3. Wählen Sie unter Verfügbare Tools die Option CPU-Auslastung und dann Starten aus.

    Wählen Sie „CPU-Auslastung“ aus

    Wählen Sie „CPU-Auslastung“ aus

  4. Nach dem Start der App beginnt die Diagnosesitzung, und es werden die CPU-Auslastungsdaten angezeigt. Wenn Sie mit dem Sammeln der Daten fertig sind, klicken Sie auf Sammlung beenden.

    Beenden der Sammlung von CPU-Auslastungsdaten

    Beenden der Sammlung von CPU-Auslastungsdaten

    Das CPU-Auslastungstool analysiert die Daten und zeigt den Bericht an.

    CPU-Auslastungsbericht

    CPU-Auslastungsbericht

Analysieren des CPU-Auslastungsberichts

Der Diagnosebericht wird nach CPU gesamt vom höchsten zum niedrigsten Wert sortiert. Ändern Sie die Sortierreihenfolge oder sortieren Sie eine Spalte, indem Sie auf die Spaltenüberschrift klicken. Verwenden Sie die Dropdownliste Filter, um das Anzeigen von Threads zu aktivieren bzw. deaktivieren. Verwenden Sie das Feld Suchen, um nach einem bestimmten Thread oder Knoten zu suchen. Sie können auf eine für Sie interessante Funktion doppelklicken, um die Quelle der Funktion anzuzeigen. Damit erhalten Sie auch eine Hervorhebung, die anzeigt, wo in dieser Funktion Zeit verbraucht wird. Die Tabelle enthält Spalten mit Daten wie z. B. die in der Funktion verbrachte Zeit einschließlich der aufgerufenen Funktionen (CPU gesamt), und eine zweite Spalte, die die in einer Funktion verbrachte Zeit ohne die aufgerufenen Funktionen angibt (Eigen-CPU).

Diese Daten können bei der Bewertung helfen, ob die Funktion selbst ein Leistungsengpass ist. Ermitteln Sie, wie viele Daten die Methode anzeigt, um festzustellen, ob Code oder Runtimebibliotheken von Drittanbietern der Grund dafür sind, dass Ihre Endpunkte langsam oder ressourcenintensiv sind.

Ab Visual Studio 2019 können Sie auf die Schaltflächen Langsamsten Pfad erweitern und Langsamsten Pfad anzeigen klicken, um die Funktionsaufrufe anzuzeigen, die den höchsten Prozentsatz der CPU in der Ansicht der Aufrufstruktur verwenden.

Datenspalten der CPU-Auslastung

Name Beschreibung
CPU gesamt [Einheit, %] Gesamt % Datengleichung

Die Millisekunden und der prozentuale CPU-Anteil, der im ausgewählten Zeitbereich durch Aufrufe der Funktion und die von der Funktion aufgerufenen Funktionen verwendet wurde. Dies unterscheidet sich vom Zeitachsendiagramm CPU-Auslastung, das die gesamte CPU-Aktivität in einem Zeitbereich mit der insgesamt verfügbaren CPU vergleicht.
Eigen-CPU [Einheit, %] Eigen % Gleichung

Die Millisekunden und der prozentuale CPU-Anteil, der im ausgewählten Zeitbereich durch Aufrufe der Funktion verwendet wurde. Die von der Funktion aufgerufenen Funktionen sind dabei ausgeschlossen.
Modul Der Name des Moduls, das die Funktion enthält.

Die Aufrufstruktur der CPU-Auslastung

Wählen Sie zum Anzeigen der Aufrufstruktur im Bericht den übergeordneten Knoten aus. Es öffnet sich die Seite CPU-Auslastung in der Ansicht Aufrufer/Aufgerufener. Wählen Sie in der Dropdownliste Aktuelle Ansicht die Option Aufrufstruktur aus.

Struktur der Aufrufstruktur

Struktur der Aufrufstruktur

Struktur der Aufrufstruktur

Bild BESCHREIBUNG
Schritt 1 Der oberste Knoten in Aufrufstrukturen der CPU-Auslastung ist ein Pseudoknoten.
Schritt 2 In den meisten Apps ist bei deaktivierter Option Externen Code anzeigen der Knoten der zweiten Ebene ein [Externer Code] -Knoten. Der Knoten enthält den System- und Frameworkcode, der die App startet und beendet, die Benutzeroberfläche zeichnet, die Threadplanung steuert und der App weitere Dienste auf unterer Ebene bereitstellt.
Schritt 3 Die untergeordneten Elemente des Knotens der zweiten Ebene sind die Benutzercodemethoden und asynchronen Routinen, die vom System- und Frameworkcode der zweiten Ebene aufgerufen oder erstellt werden.
Schritt 4 Untergeordnete Knoten einer Methode enthalten nur Daten für die Aufrufe der übergeordneten Methode. Wenn Externen Code anzeigen deaktiviert ist, können App-Methoden auch den Knoten [Externer Code] enthalten.

Externer Code

System- und Frameworkfunktionen, die von Ihrem Code ausgeführt werden, werden als externer Code bezeichnet. Funktionen mit externem Code starten und beenden die App, zeichnen die Benutzeroberfläche, steuern das Threading und stellen der App weitere Dienste auf unterer Ebene bereit. In den meisten Fällen sind Sie nicht an externem Code interessiert, weshalb die Aufrufstruktur „CPU-Auslastung“ die externen Funktionen einer Benutzermethode in einem [Externer Code] -Knoten sammelt.

Um die Aufrufpfade des externen Codes anzuzeigen, wechseln Sie zur aktuellen Ansicht der Anrufstruktur, oder klicken Sie mit der rechten Maustaste, und wählen Sie die Option In Aufrufstruktur anzeigen aus.

Aufrufstruktur anzeigen

Wählen Sie zum Anzeigen der Aufrufpfade von externem Code auf der Hauptseite des Diagnoseberichts (rechter Bereich) in der Dropdownliste Filter die Option Externen Code anzeigen aus, und klicken Sie dann auf Anwenden. In der Ansicht Aufrufstruktur der Seite CPU-Auslastung werden dann die externen Codeaufrufe erweitert. (Die Dropdownliste Filter finden Sie auf der Hauptdiagnoseseite, nicht in den Detailansichten.)

Externen Code anzeigen

Viele externe Codeaufrufketten sind tief verschachtelt, sodass die Breite der Kette die Anzeigebreite der Spalte Funktionsname überschreiten kann. Die Funktionsnamen werden dann wie in der folgenden Abbildung dargestellt angezeigt.

Verschachtelter externer Code in der Aufrufstruktur

Viele externe Codeaufrufketten sind tief verschachtelt, sodass die Breite der Kette die Anzeigebreite der Spalte Funktionsname überschreiten kann. Die Funktionsnamen werden dann als ... angezeigt.

Verschachtelter externer Code in der Aufrufstruktur

Verwenden Sie das Suchfeld, um einen Funktionsnamen zu finden. Zeigen Sie auf die ausgewählte Zeile, oder verwenden Sie die horizontale Scrollleiste, um die Daten anzuzeigen.

Suche nach verschachteltem externem Code

Suche nach verschachteltem externem Code

Asynchrone Funktionen in der Aufrufstruktur der CPU-Auslastung

Wenn der Compiler auf eine asynchrone Methode trifft, erstellt er eine versteckte Klasse zum Steuern der Ausführung der Methode. Vom Konzept her ist die Klasse ein Zustandsautomat. Die Klasse verfügt über vom Compiler generierte Funktionen, die die ursprünglichen Methoden sowie die Rückrufe, Planer und Iteratoren, die für deren Ausführung erforderlich sind, asynchron aufrufen. Wenn eine übergeordnete Methode die ursprüngliche Methode aufruft, entfernt der Compiler die Methode aus dem Ausführungskontext der übergeordneten Methode und führt die Methoden der ausgeblendeten Klasse im Kontext des System- und Frameworkcodes durch, der die Ausführung der App steuert. Die asynchronen Methoden werden oft, jedoch nicht immer, in einem oder mehreren verschiedenen Threads ausgeführt. Dieser Code wird in der Aufrufstruktur CPU-Auslastung als untergeordnete Elemente des Knotens [Externer Code] direkt unter dem obersten Knoten der Struktur angezeigt.

Im folgenden Beispiel sind die ersten beiden Knoten unter [Externer Code] die vom Compiler generierten Methoden der Zustandsautomatklasse. Der dritte Knoten ist der Aufruf der ursprünglichen Methode.

Asynchroner Knoten

Erweitern Sie die generierten Methoden, um zu sehen, was passiert:

Erweiterter asynchroner Knoten

Erweiterter asynchroner Knoten

  • MainPage::GetMaxNumberAsyncButton_Click verwaltet nur eine Liste der Aufgabenwerte, berechnet das Maximum der Ergebnisse und zeigt die Ausgabe an.

  • MainPage+<GetMaxNumberAsyncButton_Click>d__3::MoveNext zeigt die erforderliche Aktivität zum Planen und Starten der 48 Aufgaben, die den Aufruf von GetNumberAsyncumschließen.

  • MainPage::<GetNumberAsync>b__b zeigt die Aktivität der Aufgaben an, die GetNumber aufrufen.

Weitere Informationen