Frage Wie können Sie wissen, was w3wp.exe macht? (oder wie man ein Performance-Problem diagnostiziert)


Ich habe ein Leistungsproblem in einer Website, die wir erstellt haben, und ich weiß nicht genau, wie ich mit der Diagnose beginnen soll.

Die kurze Beschreibung ist: Wir haben eine sehr kleine Seite (http://hearablog.com) mit sehr wenig Verkehr, in einem beschissenen dedizierten Server, CPU ist immer sehr hoch, manchmal bleibt es bei 100% für Minuten, und w3wp.exe nimmt das meiste davon. Ein typisches Szenario ist w3wp.exe dauert 60% und SQL Server dauert ca. 30%. Unsere DB ist auch ziemlich klein.

Lange Beschreibung und mehr Details:

  • Die Seite wird auf einem sehr beschissenen Server von Cari.Net gehostet. Wir hatten von Anfang an das Gefühl, dass sich der Server nicht richtig verhält, da einige Dinge einfach zu lange dauern würden, also könnte das von Anfang an ein Konfigurationsproblem sein. Es kann Es ist auch möglich, dass wir einen virtuellen Server bekommen, während wir einen dedizierten haben sollten, obwohl wir keine Beweise dafür haben, außer dass der Server ziemlich langsam ist.

  • Der Server ist Windows 2008 Standard 64-Bit mit SQL 2008 Express

  • Hardware ist ein Celeron 2,80 GHz, 1 GB RAM

  • Die Website wird in ASP.Net MVC mit Entity Framework für den Datenzugriff entwickelt.

  • Nun, das ist ziemlich beschissene Hardware, aber ich hatte andere Server mit diesen Leuten, mit äquivalenter (oder schlechterer) HW, und die Leistung ist viel besser als diese. Das heißt, die anderen Server haben W2003 und SQL2005, und ich verwende ASP.Net "WebForms" 2.0, keine MVC, keine LINQ, keine EF; also bin ich mir nicht sicher, ob das 2008 / das andere Zeug bedeutet, dass eine große Leistungsstrafe erwartet wird.

  • Ich liefere regelmäßig MP3-Dateien (5-20 Mb), was eine etwas ungewöhnliche Last ist, vielleicht verursacht das ein paar Probleme?
    Würde das dazu führen, dass w3wp viel CPU verbraucht?

  • Die Plattennutzung scheint sehr gering zu sein. Der Speicher liegt normalerweise bei etwa 90%, aber die Festplattenbelegung scheint darauf hinzudeuten, dass nicht viel gepuffert wird.

  • Ich bekomme Tonnen von E-Mails jeden Tag über SQL-Timeouts, für Abfragen, die über 30 Sekunden dauern, obwohl alle unsere Anfragen ziemlich einfach sind (oder sollten, aber EF kann es vermasseln).

So sieht der Ressourcenmonitor in einem dieser "Sprints" von 100% CPU aus, für den Fall, dass dort etwas Nützliches ist.

alt text

Und ein Schnappschuss einiger Leistungsindikatoren: alt text

Nun, was mich sehr verwirrt, ist, dass die CPU-Auslastung von w3wp gerade so hoch ist. Es sollte nicht viel wirklich machen ... Also meine Fragen sind ...

  • Gibt es eine Möglichkeit herauszufinden, "was" es macht? Vielleicht sogar Profil?
  • Irgendwelche Leistungsindikatoren, die ich betrachten sollte?
  • Ist dies bei dieser Hardware / Software-Konfiguration zu erwarten?
  • Könnte das durch eine Art Konfigurationsfehler verursacht werden, wo würdest du anfangen zu suchen?

Vielen Dank.
Daniel Magliola


41
2017-10-27 12:13


Ursprung




Antworten:


Sie können auch die Benutzeroberfläche von Worker Processes im IIS-Manager verwenden, um die gerade ausgeführten Anforderungen zu prüfen und festzustellen, wo sie ggf. hängen bleiben. Öffnen Sie den IIS-Manager-> Klicken Sie auf den Server im Baum-> Doppelklicken Sie auf Workerprozesse-> Doppelklicken Sie auf den Arbeitsprozess, der CPU verbraucht, um die aktuell ausgeführten Anforderungen in Echtzeit zu sehen, damit Sie sehen können, welches Modul Zeit benötigt.

Erwägen Sie auch die Verwendung fehlgeschlagener Anforderungsverfolgung, um einen Teil der Zeit pro Anfrage zu verfolgen, um zu sehen, wo sie lange brauchen.


40
2017-10-27 22:01



Das ist vielversprechend, es klingt tatsächlich GENAU, was ich sehen möchte, aber tatsächlich sind diese Bildschirme leer. Es zeigt anscheinend nur Anfragen, die länger als eine Sekunde dauern, gemäß dem großen Zeichen oben, und keine unserer Anfragen sind offensichtlich, weil die Liste leer ist. Irgendwelche Ideen, wie man mehr Anfragen zeigen kann? Wie erniedrige ich den 1s Filter? Vielen Dank! - Daniel Magliola
Sie können 0 in den Filter eingeben und auf Go klicken, wodurch der Wert auf 0 Sekunden gesetzt wird. Sie können auch über eine Eingabeaufforderung mit erhöhten Rechten "% windir% \ system32 \ inetsrv \ appcmd.exe-Listenanforderungen" ausführen. - Carlos Aguilar Mares
Vielen Dank Carlos! Dies ist, was ich getan habe, um die eine Anfrage zu finden (A cron wir haben), die meinen Server alle 5 Minuten tötete (es dauerte 3,5 Minuten, um zu laufen, so war es fast ständig bei 100% CPU). Vielen Dank!!! - Daniel Magliola
Diese UI hat mir mitgeteilt, auf welche URL zugegriffen wurde. Leider ist es ein POST zu einem asmx Webservice, und diese Daten sind nicht verfügbar. (Headbang) - Ross Presser


Ok, um zu starten - der Server ist wirklich beschissen. Aber es sollte genug sein.

  • Überprüfen Sie Ihre Treiber für die Virtualisierung. Ich kenne keine virutalization Plattform, die die CPU verbirgt (und ich cuebt, dass jemand ein hyper-v oder esx auf einem celeron aufstellt), aber die Fahrer für Scheibe etc. sind ein Hinweis.

  • CPU sollte nicht so hoch sein. Leider sind Sie mit diesem RAM so ziemlich Toast - wenn Sie anfangen, einen Profiler hinzuzufügen, werden Sie die Erinnerung, die Sie haben, ziemlich durcheinander bringen.

Ich würde:

  • Überprüfe die Logs auf Sachen, die in diesem Moment ausgeführt werden.
  • Aktualisieren Sie das Betriebssystem auf 2008 R2 - eine Menge mehr Informationen gibt es dort.

Zum Prüfen:

  • Erstellen Sie in Ihrer Entwicklungsumgebung eine Kopie der Site und führen Sie einige Leistungstests durch.
  • Machen Sie Profiling dort.
  • Verwenden Sie Failed REquest Tracking, um herauszufinden, welche Anfragen fehlschlagen.

http://learn.iis.net/page.aspx/266/troubleshooting-failed-requests-using-tracing-in-iis-7/

hat da angefangen. Dies kann Ihnen einen Hinweis geben, falls die Probleme mehr - hm - "kategorisierbar" sind.

Ich würde auch längerfristige Leistungsprotokolle führen. Achten Sie auf Ihre IO (Sekunden / lesen, Sekunden / schreiben sind so ziemlich die einzigen relevanten). Der ganze Rest ist IO zu vage - aber sobald Ihr IO beginnt länger zu nehmen, als es sollte, fallen die Discs zurück.

Ich würde an dieser Stelle ein Konfigurationsproblem ausschließen - zumindest als primären Indikator. Etwas verbraucht Ihre W3p-Ressourcen, jetzt müssen Sie herausfinden, was es ist.

Im Allgemeinen ist das kein Server, den ich gerne physisch hätte - es ist so klein, dass es keinen Sinn macht, dort eine Maschine zu haben. Virtuell wäre besser;)


