Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In dieser Fallstudie wird die Verwendung von Visual Studio-Profilerstellungstools veranschaulicht, um Leistungsprobleme in einem Beispiel ASP.NET Anwendung zu identifizieren und zu beheben. Einen Vergleich der Profilerstellungstools finden Sie unter Welches Tool sollte ich auswählen?
Sie lernen Folgendes:
- Wie man die Profiling-Tools von Visual Studio zur Analyse der Anwendungsleistung verwendet.
- So interpretieren Sie Profilerstellungsdaten, um Engpässe zu finden.
- Praktische Strategien zum Optimieren von Code mithilfe von .NET-Leistungsindikatoren, Anrufanzahlen und Zeitdauerdaten.
Wenden Sie diese Techniken an, um Ihre eigenen Anwendungen zu verbessern.
Isolieren eines Leistungsproblems – Fallstudie
Das Beispiel ASP.NET App führt Abfragen für eine simulierte Datenbank aus und basiert auf dem Diagnosebeispiel.
Wichtige Leistungssymptome:
- Niedrige CPU-Auslastung: Die CPU ist nicht der Engpass.
- Hohe Anzahl der ThreadPool-Threads: Die Anzahl der Threads steigt stetig, was darauf hinweist, dass der ThreadPool von Verarmung betroffen ist.
- Langsame Anwendungsantwort: Die App reagiert aufgrund fehlender verfügbarer Threads langsam.
In dieser Fallstudie werden Visual Studio-Profilerstellungstools zum Anheften und Beheben dieser Probleme verwendet, sodass Sie Ihren Code schneller und effizienter gestalten können.
Herausforderung
Das Beheben dieser Probleme umfasst mehrere Herausforderungen:
- Diagnostizieren von Engpässen: Geringe CPU-Auslastung mit langsamer Leistung kann mehrere Ursachen haben. Der effektive Einsatz von Profiler-Tools und das Interpretieren ihrer Ausgabe sind unerlässlich.
- Wissen und Ressourceneinschränkungen: Profilerstellung und Optimierung erfordern spezifische Fähigkeiten und Erfahrungen, die möglicherweise nicht immer verfügbar sind.
Ein strategischer Ansatz, der Profilerstellungstools, technische Kenntnisse und sorgfältige Tests kombiniert, ist der Schlüssel zur Überwindung dieser Herausforderungen.
Strategie
Hier ist eine generelle Übersicht der Vorgehensweise in dieser Fallstudie:
- Überwachen Sie zunächst .NET-Zählermetriken beim Sammeln von Leistungsdaten. Das .NET Counters-Tool von Visual Studio ist ein guter Ausgangspunkt.
- Um tiefere Erkenntnisse zu erhalten, sammeln Sie Ablaufverfolgungen mithilfe zusätzlicher Profilerstellungstools, etwa des Instrumentierungstools für Aufrufanzahl und Zeitsteuerungsdaten.
Für die Datensammlung sind die folgenden Aufgaben erforderlich:
- Legen Sie die App auf release build fest.
- Wählen Sie das Tool .NET-Leistungsindikatoren in Performance Profiler (ALT+F2) aus.
- Starten Sie die App, und erfassen Sie eine Ablaufverfolgung.
Leistungszähler überprüfen
Während der Ausführung der App beobachten wir die Zähler im .NET Counters-Tool. Für erste Untersuchungen sollten einige wichtige Kennzahlen im Auge behalten werden:
-
CPU Usage. Schauen Sie sich diesen Leistungsindikator an, um festzustellen, ob ein Leistungsproblem mit hoher oder geringer CPU-Auslastung auftritt. Dies kann ein Hinweis auf bestimmte Arten von Leistungsproblemen sein. Zum Beispiel:- Verwenden Sie bei hoher CPU-Auslastung das TOOL FÜR die CPU-Auslastung, um Bereiche zu identifizieren, in denen wir Code möglicherweise optimieren können. Ein Lernprogramm hierzu finden Sie in Fallstudie: Anfängerleitfaden zur Optimierung von Code.
- Verwenden Sie bei geringer CPU-Auslastung das Instrumentierungstool, um die Anrufanzahl und die durchschnittliche Funktionszeit basierend auf der Wanduhrzeit zu identifizieren. Dies kann dazu beitragen, Probleme wie z. B. Konflikte oder das Verhungern des Threadpools zu erkennen.
-
Allocation Rate. Für eine Web-App, die Anforderungen bedient, sollte die Rate relativ stabil sein. -
GC Heap Size. Sehen Sie sich diesen Zähler an, um zu überprüfen, ob die Speicherauslastung kontinuierlich zunimmt und potenziell undicht wird. Wenn es hoch erscheint, verwenden Sie eines der Speichernutzungstools. -
Threadpool Thread Count. Für eine Web-App, die Anforderungen bedient, sehen Sie sich diesen Indikator an, um festzustellen, ob die Threadanzahl konstant oder stetig steigt.
Hier ist ein Beispiel, das zeigt, wie die CPU Usage niedrig ist, während die ThreadPool Thread Count relativ hoch ist.
Eine stetig steigende Threadanzahl mit einer niedrigen CPU-Auslastung kann ein Indikator für den Hunger des Threadpools sein. Der Threadpool ist gezwungen, ständig neue Threads zu erstellen. Threadpool-Starvation tritt auf, wenn der Pool keine verfügbaren Threads zum Verarbeiten neuer Arbeitsaufgaben hat und häufig dazu führt, dass Anwendungen langsam reagieren.
Ausgehend von der geringen CPU-Auslastung, der relativ hohen Threadanzahl und der Theorie eines möglichen Mangels im Threadpool, sollten Sie zur Verwendung des Instrumentierungs-Tools übergehen.
Untersuchung der Anrufanzahlen und Zeitdaten
Sehen wir uns eine Ablaufverfolgung aus dem Instrumentierungs-Tool an, um mehr darüber herauszufinden, was mit den Threads los ist.
Nachdem wir die Ablaufverfolgung mithilfe des Instrumentierungstools erfasst und in Visual Studio geladen haben, überprüfen wir die anfängliche .diagsession-Berichtseite, auf der die zusammengefassten Daten angezeigt werden. In der erfassten Ablaufverfolgung verwenden wir den im Bericht aufgeführten Link Details öffnen und wählen dann Flammendiagramm aus.
Die Flame Graph-Visualisierung zeigt uns, dass die QueryCustomerDB-Funktion (in Gelb dargestellt) für einen erheblichen Teil der Laufzeit der App verantwortlich ist.
Klicken Sie mit der rechten Maustaste auf die QueryCustomerDB-Funktion und wählen Sie „Ansicht in Aufrufstruktur“ aus.
Der Codepfad mit der höchsten CPU-Auslastung in der App wird als hot pathbezeichnet. Das Symbol "Hot Path-Flamme" (
) kann dazu beitragen, Leistungsprobleme schnell zu erkennen, die möglicherweise verbessert werden.
In der Ansicht Aufrufstruktur können Sie sehen, dass der heiße Pfad die Funktion QueryCustomerDB enthält, was auf ein potenzielles Leistungsproblem hinweist.
Relativ zur Zeit, die in anderen Funktionen verbracht wurde, sind die Self und Avg Self Werte für die QueryCustomerDB Funktion sehr hoch. Im Gegensatz zu Total und Avg Totalschließen die Self-Werte die in anderen Funktionen aufgewendete Zeit aus, sodass dies ein guter Punkt ist, um den Leistungsengpass zu identifizieren.
Tipp
Wenn die Self-Werte relativ niedrig statt hoch waren, sollten Sie wahrscheinlich die tatsächlichen Abfragen betrachten, die von der QueryCustomerDB-Funktion aufgerufen werden.
Doppelklicken Sie auf die QueryCustomerDB-Funktion, um den Quellcode für die Funktion anzuzeigen.
public ActionResult<string> QueryCustomerDB()
{
Customer c = QueryCustomerFromDbAsync("Dana").Result;
return "success:taskwait";
}
Wir recherchieren ein wenig. Alternativ können wir Zeit sparen und Copilot die Forschung für uns durchführen lassen.
Wenn wir Copilotverwenden, wählen Sie im Kontextmenü "Copilot fragen" aus, und geben Sie die folgende Frage ein:
Can you identify a performance issue in the QueryCustomerDB method?
Tipp
Sie können Slash-Befehle wie /optimize verwenden, um gute Fragen für Copilot zu bilden.
Copilot teilt uns mit, dass dieser Code eine asynchrone API aufruft, ohne await zu verwenden. Dies ist das sync-over-async-Codemuster, das eine häufige Ursache für das Verhungern des Threadpools ist und Threads blockieren kann.
Um das Problem zu lösen, verwenden Sie "await". In diesem Beispiel gibt Copilot den folgenden Codevorschlag zusammen mit der Erläuterung.
public async Task<ActionResult<string>> QueryCustomerDB()
{
Customer c = await QueryCustomerFromDbAsync("Dana");
return "success:taskwait";
}
Wenn Leistungsprobleme im Zusammenhang mit Datenbankabfragen angezeigt werden, können Sie das Datenbanktool verwenden, um zu untersuchen, ob bestimmte Aufrufe langsamer sind. Diese Daten können auf eine Möglichkeit zum Optimieren von Abfragen hinweisen. Ein Lernprogramm, das zeigt, wie Sie mithilfe des Datenbanktools ein Leistungsproblem untersuchen können, finden Sie in Fallstudie: Leitfaden für Anfänger zum Optimieren von Code. Das Datenbanktool unterstützt .NET Core entweder mit ADO.NET oder Entity Framework Core.
Um Visualisierungen in Visual Studio für das einzelne Threadverhalten abzurufen, können Sie das fenster Parallel Stacks beim Debuggen verwenden. In diesem Fenster werden einzelne Threads zusammen mit Informationen über wartende Threads, Threads, auf die sie warten und Deadlocks angezeigt.
Weitere Informationen zu Mängeln in Threadpools finden Sie unter Erkennen von Threadpool-Mangel.
Nächste Schritte
Die folgenden Artikel und Blogbeiträge enthalten weitere Informationen, die Ihnen helfen, die Visual Studio-Leistungstools effektiv zu verwenden.
- Fallstudie: Leitfaden für Anfänger zur Optimierung von Code
- Fallstudie: Doppelte Leistung in weniger als 30 Minuten
- Verbessern der Visual Studio-Leistung mit dem neuen Instrumentierungstool