Problembehandlung bei hoher CPU-Auslastung in einem IIS-Anwendungspool
Gilt für: Internetinformationsdienste
Diese Problembehandlung hilft Ihnen, die Ursache für eine anhaltend hohe CPU-Auslastung in einem IIS-Anwendungspool (Internet Information Services) zu ermitteln. Es ist wichtig zu beachten, dass es normal ist, dass die CPU-Auslastung steigt, wenn eine Webanwendung Anforderungen verarbeitet. Wenn Sie jedoch feststellen, dass die CPU über einen längeren Zeitraum auf einem hohen Niveau (im Bereich von 80 % oder höher) bleibt, wird die Leistung Ihrer Anwendung beeinträchtigt. Aus diesem Grund ist es wichtig, die Ursache einer anhaltend hohen CPU-Auslastung zu verstehen, damit sie nach Möglichkeit behoben und korrigiert werden kann.
Szenario
Ein Anwendungspool in IIS weist einen längeren Zeitraum mit hoher CPU-Auslastung auf, der 90 % überschreitet. Wenn die Anwendung getestet wird, treten keine Probleme auf. Sobald die Anwendung jedoch die tatsächliche Benutzerauslastung erlebt, steigt die CPU auf einen hohen Prozentsatz und bleibt bestehen. Zur Wiederherstellung muss der Anwendungspool neu gestartet werden, aber danach steigt die CPU wieder auf ein hohes Niveau.
Tools
- Debugdiagnose (DebugDiag)
- Leistungsmonitor (Perfmon)
Datensammlung
Das erste, was Sie tun sollten, wenn Probleme mit hoher CPU-Auslastung auftreten, besteht darin, den Prozess zu bestimmen, der cpu verbraucht. Dazu können Sie die Registerkarte Prozesse im Task-Manager verwenden. Stellen Sie sicher, dass Sie das Kontrollkästchen Prozesse von allen Benutzern anzeigen aktivieren. Die folgende Abbildung zeigt, dass dieses Kontrollkästchen aktiviert ist, und der w3wp.exe
Prozess (der Prozess, der einen IIS-Anwendungspool hostet) zeigt, der eine hohe CPU-Auslastung verbraucht.
Sie können auch Leistungsmonitor verwenden, um zu bestimmen, welcher Prozess CPU verwendet. Weitere Informationen zur Verwendung von Leistungsmonitor finden Sie unter Analysieren von Leistungsdaten.
Tipp
Wenn Sie ermitteln müssen, welcher Anwendungspool einem bestimmten w3wp.exe Prozess zugeordnet ist, öffnen Sie eine Administrative Eingabeaufforderung, wechseln Sie in den %windir%\System32\inetsrv
Ordner cd %windir%\System32\inetsrv
, und führen Sie aus appcmd list wp
. Dadurch wird der Prozessbezeichner (PID) des w3wp.exe Prozesses in Anführungszeichen angezeigt. Sie können diese PID mit der im Task-Manager verfügbaren PID abgleichen.
Nachdem Sie bestätigt haben, dass ein w3wp.exe Prozess eine hohe CPU-Auslastung aufweist, müssen Sie die folgenden Informationen sammeln, um zu ermitteln, was das Problem verursacht:
- Ein Leistungsmonitor-Datensammlersatz.
- Ein Speicherabbild im Benutzermodus des w3wp.exe Prozesses.
Beides muss während des Ereignisses mit hoher CPU-Auslastung erfasst werden.
Sammeln eines Leistungsmonitor-Datensammlersatzes
Leistungsmonitor Daten sind häufig entscheidend für die Bestimmung der Ursache von Problemen mit hoher CPU-Auslastung. Dies kann auch äußerst hilfreich sein, um einen Überblick über die Leistung Ihrer Anwendung zu erhalten.
Perfmon-Daten können in Echtzeit angezeigt oder in einem Datensammlersatz gesammelt werden, der später überprüft werden kann. Zur Behandlung eines Problems mit hoher CPU-Auslastung müssen wir einen Datensammlersatz sammeln. Führen Sie die folgenden Schritte aus, um einen Datensammlersatz für die Problembehandlung bei hoher CPU-Auslastung zu erstellen.
- Öffnen Sie Im Windows-Systemsteuerung die Option Verwaltung.
- Doppelklicken Sie auf Leistungsmonitor.
- Erweitern Sie den Knoten Datensammlersätze .
- Klicken Sie mit der rechten Maustaste auf Benutzerdefiniert , und wählen Sie Neu ->Datensammlersatz aus.
- Geben Sie Hohe CPU als Namen des Datensammlersatzes ein.
- Wählen Sie Manuell erstellen (Erweitert) aus.
- Wählen Sie Weiter aus.
- Wählen Sie Datenprotokolle erstellen aus.
- Aktivieren Sie das Kontrollkästchen Leistungsindikator .
- Wählen Sie Weiter aus.
- Wählen Sie Hinzufügen. Wenn Ihre Anwendung keine ASP.NET Anwendung ist, fahren Sie mit Schritt 19 fort.
- Scrollen Sie zum Anfang der Liste der Leistungsindikatoren, und wählen Sie .NET CLR-Arbeitsspeicher aus.
- Wählen Sie in der Liste der Instanzen alle Instanzen aus<>.
- Wählen Sie Hinzufügen aus, um die Indikatoren der Liste der hinzugefügten Indikatoren hinzuzufügen.
- Wählen Sie in der Liste der Leistungsindikatoren ASP.NET und dann Hinzufügen aus.
- Wählen Sie ASP.NET Anwendungen aus der Liste der Leistungsindikatoren aus.
- Wählen Sie <alle Instanzen> aus der Liste der Instanzen aus.
- Wählen Sie Hinzufügen.
- Erweitern Sie Prozess aus der Liste der Leistungsindikatoren. (Stellen Sie sicher, dass Sie Prozess und nicht Prozessor erweitern.)
- Wählen Sie im Process-Objektdie Option Prozessorzeit in Prozent aus.
- Wählen Sie <alle Instanzen> aus der Liste der Instanzen aus.
- Wählen Sie Hinzufügen.
- Erweitern Sie Thread aus der Liste der Indikatoren.
- Wählen Sie im Thread-Objektdie Option Prozessorzeit in Prozent aus.
- Wählen Sie <alle Instanzen> aus der Liste der Instanzen aus.
- Wählen Sie Hinzufügen.
- Wählen Sie id Thread aus der Liste der Instanzen aus.
- Wählen Sie Hinzufügen.
Ihr Dialogfeld sollte nun wie in der folgenden Abbildung aussehen.
Wählen Sie OK ->Weiter aus. Notieren Sie sich, wo der Datensammlersatz gespeichert wird. (Sie können diesen Speicherort bei Bedarf ändern.) Wählen Sie dann Fertig stellen aus.
Der Datensammlersatz wird noch nicht ausgeführt. Klicken Sie zum Starten mit der rechten Maustaste auf Hohe CPU-Auslastung unter dem Knoten Benutzerdefinierter Knoten, und wählen Sie im Menü Start aus.
Erstellen einer Debugdiagnoseregel
Die einfachste Möglichkeit, Prozessabbilder im Benutzermodus zu sammeln, wenn eine hohe CPU-Auslastung auftritt, ist die Debugdiagnose.
Laden Sie DebugDiag herunter, installieren Sie es auf Ihrem Server, und führen Sie es aus. (Sie finden ihn nach der Installation im Startmenü .) Wenn Sie DebugDiag ausführen, wird das Dialogfeld Regeltyp auswählen angezeigt. Führen Sie die folgenden Schritte aus, um eine Absturzregel für Ihren Anwendungspool zu erstellen:
- Wählen Sie Leistung –>Weiter aus.
- Wählen Sie Leistungsindikatoren ->Weiter aus.
- Wählen Sie Add Perf Triggers (Perf-Trigger hinzufügen) aus.
- Erweitern Sie das Objekt Processor (nicht das Process-Objekt), und wählen Sie Prozessorzeit in % aus. Wenn Sie Windows Server 2008 R2 verwenden und über mehr als 64 Prozessoren verfügen, wählen Sie anstelle des Processor-Objekts das Objekt Prozessorinformationen aus.
- Wählen Sie in der Liste der Instanzen _Total aus.
- Wählen Sie Hinzufügen ->OK aus.
- Wählen Sie den neu hinzugefügten Trigger und dann Schwellenwerte bearbeiten aus.
- Wählen Sie oben in der Dropdownliste aus.
- Ändern Sie den Schwellenwert in 80.
- Geben Sie 20 als Anzahl von Sekunden ein. (Sie können diesen Wert bei Bedarf anpassen, achten Sie jedoch darauf, keine kleine Anzahl von Sekunden anzugeben, um falsche Trigger zu verhindern.)
- Wählen Sie OK aus.
- Wählen Sie Weiter aus.
- Wählen Sie Speicherabbildziel hinzufügen aus.
- Wählen Sie in der Dropdownliste Die Option Webanwendungspool aus.
- Wählen Sie Ihren Anwendungspool aus der Liste der App-Pools aus.
- Wählen Sie OK aus.
- Wählen Sie Weiter aus.
- Wählen Sie erneut Weiter aus.
- Geben Sie bei Bedarf einen Namen für Ihre Regel ein, und notieren Sie sich den Speicherort, an dem die Speicherabbilder gespeichert werden. Sie können diesen Speicherort bei Bedarf ändern.
- Wählen Sie Weiter aus.
- Wählen Sie Regel jetzt aktivieren und dann Fertig stellen aus.
Tipp
Sie können Speicherabbilder mehrerer Anwendungspools erstellen, indem Sie mehrere Speicherabbildziele mit derselben Technik hinzufügen, die in den Schritten 13 bis 15 verwendet wurde.
Diese Regel erstellt 11 Sicherungsdateien. Die ersten 10 werden "Minidumps" sein, die relativ klein sein werden. Das endgültige Speicherabbild ist ein Speicherabbild mit vollem Speicher, und diese Speicherabbilder sind viel größer.
Sobald das Problem mit hoher CPU-Auslastung aufgetreten ist, sollten Sie verhindern, dass der Perfmon-Datensammlersatz Daten sammelt. Klicken Sie dazu mit der rechten Maustaste auf den Datensammlersatz mit hoher CPU-Auslastung , der unter dem Knoten Benutzerdefinierter Knoten aufgeführt ist, und wählen Sie Beenden aus.
Datenanalyse
Nach dem Ereignis mit hoher CPU-Auslastung müssen Sie zwei Datensätze überprüfen. Der Perfmon-Datensammlersatz und die Speicherabbilder. Sehen wir uns zunächst die Perfmon-Daten an.
Analysieren von Leistungsdaten
Um die Perfmon-Daten für Ihr Problem zu überprüfen, klicken Sie mit der rechten Maustaste auf den Datensammlersatz mit hoher CPU-Auslastung , der unter dem Knoten Benutzerdefiniert aufgeführt ist, und wählen Sie Neuester Bericht aus. Es wird ein Bericht ähnlich dem folgenden Screenshot angezeigt.
Zunächst müssen Sie alle aktuellen Leistungsindikatoren entfernen, damit Sie explizite Indikatoren hinzufügen können, die Sie überprüfen möchten. Wählen Sie den ersten Leistungsindikator in der Liste aus. Scrollen Sie dann zum Ende der Liste, und wählen Sie den letzten Zähler aus, während Sie die UMSCHALTTASTE gedrückt halten. Nachdem Sie alle Leistungsindikatoren ausgewählt haben, drücken Sie die ENTF-TASTE, um sie zu entfernen.
Fügen Sie nun den Zähler Prozessprozessorzeit / mit den folgenden Schritten hinzu:
- Klicken Sie mit der rechten Maustaste auf eine beliebige Stelle im rechten Bereich von Perfmon, und wählen Sie Indikatoren hinzufügen aus.
- Erweitern Sie das Process-Objekt .
- Wählen Sie in der Liste % Prozessorzeit aus.
- Wählen Sie <alle Instanzen> aus der liste instance aus.
- Wählen Sie Hinzufügen.
- Wählen Sie OK aus.
Sie verfügen nun über eine Anzeige, die ein Diagramm der Prozessorzeit anzeigt, die von jedem Prozess auf dem Computer während der Ausführung des Datensammlersatzes verwendet wurde. Die einfachste Möglichkeit, zu isolieren, welcher Prozess die höchste CPU-Ebene verwendet hat, besteht darin, das Hervorhebungsfeature von Perfmon zu aktivieren.
Wählen Sie dazu den ersten Leistungsindikator in der Liste aus, und drücken Sie dann STRG+H. Danach wird der ausgewählte Prozess als fett formatierte schwarze Linie im Diagramm angezeigt.
Verwenden Sie den Pfeil nach unten auf der Tastatur, um durch die Liste der Prozesse nach unten zu navigieren, bis Sie den Prozess gefunden haben, der die meiste CPU-Auslastung anzeigt. Im folgenden Screenshot sehen Sie deutlich, dass der w3wp.exe-Prozess eine große Cpu-Menge auf dem Computer verwendet hat. Dadurch wird bestätigt, dass der IIS-Anwendungspool eine hohe CPU-Auslastung auf dem Computer verursacht.
Tipp
Perfmon kann sehr nützlich sein, um Leistungsprobleme in Ihrer Anwendung zu ermitteln. Die im Perfmon-Protokoll gesammelten Daten können Ihnen zeigen, wie viele Anforderungen ausgeführt werden (mithilfe der Objekte ASP.NET und ASP.NET Applications), und Sie können auch andere wichtige Leistungsdaten zur Leistung Ihrer Anwendung anzeigen.
Um zum Stamm der Ursachen des Problems mit hoher CPU-Auslastung zu gelangen, sehen wir uns die Mit DebugDiag erstellten Speicherabbilder an.
Speicherabbildanalyse mit DebugDiag
DebugDiag hat die Möglichkeit, viele Probleme durch eine automatisierte Speicherabbildanalyse zu erkennen. Für dieses spezielle Problem sind die DebugDiag-Leistungsanalysetools gut geeignet, um die Grundursache des Problems mit hoher CPU-Auslastung zu identifizieren. Führen Sie die folgenden Schritte aus, um das Analysetool zu verwenden.
- Wählen Sie in DebugDiag die Registerkarte Erweiterte Analyse aus.
- Wählen Sie die Leistungsanalyse aus.
- Wählen Sie Datendateien hinzufügen aus.
- Browser zu dem Speicherort, an dem die Speicherabbilder erstellt wurden. Standardmäßig ist dies ein Unterordner des Ordners C:\Programme\DebugDiag\Logs .
- Wählen Sie eines der Speicherabbilder aus, und drücken Sie dann STRG+A, um alle Speicherabbilder in diesem Ordner auszuwählen.
- Klicken Sie auf Öffnen.
- Wählen Sie Analyse starten aus.
DebugDiag benötigt einige Minuten, um die Speicherabbilder zu analysieren und eine Analyse bereitzustellen. Nach Abschluss der Analyse wird eine Seite angezeigt, die der in der folgenden Abbildung gezeigten ähnelt.
Beachten Sie, dass oben im Bericht angegeben wird, dass eine hohe CPU-Auslastung erkannt wurde. In der rechten Spalte werden Empfehlungen angezeigt, die einen Link zu den top 7 Threads nach durchschnittlicher CPU-Zeit enthalten. Wählen Sie diesen Link aus, und Sie sehen Informationen darüber, was diese wichtigsten CPU-Consumer getan haben. Der folgende Screenshot zeigt beispielsweise, was diese Threads in meiner Anwendung tun.
In diesem Beispiel wird die Seite default.aspx in der FastApp-Anwendung ausgeführt. Wenn Sie weiter unten in der Aufrufliste (unten auf der Seite) suchen, können Sie sehen, dass dieser Thread eine Zeichenfolgenverkettung durchführt. (Beachten Sie den Aufruf von System.String.Concat
in der Aufrufliste.) Wenn Sie die anderen top CPU-Threads analysieren, sehen Sie das gleiche Muster.
Der nächste Schritt besteht darin, das Page_Load
Ereignis auf der Seite default.aspx der FastApp-Anwendung zu überprüfen. Wenn ich das tue, finde ich den folgenden Code.
htmlTable += "<table>";
for (int x = 0; x < 5000; x++)
{
htmlTable += "<tr>" + "<td>" + "Cell A" + x.ToString() + "</td>";
htmlTable += "<td>" + "Cell B" + x.ToString() + "</td>" + "</tr>";
}
htmlTable += "</table>";
Diese Art von Code verursacht definitiv eine hohe CPU-Auslastung.
Zusammenfassung
Mithilfe von Perfmon und DebugDiag können Sie ganz einfach Daten sammeln, die hilfreich sein können, um die Ursache für eine hohe CPU-Auslastung in Anwendungspools zu ermitteln. Wenn Sie die Grundursache mit diesen Techniken nicht finden können, können Sie sich an den Microsoft-Support wenden, um weitere Unterstützung zu erhalten. Microsoft-Supporttechniker können Sie bei der Ermittlung der Ursache Ihres Problems unterstützen. Indem Sie die Perfmon-Daten und -Speicherabbilder beim Öffnen eines Falls vorbereiten, reduzieren Sie die Zeit, die die Techniker benötigen, um Sie zu unterstützen.