5
2017-10-27 12:47



ich danke Ihnen sehr für Ihre Antwort. einige Fragen: Welche Logs würden Sie in diesem Moment auf Dinge überprüfen? (Tut mir leid, wenn das eine neue Frage ist) - Upgrade OS: Wir könnten das versuchen, aber ich fürchte, es könnte Dinge kaputt machen, vielleicht, wie sicher ist das? - Dev-Umgebung: Das Problem ist, dass es in meiner Entwicklungsumgebung funktioniert. CPU ist vernachlässigbar, Anfragen scheitern nicht, usw. - Daniel Magliola
Wie für I / O-Protokolle: Ich habe nur die Zähler, die Sie erwähnen, und sie sind alle auf 0, während die CPU hoch ist. Ich habe gerade einen Screenshot einiger Leistungsindikatoren hinzugefügt, die ich mir ansehe. Ich weiß, dass ein Schnappschuss nicht die ganze Geschichte erzählt, aber diese Werte sind tendenziell ziemlich stabil. Denken Sie, dass die Anzahl der aktuellen Verbindungen (für die ich keine Erklärung habe) ein Problem sein könnte? Irgendwelche Ideen, wie man herausfinden kann, was diese Verbindungen verlangen / tun? Irgendwelche anderen Zähler, die Sie denken, können nützlich sein, um so etwas zu diagnostizieren? - Daniel Magliola
Nun, R2 ist ziemlich sicher. Ich habe alles verbessert und nie ein Problem bekommen. Wie auch immer ... das ist ein CPU-Problem und es kann schrecklich sein, vor allem wenn man nicht genug Arbeitsspeicher hat, um einen Profiler zu installieren. Ich würde tatsächlich eine vollständige Neuinstallation versuchen. Ja, saugt, aber es bedeutet, dass Sie R2 frisch installieren können und sehen, ob das Problem weiterhin besteht. Schlimm ist, dass Sie kein Reservesystem haben, so dass Sie nicht erkennen können, ob das Problem "lokal" oder allgemeiner ist. Alternativ: Stoppen Sie IIS, löschen Sie auch alle verwendeten temporären Ordner - TomTom
zum Kompilieren und sehen, was passiert, wenn Sie neu starten. Mit R2 konnten Sie sehen, ob / welche Dateien von IIS offen gehalten werden. Ist dies lokal für eine Webanwendung oder ist es auch dort, wenn alle Websites gestoppt sind? Nächste Sache zu versuchen - schalten Sie alle Aufstellungsorte aus und finden Sie heraus, welcher bricht Sachen. - TomTom
Schließlich ist das Problem mit virtuellen Servern, dass, so weit ich herausgefunden habe, wir am Ende zahlen mehr oder das gleiche für die gleiche Hardware, plus, die Bandbreite Rechnung ist Killer (denken Sie daran, dass wir Audio-Dateien dienen). Wir werden in einen größeren Server umziehen, wenn wir müssen, aber ehrlich gesagt, mit dem Verkehr, den wir haben, muss es ein Problem geben, wir sollten nicht 100% CPU jemals verwenden. - Daniel Magliola


