13 Stimmen

ASP.NET-Anwendung auf IIS7 - sehr langsamer Start nach iisreset

Ich habe eine ASP.NET 3.5-Website, die unter IIS7 auf Windows 2008 läuft.

Wenn ich IIS neu starte (iisreset) und dann eine Seite aufrufe, ist der erste Start sehr langsam.

Ich sehe die folgende Aktivität im Process Explorer:

  • w3wp.exe wird gestartet, zeigt aber 0% CPU Aktivität für etwa 60 Sekunden
  • Schließlich geht w3wp.exe auf 50% CPU für etwa 5 Sekunden und dann wird die Seite lädt.

Ich sehe auch keine anderen Prozesse, die während dieser Zeit die CPU belasten. Es hängt im Grunde nur.

Was ist in dieser Zeit los? Wie kann ich herausfinden, was diese ganze Zeit in Anspruch nimmt?

6voto

Sebastian Good Punkte 6232

Wir hatten ein ähnliches Problem, und es stellte sich heraus, dass Windows die Überprüfung auf den Widerruf von Signierzertifikaten verzögerte. Prüfen Sie, ob Ihr Server versucht, sich irgendwo zu melden (z. B. crl.microsoft.com). Vielleicht haben Sie eine falsche Proxy-Einstellung? Oder ist eine Firewall im Weg? Wir haben schließlich festgestellt, dass wir genug Kontrolle über den Server haben und nicht "nach Hause telefonieren" wollen, also haben wir die Prüfung einfach deaktiviert. Sie können dies mit .NET 2.0 SP1 und höher tun, indem Sie Folgendes zur machine.config hinzufügen.

<runtime> <generatePublisherEvidence enabled="false"/> </runtime>

Ich bin nicht sicher, ob Sie dies einfach in Ihre app.config/web.config aufnehmen können.

4voto

Ty. Punkte 3768

IL wird vom Just-In-Time-Compiler in maschinennativen Code (Assembly) umgewandelt, und Sie müssen warten, während der ganze Zauber passiert.

Beim Kompilieren des Quellcodes nach verwalteten Code, übersetzt der Compiler den Quellcode in die Microsoft-Zwischensprache Sprache (MSIL). Dies ist eine CPU-unabhängiger Satz von Anweisungen die effizient in nativen Code konvertiert werden können. nativen Code umgewandelt werden kann. Microsoft Zwischensprache Sprache (MSIL) ist eine Übersetzung, die als Ausgabe einer Reihe von Compilern verwendet wird. Sie ist die Eingabe für einen Just-in-Time-Compiler (JIT). Die Common Language Runtime enthält einen JIT Compiler für die Umwandlung von MSIL in nativen Code.

Vor Microsoft Intermediate Language (MSIL) ausgeführt werden kann, muss sie NET Framework konvertiert werden Just-in-Time-Compiler (JIT) in nativen Code Code umgewandelt werden. Dies ist CPU-spezifischer Code, der auf der gleichen Computerarchitektur läuft wie der JIT-Compiler. Anstatt mit Zeit und Speicher für die Konvertierung der gesamten MSIL in einer portablen ausführbaren Datei (PE) Datei in nativen Code umzuwandeln. Er konvertiert die MSIL nach Bedarf während der Ausführung um, dann den resultierenden nativen Code zwischengespeichert, so dass er für alle nachfolgenden Aufrufe Aufrufen.

Quelle

0 Stimmen

Wenn es sich um eine JIT-Kompilierung handeln würde, würde ich dann nicht csc.exe im Process Explorer sehen? Ich sehe nicht, dass csc.exe während der 60 Sekunden Wartezeit läuft.

0 Stimmen

@frankadelic csc.exe ist der C#-Compiler. Der JIT ist Teil von .NET und der Grund, warum .NET auf Rechnern mit C# installiert werden muss.

0 Stimmen

Egal, ob es sich um csc oder das JIT handelte, die CPU-Auslastung wurde angezeigt.

4voto

Justin Punkte 82143

