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

Gilt für:yesVisual Studio noVisual Studio für MacnoVisual 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.

    Screenshot that shows Select Release and Local Machine.

    Screenshot that shows Select Release and Local Machine.

  2. Wählen Sie Debuggen>Leistungsprofiler aus.

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

    Screenshot that shows Select CPU Usage.

    Screenshot that shows Select CPU Usage.

    Hinweis

    Weitere Informationen zur Optimierung des Tools finden Sie unter Optimieren der Profilereinstellungen.

  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.

    Screenshot that shows Stop CPU Usage data collection.

    Screenshot that shows Stop CPU Usage data collection.

    Das CPU-Auslastungstool analysiert die Daten und zeigt den Bericht an. Wenn Probleme beim Sammeln oder Anzeigen von Daten haben, lesen Sie Behandeln von Profilerstellungsfehlern und Beheben von Problemen.

    Screenshot that shows CPU Usage report.

    Screenshot that shows CPU Usage report.

    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.

Datenspalten der CPU-Auslastung

Name Beschreibung
CPU gesamt [Einheit, %] Total % data equation

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, %] Self % equation

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 In einigen Ansichten wird die Spalte „Modul“ angezeigt, die den Namen des Moduls mit der Funktion enthält.

Analysieren von CPU-Erkenntnissen

Informationen zur Analyse der wichtigsten Erkenntnisse und Funktionen sowie des langsamsten Pfads finden Sie unter CPU-Erkenntnisse.

Analysieren des CPU-Auslastungsberichts

Klicken Sie zum Analysieren des Berichts auf Details öffnen, oder klicken Sie auf eine der wichtigsten Funktionen, um die Ansicht Funktionen zu öffnen.

Der Bericht bietet verschiedene Ansichten der Diagnosedaten:

  • Aufrufer/Aufgerufener
  • Aufrufstruktur
  • Module
  • Functions
  • Flammendiagramm

Klicken Sie zum Analysieren des Berichts auf Ausführlichen Bericht erstellen.

Der Bericht bietet verschiedene Ansichten der Diagnosedaten:

  • Aufrufer/Aufgerufener
  • Aufrufstruktur

In allen Ansichten (mit Ausnahme von Aufrufer/Angerufener) wird der Diagnosebericht nach Gesamt CPU sortiert, vom höchsten zum niedrigsten Wert. Ändern Sie die Sortierreihenfolge oder sortieren Sie eine Spalte, indem Sie auf die Spaltenüberschrift klicken. 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.

Weitere Informationen zur Verwendung des Flammendiagramms finden Sie unter Identifizieren der langsamsten Pfade mit einem Flammendiagramm.

Die Aufrufstruktur der CPU-Auslastung

Wählen Sie zum Anzeigen der Aufrufstruktur im Bericht den übergeordneten Knoten aus. Daraufhin wird standardmäßig die Seite CPU-Auslastung in der Ansicht Aufrufer/Aufgerufener geöffnet. Wählen Sie in der Dropdownliste Aktuelle Ansicht die Option Aufrufstruktur aus.

Sie können 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.

Struktur der Aufrufstruktur

Screenshot that shows Call tree structure.

Screenshot that shows Call tree structure.

Image Beschreibung
Step 1 Der oberste Knoten in Aufrufstrukturen der CPU-Auslastung ist ein Pseudoknoten.
Step 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.
Step 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.
Step 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.

Screenshot that shows Show in Call Tree.

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.)

Screenshot that shows Show External Code.

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.

Screenshot that shows nested external code in the call tree.

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

Screenshot that shows nested external code in the call tree.

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.

Screenshot that shows Search for nested external code.

Screenshot that shows Search for nested external 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.

Screenshot that shows Asynchronous node.

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

Screenshot that shows expanded asynchronous node.

Screenshot that shows expanded asynchronous node.

  • 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.

Aufrufanzahl erfassen (.NET)

Wenn Sie die Aufrufanzahl in der Ansicht „Funktionen“ anzeigen möchten, können Sie die Einstellung aktivieren, bevor Sie den Profiler starten. Diese Einstellung wird für .NET-Projekttypen unterstützt und erfordert den Start des Prozesses unter dem Profiler. Das Anfügen-Szenario wird nicht unterstützt.

  1. Wählen Sie im Leistungs-Profiler das Symbol Einstellungen für CPU-Auslastung aus.

    Screenshot that shows the settings icon for CPU Usage.

  2. Aktivieren Sie die Option Aufrufanzahl erfassen (nur .NET).

    Screenshot that shows settings for CPU Usage.

  3. Erfassen Sie CPU-Auslastungsdaten.

  4. Öffnen Sie die Ansicht „Funktionen“, und stellen Sie dann sicher, dass die Sichtbarkeit der Spalte Aufrufanzahl festgelegt ist.

    Wenn die Spalte nicht angezeigt wird, klicken Sie mit der rechten Maustaste auf eine Spaltenüberschrift, um sichtbare Spalten auszuwählen.

    Screenshot that shows call count data.

Siehe auch