Sie könnten versuchen, ein Programm namens Process Explorer um einzelne Threads zu überwachen, die unter dem w3wp-Prozess ausgeführt werden. Es sollte dir erlauben zu sehen, welcher Thread den ganzen Schaden verursacht.


4
2017-10-27 21:04





Ich hatte wirklich großes Glück mit Microsofts Debug Diagnostic Tool, um meinen w3wp-Prozess auszugeben und dann die Threads und Stack-Traces nach Dingen zu checken, die sich blockierten. Es wird dir sogar die gewünschte Seite sagen, die den Thread erzeugt hat Super nett.

http://www.microsoft.com/en-us/download/details.aspx?id=26798


3
2017-09-06 03:33





Ich stimme TomTom auf der ganzen Linie zu, vor allem, wenn ich an dieser Stelle eine bessere Laufleistung von einem virtuellen Computer erziele. Debugging / Profiling lokal, um das Problem einzugrenzen, ist das Richtige zu tun.

Ich werde meinen Karnak-Hut und Umhang anziehen und nach dem ersten Umschlag fragen. Ram Rebellion. Was bekommst du, wenn du das OS, ASP.NET und einen gierigen SQL Server Express in 1GB steckst.

Ich glaube, dass Ihr Problem darin besteht, dass SQL Server Express den gesamten verfügbaren Arbeitsspeicher für einen Pufferpool einzieht und langsam freigegeben wird. Sehen http://support.microsoft.com/kb/321363 für mehr Informationen. Außerdem hat IIS einen Standardcache von 256 MB, den Sie möglicherweise optimieren müssen (https://stackoverflow.com/questions/2853135/controlling-asp-net-output-cache-memory-usage). Debug-Diagnose ist ein großartiges Werkzeug zur Fehlerbehebung (ok, wahrscheinlich ein Vorschlaghammer).

http://technet.microsoft.com/en-us/library/bb742546.aspx ist ein ziemlich anständiger Artikel zum Anschauen. http://social.technet.microsoft.com/forums/en-US/sharepointadmin/thread/706c653a-16b0-4696-85ee-9ae3552a582e Punkte auf App-Pool-Recycling verrückt als ein anderes mögliches Problem.


1
2017-10-27 13:37





Verwenden Sie den "Process" Leistungsindikator von Perfmon, um die einzelnen Attribute des w3wp.exe-Prozesses zu sehen. Wie viel CPU-Zeit für den Worker-Prozess ist die Kernel-Zeit? Hohe Kernel-Zeiten könnten ein Hinweis auf Paging sein, aber Sie sagen, Sie sind nicht überzeugt. Andere Möglichkeiten sind Duff-Treiber. Der Arbeitsprozess hat 23 Threads aktiv, was gut ist, aber was machen sie? Probieren Sie den ProcessExplorer von SysInternals aus, um etwas mehr zu erfahren. Sie können auch sehen, welche TCP / IP-Verbindungen im Spiel sind. Ich habe SQL Express nicht verwendet, aber es hat Speicheroptimierungsparameter, wie der große Bruder. Verlangsamt SQL den IIS des Speichers, was zu einem übermäßigen Paging führt?


1
2017-10-27 20:58



Mal sehen, ob ich das richtig mache ... Ich habe die% Prozessorzeit und% Benutzerzeitzähler hinzugefügt, beide für den w3wp-Prozess, und beide passen perfekt aufeinander. Bedeutet das, dass es keine Kernel-Zeit gibt, oder sehe ich das falsch an? (Entschuldigung, ich bin ein Neuling dabei) - Daniel Magliola


Es ist möglicherweise nicht vollständig verwandt, aber überprüfen Sie, ob Sie NOLOCK in Ihren Abfragen verwenden. Es könnte im Falle der SQL-Timeouts helfen.


0
2017-11-30 18:16