Das ist die Kompilierung von Asp.Net-Seiten in eine Zwischensprache + JIT-Kompilierung - sie erfolgt nur beim ersten Laden der Seite. (Siehe http://msdn.microsoft.com/en-us/library/ms366723.aspx )

Wenn es Sie wirklich stört, können Sie es verhindern, indem Sie Ihre Website vorkompilieren.

EDIT: Lesen Sie sich die Frage noch einmal durch - 60 Sekunden sind sehr lang, und Sie sollten während dieser Zeit eine gewisse Prozessoraktivität erwarten können. Überprüfen Sie das EventLog auf Fehler/Meldungen in den Zielen System und Anwendung. Versuchen Sie auch, einen Crash-Dump des w3wp-Prozesses während dieser 60 Sekunden zu erstellen - es besteht die Möglichkeit, dass Sie erkennen, was er tut, wenn Sie sich einige der Aufrufstapel ansehen.

Wenn es dauert genau 60 Sekunden jedes Mal, dann ist es wahrscheinlich, dass er auf eine Zeitüberschreitung wartet - 60 Sekunden ist eine gute runde Zahl. Stellen Sie sicher, dass die Verbindungen zu den Domänencontrollern usw. ordnungsgemäß sind.

(Wenn es einige IIS-Diagnosetools, die eine bessere Arbeit tun würde, dann ich fürchte, ich bin mir nicht bewusst von ihnen, diese Frage könnte mehr geeignet sein, ServerFault, die oben ist eine viel mehr Entwickler-ish Ansatz zur Fehlerbehebung :-p)

0 Stimmen

Wie in anderen Kommentaren erwähnt - ich sehe keine csc.exe, die während dieser Verzögerung läuft.

4voto

frankadelic Punkte 19845

Ich habe festgestellt, dass es eine Netzwerkverzögerung bei der Herstellung der ersten Verbindung zwischen dem Frontend-Webserver und dem Datenbankserver gab.

Das Problem war eine Besonderheit von Windows 2008 und unserer speziellen Netzwerkhardware.

Die Lösung bestand darin, Folgendes auf den Webservern zu deaktivieren:

0 Stimmen

Für diejenigen, die eine Lösung für den langsamen Neustart von IIS suchen, versuchen Sie, das Verzeichnis der temporären ASP.Net-Dateien zu löschen. Es befindet sich in %windir% \Microsoft.NET\Framework [beide 64][Version] \Temporary ASP.NET-Dateien Sie können alles in diesem Ordner löschen, außer Dateien, die von IIS verwendet werden (Sie werden dazu aufgefordert). In meinem Fall verursachten 5 Gigabyte temporäre Dateien, dass unsere Website 8 Minuten nach der Bereitstellung neu gestartet wurde!

2voto

Scott Forsyth Punkte 1184

Mehr als 60 Sekunden klingt verdächtig. Versuchen Sie, eine test.html-Seite auszuführen, um zu sehen, wie lange das dauert. Das wird die Rolle von IIS7 eingrenzen.

Benennen Sie dann vorübergehend Ihre Ordner web.config, global.asax und application um und versuchen Sie eine test.aspx-Seite (eine sehr einfache Seite). Dadurch wird ASP.NET isoliert.

Wenn beide schnell sind (d. h. etwa 10 Sekunden), dann liegt es an Ihrer Anwendung. Wenn aber beide langsam sind, dann liegt es nicht an der Anwendung, sondern am Server selbst.

0 Stimmen

Die Test-HTML-Seite brauchte etwa 2 Sekunden nach dem iisreset. Wenn der IIS läuft und ich die web.config ändere, dauert es vielleicht 3 Sekunden, um eine ASPX-Testseite zu laden.

3 Stimmen

Das klingt, als ob IIS und ASP.NET gut laufen würden. Es muss etwas in der App sein, das dies verursacht. Wenn es nur beim ersten Laden langsam ist, dann ist es die Konversation in nativen Code. Haben Sie ein umfangreiches Projekt? Ich würde Ihre Projektart und -größe überprüfen und versuchen, es in Teile aufzuteilen oder vor dem Hochladen auf den Server zu kompilieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X