Problembehandlung bei hoher CPU in einem IIS-Anwendungspool
Gilt für: Internetinformationsdienste
Diese Problembehandlung hilft Ihnen, die Ursache einer anhaltenden hohen CPU in einem Internetinformationsdienste (IIS)-Anwendungspool zu identifizieren. Es ist wichtig zu bedenken, dass eine Steigerung der CPU-Auslastung normal ist, wenn eine Webanwendung Anfragen bedient. Wenn sie jedoch für längere Zeiträume konstant hohe CPU-Leistung feststellen (im Bereich von 80 % oder höher), leidet die Leistung Ihrer Anwendung. Aus diesem Grund ist es wichtig, die Ursache einer dauerhaft hohen CPU zu verstehen, damit sie ggf. behoben und korrigiert werden kann.
Szenario
Ein Anwendungspool in IIS erlebt einen längeren Zeitraum mit hoher CPU-Auslastung, die 90 % überschreitet. Wenn die Anwendung getestet wird, treten keine Probleme auf. Sobald die Anwendung jedoch die tatsächliche Benutzerauslastung erlebt, steigt die CPU-Leistung auf einen hohen Prozentwert und bleibt dort. Um sich zu erholen, muss der Anwendungspool neu gestartet werden, aber danach steigt die CPU-Leistung wieder auf ein hohes Niveau an.
Extras
- 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 dieses Kontrollkästchen aktiviert und zeigt den w3wp.exe
Prozess (der Prozess, der einen IIS-Anwendungspool hostt), der eine hohe CPU-Auslastung verbraucht.
Sie können auch den Leistungsmonitor verwenden, um zu bestimmen, welcher Prozess CPU-Leistung verbraucht. 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, und führen Sie den Vorgang cd %windir%\System32\inetsrv
aus appcmd list wp
. Dadurch wird die Prozesskennung (PID) des Prozesses „w3wp.exe“ 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 aufweist, müssen Sie die folgenden Informationen sammeln, um zu bestimmen, was das Problem verursacht:
- Einen Datensammlersatz des Leistungsmonitors.
- Ein Speicherauszug des „w3wp.exe“-Prozesses im Benutzermodus.
Beide müssen während des hohen CPU-Auslastungsereignisses erfasst werden.
Sammeln eines Leistungsmonitor Datensammlersatzes
Leistungsmonitor Daten sind häufig wichtig bei der Ermittlung der Ursache hoher CPU-Probleme. Sie können auch äußerst hilfreich sein, einen groben Überblick über die Leistung Ihrer Anwendung zu erhalten.
Die Perfmon-Daten können in Echtzeit angezeigt oder in einem Datensammlersatz gesammelt werden, der später überprüft werden kann. Um ein Problem mit hoher CPU-Nutzung zu beheben, müssen wir einen Datensammlersatz erfassen. Gehen Sie folgendermaßen vor, um einen Datensammlersatz für die Problembehandlung bei hohem CPU-Bedarf zu erstellen.
- Öffnen Sie die Verwaltung in der Systemsteuerung von Windows.
- Doppelklicken Sie auf Leistungsmonitor.
- Erweitern Sie den Knoten "Datensammlersätze ".
- Klicken Sie mit der rechten Maustaste auf "Benutzerdefiniert", und wählen Sie "New ->Data Collector Set" aus.
- Geben Sie "Hohe CPU" als Namen des Datensatzes für den Datensammler 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 <alle Instanzen> aus der Liste der Instanzen aus.
- Wählen Sie "Hinzufügen" aus, um die Zähler zur Liste der hinzugefügten Leistungsindikatoren hinzuzufügen.
- Wählen Sie ASP.NET aus der Liste der Leistungsindikatoren aus, und wählen Sie 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 erweitern Prozess und nicht Prozessor.)
- Wählen Sie %Prozessorzeit aus dem Process-Objekt aus.
- Wählen Sie <alle Instanzen aus der Liste der Instanzen> aus.
- Wählen Sie Hinzufügen.
- Erweitern Sie thread aus der Liste der Leistungsindikatoren.
- Wählen Sie %Prozessorzeit aus dem Threadobjekt aus.
- Wählen Sie <alle Instanzen aus der Liste der Instanzen> aus.
- Wählen Sie Hinzufügen.
- Wählen Sie den 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 " unter dem Knoten "Benutzerdefiniert ", und wählen Sie im Menü "Start" aus.
Erstellen einer Debugdiagnoseregel
Die einfachste Möglichkeit zum Sammeln von Prozessabbildern im Benutzermodus, wenn eine hohe CPU-Bedingung auftritt, besteht darin, die Debugdiagnose zu verwenden.
Laden Sie DebugDiag herunter, installieren Sie sie auf Ihrem Server, und führen Sie sie aus. (Sie finden es auf der Startmenü nach der Installation.) 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 "Perf-Trigger hinzufügen" aus.
- Erweitern Sie das Prozessorobjekt (nicht das Process)-Objekt, und wählen Sie %Prozessorzeit aus. Wenn Sie windows Server 2008 R2 verwenden und über mehr als 64 Prozessoren verfügen, wählen Sie das Prozessorinformationsobjekt anstelle des Prozessorobjekts 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 Auslöser und dann " Schwellenwerte bearbeiten" aus.
- Wählen Sie oben in der Dropdownliste aus.
- Ändern Sie den Schwellenwert auf 80.
- Geben Sie "20 " für die Anzahl der 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.)
- Klicken Sie auf OK.
- Wählen Sie Weiter aus.
- Wählen Sie " Dumpziel hinzufügen" aus.
- Wählen Sie im Dropdownmenü den Webanwendungspool aus.
- Wählen Sie Ihren Anwendungspool aus der Liste der App-Pools aus.
- Klicken Sie auf OK.
- Wählen Sie Weiter aus.
- Wählen Sie erneut Weiter aus.
- Geben Sie einen Namen für Ihre Regel ein, wenn Sie dies wünschen, und notieren Sie sich den Ort, an dem die Speicherabbilder gespeichert werden sollen. Sie können diesen Ort nach Belieben ä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 mithilfe der gleichen Technik hinzufügen, die in den Schritten 13 bis 15 verwendet wird.
Diese Regel erstellt 11 Speicherabbilddateien. Die ersten 10 sind „Minispeicherabbilder“ sein, die relativ klein sind. Das endgültige Speicherabbild ist ein Speicherabbild mit vollem Speicher, und die Speicherabbilder sind viel größer.
Nachdem das Problem mit hoher CPU-Leistung aufgetreten ist, möchten Sie beenden, dass der Perfmon-Datensammlersatz Daten erfasst. Klicken Sie dazu mit der rechten Maustaste auf den unter dem Knoten "Benutzerdefiniert" aufgeführten Datensammler mit der rechten Maustaste, und wählen Sie "Beenden" aus.
Datenanalyse
Nach dem Ereignis mit hoher CPU-Nutzung haben Sie zwei Datensätze, die überprüft werden sollen: den Perfmon-Datensammlersatz und die Speicherabbilder. Beginnen wir mit der Überprüfung der Perfmon-Daten.
Analysieren von Leistungsdaten
Um die Perfmon-Daten für Ihr Problem zu überprüfen, klicken Sie mit der rechten Maustaste auf den Unterknoten "Benutzerdefiniert" aufgeführten Datensatz mit der rechten Maustaste, und wählen Sie "Aktueller Bericht" aus. Es wird ein Bericht angezeigt, der dem folgenden Screenshot ähnelt.
Als Erstes entfernen Sie alle aktuellen Zähler, damit Sie explizite Zähler 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 ENTF, um sie zu entfernen.
Fügen Sie nun den Prozess / %-Prozessorzeitzähler mit den folgenden Schritten hinzu:
- Klicken Sie mit der rechten Maustaste auf eine beliebige Stelle im rechten Bereich von Perfmon, und wählen Sie "Zähler hinzufügen" aus.
- Erweitern Sie das Process-Objekt .
- Wählen Sie %Prozessorzeit aus der Liste aus.
- Wählen Sie <alle Instanzen> aus der Instanzliste aus.
- Wählen Sie Hinzufügen.
- Klicken Sie auf OK.
Sie haben nun eine Anzeige, die ein Diagramm der Prozessorzeit anzeigt, die von jedem Prozess auf dem Computer während der Ausführung des Datensammlersatzes verwendet wird. Die einfachste Möglichkeit zu isolieren, welcher Prozess das höchste CPU-Niveau verwendet hat, besteht darin, das Hervorhebungsfeature von Perfmon zu aktivieren.
Wählen Sie dazu den ersten Zähler in der Liste aus, und drücken Sie dann STRG+H. Nachdem Sie dies getan haben, wird der ausgewählte Prozess als fett formatierte schwarze Linie im Diagramm angezeigt.
Verwenden Sie den Pfeil nach unten auf der Tastatur, um in der Liste der Prozesse nach unten zu navigieren, bis Sie den Prozess finden, der die größte CPU-Auslastung anzeigt. Im folgenden Screenshot können Sie deutlich sehen, 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 bei der Ermittlung von Leistungsproblemen in Ihrer Anwendung sehr nützlich sein. Die im Perfmon-Protokoll gesammelten Daten können Ihnen zeigen, wie viele Anforderungen ausgeführt werden (mithilfe der Objekte ASP.NET und ASP.NET-Anwendungen), und sie können auch andere wichtige Leistungsdaten zur Leistung Ihrer Anwendung anzeigen.
Um der Ursache des Problems mit der hohen CPU-Leistung auf den Grund zu gehen, sehen wir uns die Speicherabbilder an, die mit DebugDiag erstellt wurden.
Dumpanalyse mit DebugDiag
DebugDiag ist in der Lage, viele Probleme zu erkennen, indem es eine automatische Speicherabbildanalyse durchführt. Für dieses spezielle Problem sind die Leistungsanalysatoren von DebugDiag gut geeignet, um die Grundursache für die hohe CPU-Leistung zu identifizieren. Gehen Sie folgendermaßen vor, um den Analysator 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.
- Navigieren Sie zu dem Ort, an dem die Speicherabbilder erstellt wurden. Standardmäßig ist dies ein Unterordner des Ordners "C:\Programme\DebugDiag\Logs ".
- Wählen Sie eines der Dumps aus, und drücken Sie dann STRG+A, um alle Dumps in diesem Ordner auszuwählen.
- Wählen Sie Öffnen aus.
- Analyse staren auswählen.
DebugDiag dauert ein paar Minuten, um die Dumps zu analysieren und eine Analyse bereitzustellen. Wenn die Analyse abgeschlossen ist, wird eine Seite ähnlich wie in der folgenden Abbildung angezeigt.
Beachten Sie, dass oben im Bericht angegeben wird, dass hohe CPU 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 werden Informationen darüber sehen, was die wichtigsten CPU-Verbraucher ausgeführt haben. Der folgende Screenshot zeigt beispielsweise, was diese Threads in meiner Anwendung tun.
In diesem Beispiel wird die default.aspx Seite in der FastApp-Anwendung ausgeführt. Wenn Sie den Aufrufstapel weiter unten (unten auf der Seite) betrachten, können Sie sehen, dass dieser Thread Zeichenfolgenverkettung durchführt. (Beachten Sie den Aufruf System.String.Concat
für den Aufrufstapel.) Wenn Sie die anderen top CPU-Threads analysieren, wird dasselbe Muster angezeigt.
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
Mit Hilfe von Perfmon und DebugDiag können Sie auf einfache Weise Daten sammeln, die bei der Ermittlung der Ursache von hoher CPU-Nutzung in Anwendungspools hilfreich sein können. Wenn Sie die Ursache für diese 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. Wenn Sie die Perfmon-Daten und Dumps bereit haben, wenn Sie einen Fall öffnen, reduzieren Sie erheblich die Zeit, die für die Techniker erforderlich ist, um Sie zu unterstützen.