Warum dauert es nach jedem Neustart einige Zeit, bis meine lokalen .NET-Sites zum ersten Mal geladen sind? [geschlossen]

27

Ich entwickle Websites auf Basis der .NET-Plattform. Normalerweise stelle ich diese Sites auf meinem lokalen IIS bereit, damit ich sie testen und ihre Funktionalität überprüfen kann, bevor sie live geschaltet werden. Bei jedem Neustart von Windows scheint es jedoch sehr lange zu dauern, bis Websites zum ersten Mal ausgeführt werden.

Ich kenne JIT und bin mir auch dieser Frage bewusst , aber sie beantwortet meine Frage nicht.

Passiert JIT bei jedem Neustart von Windows? Steht es im Zusammenhang mit der Erstellung des Prozesses w3wp.exe? Warum sind Websites für die erste Anforderung nach jedem Neustart so langsam?

Saeed Neamati
quelle
3
Dies ist als "Kaltstart" oder so etwas bekannt. Das System muss das w3wp in den Speicher laden, der auch alle zugehörigen DLLs benötigt, wahrscheinlich JIT-Dateien, Importtabellen verarbeiten, Daten von der Festplatte lesen, da es sich nicht im RAM-Cache befindet usw.
Coder
@Coder, +1 für deinen Kommentar. Aber könntest du bitte in einer Antwort mehr erklären, damit ich und andere Entwickler davon profitieren würden. :)
Saeed Neamati
IIS ist nicht meine Spezialität, deshalb hoffe ich, dass jemand eine bessere Antwort gibt. Hier ist ein ähnliches Thema, mit dem ich vor einiger Zeit begonnen habe: stackoverflow.com/questions/3807791/cold-startup-optimization Vielleicht hilft es etwas mehr.
Coder
4
Diese Frage scheint nicht zum Thema zu gehören, da es sich um ein Implementierungsproblem und nicht um ein konzeptionelles Programmierproblem handelt.

Antworten:

32

Dieses Problem ist die JIT-Kompilierung. Der Anwendungspool benötigt Zeit, um die Bibliotheken zu erstellen, bevor er sie verarbeiten kann. Dies kann mithilfe eines Aufwärmskripts beschleunigt werden, dies muss jedoch geschehen. Dies hängt auch davon ab, ob Sie eine Website oder ein Webanwendungsprojekt verwenden. Eine Website ist JIT für jede Seite, so dass der erste Treffer langsam ist und jeder neue Seitenzugriff auch eine zusätzliche Kompilierungszeit hat. Webanwendungsprojekte sind vorkompiliert, daher sollte dieser Treffer nicht so schlimm sein, aber die Bibliotheken müssen noch geladen werden. Je mehr Bibliotheken / Tools Sie haben, desto schlimmer wird dieser Treffer. Hier sind einige Links, die sich mit dem Aufwärmen befassen:

http://weblogs.asp.net/gunnarpeipman/archive/2010/01/22/iis-application-warm-up-module.aspx http://blogs.iis.net/steveschofield/archive/2009/05/30 /application-pool-warm-up.aspx https://stackoverflow.com/questions/2063461/iis-web-applications-warmup http://sharepoint.smayes.com/2011/06/application-pool-specific-warm -up-Skripte /

Joel Etherton
quelle
6
Dies ist größtenteils richtig, aber es gibt einen Unterschied zwischen Kompilieren und Jitting, der in dieser Antwort nicht klar ist. Jitting kompiliert den .NET-Bytecode in Maschinencode. ASP.NET kompiliert diese Webseiten sogar in einem Webanwendungsprojekt (es sei denn, Sie verwenden den aspnet_compiler). Die gesamte Kompilierungs- / Erstellungszeit sowie die Ladezeit für das Jitting und die Bibliothek ist der Grund, warum sie so langsam ist.
Aaronaught
JIT steht für Just-in-Time. Es gibt keinen Unterschied zwischen "Jitting" und "Compilieren", außer dem Timing und der Menge des Codes, der kompiliert wird. Außerdem erfolgt die JIT-Kompilierung nur für jeden nicht besuchten Code , nicht unbedingt für jede Seite. Wenn sie dieselbe Vorlage verwenden, ist z. B. keine Kompilierung erforderlich. Die Bemerkung, dass mehr Bibliotheken zu mehr Zeit für das Kompilieren führen, ist natürlich völlig richtig.
Cornelius
9

Die langsame Reaktion auf Ihre erste Anforderung ist, dass IIS eine Site oder einen Anwendungspool nur bei der ersten eingehenden Anforderung startet / lädt. Nach einer festgelegten Zeitspanne wird die Site von IIS nicht mehr angehalten, wenn neue eingehende Anforderungen eingehen (Recycling des App-Pools).

ASP.NET 4.0 verfügt über eine neue Funktion, die als Autostart bezeichnet wird. Mit dieser Funktion können Sie einen Anwendungspool oder eine einzelne Site so einrichten, dass sie sich selbst startet, bevor Anforderungen gestellt werden. Dies wird beim Start (beim Starten von IIS) oder beim Aktualisieren einer ASP.NET-Site (die die Site anhält) ausgelöst.

<applicationPools>
    <add name="MyAppPool" managedRuntimeVersion="v4.0" startMode="AlwaysRunning" />
</applicationPools>

<sites>
    <site name="MySite" id="1">
        <application path="/" serviceAutoStartEnabled="true" />
    </site>
</sites>

Sie benötigen dazu IIS 7.5.

Es gibt auch eine Option, um bestimmte zusätzliche Aufgaben auszuführen, wenn der Autostart einsetzt, z. um Daten in den Cache vorzuladen.

Dieb
quelle
Normalerweise kompilieren Sie Ihre vollständige Site, bevor Sie sie auf den Webserver stellen, sodass der Code bei der ersten Anforderung nicht mehr kompiliert werden muss. JIT wird nur für Websites verwendet, die den Ordner App_code verwenden, in dem Sie Ihren Quellcode auf der Website veröffentlichen.
Stief
2

Ein Teil des Problems ist auch der GAC. Die Bibliotheken müssen dort bei jedem Laden auf ihre Sicherheit überprüft werden - das bedeutet, dass eine ganze Reihe von Verschlüsselungsaufgaben ausgeführt werden, was die Arbeit erheblich verlangsamt. Vor einiger Zeit gab es einen Vortrag über die WPF-Leistung von MS, in dem dieses Problem beschrieben wurde. Die Antwort lautete: "Gib nichts in das GAC, wenn du nichts dagegen tun kannst."

gbjbaanb
quelle
1
Das sollte "kann helfen" sein, um ein doppeltes Negativ zu vermeiden
Richard Szalay