Dlaczego po każdym ponownym uruchomieniu moje lokalne witryny .NET ładują się po raz pierwszy? [Zamknięte]

27

Tworzę strony w oparciu o platformę .NET. Zazwyczaj wdrażam te witryny w lokalnych usługach IIS, aby móc je przetestować i sprawdzić ich funkcjonalność przed uruchomieniem. Jednak za każdym razem, gdy ponownie uruchamiam system Windows, wydaje się, że uruchamianie witryn po raz pierwszy zajmuje dużo czasu.

Wiem o JIT i jestem również świadomy tego pytania , ale to nie odpowiada na moje pytanie.

Czy JIT występuje przy każdym ponownym uruchomieniu systemu Windows? Czy to jest związane z tworzeniem procesu w3wp.exe? Dlaczego witryny są tak wolne w przypadku pierwszego żądania po każdym ponownym uruchomieniu?

Saeed Neamati
źródło
3
Jest to znane jako „zimny start” lub coś w tym rodzaju. System musi załadować w3wp do pamięci, która również potrzebuje wszystkich powiązanych bibliotek dll, prawdopodobnie JIT, procesów importowania tabel, odczytu danych z dysku, ponieważ nie ma go w pamięci podręcznej pamięci RAM itp.
Coder
@ Koder, +1 za komentarz. Ale czy możesz wyjaśnić więcej w odpowiedzi, abyśmy ja i inni programiści skorzystali z tej korzyści :)
Saeed Neamati
Usługi IIS nie są moją specjalnością, więc mam nadzieję, że ktoś udzieli lepszej odpowiedzi. Oto podobny temat, który zacząłem jakiś czas temu stackoverflow.com/questions/3807791/cold-startup-optimization Może to trochę pomoże.
Koder
4
To pytanie wydaje się nie na temat, ponieważ dotyczy kwestii implementacji, a nie problemu programowania koncepcyjnego.

Odpowiedzi:

32

Ten problem dotyczy kompilacji JIT. Pula aplikacji potrzebuje czasu na zbudowanie bibliotek, zanim zacznie je przetwarzać. Można to przyspieszyć za pomocą skryptu rozgrzewającego, ale to coś, co musi się wydarzyć. Zależy to również od tego, czy korzystasz ze strony internetowej, czy projektu aplikacji internetowej. Witryna jest JIT dla każdej strony, więc pierwsze trafienie jest powolne, a każde nowe trafienie strony również ma dodatkowy czas kompilacji. Projekty aplikacji internetowych są wstępnie skompilowane, więc nie powinno to być tak dotkliwe, ale biblioteki nadal muszą zostać załadowane. Im więcej bibliotek / narzędzi, tym gorsze jest to trafienie. Oto kilka linków omawiających rozgrzewkę:

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 /programming/2063461/iis-web-applications-warmup http://sharepoint.smayes.com/2011/06/application-pool-specific-warm -up-scripts /

Joel Etherton
źródło
6
Jest to w większości poprawne, ale istnieje różnica między kompilacją a łączeniem, która nie jest jasna w tej odpowiedzi. Jitting kompiluje kod bajtowy .NET do kodu maszynowego. ASP.NET faktycznie kompiluje te strony internetowe, nawet w projekcie aplikacji sieci Web (chyba że używasz kompilatora aspnet). Cały ten czas kompilacji / kompilacji, a także czas wiązania i ładowania biblioteki, jest tak powolny.
Aaronaught
JIT oznacza po prostu just-in-time. Nie ma różnicy między „łączeniem” a „kompilowaniem” poza czasem i ilością kompilowanego kodu. Ponadto kompilacja JIT ma miejsce tylko dla każdego nieodwiedzonego kodu , niekoniecznie dla każdej strony. Jeśli używają tego samego szablonu, np. Kompilacja nie jest konieczna. Uwaga, że ​​więcej bibliotek prowadzi do więcej czasu na kompilację, jest oczywiście prawdziwa.
Cornelius
9

Powolna reakcja na twoje pierwsze żądanie polega na tym, że IIS uruchamia / ładuje witrynę lub pulę aplikacji tylko przy pierwszym żądaniu przychodzącym. Po upływie określonego czasu żadne nowe przychodzące żądania nie przychodzą na serwer IIS ponownie zatrzymuje witrynę (recykling puli aplikacji).

ASP.NET 4.0 ma nową funkcję o nazwie auto-start. Dzięki tej funkcji możesz ustawić pulę aplikacji lub indywidualną witrynę, aby uruchamiała się przed żądaniami. Jest to uruchamiane podczas uruchamiania (podczas uruchamiania IIS) lub podczas aktualizacji witryny ASP.NET (która zatrzymuje witrynę).

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

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

Aby go użyć, potrzebujesz IIS 7.5.

Istnieje również opcja wykonania pewnych dodatkowych zadań, gdy rozpocznie się automatyczne uruchamianie, np. aby wstępnie załadować dane do pamięci podręcznej.

Stief
źródło
Zwykle kompilujesz całą witrynę, zanim umieścisz ją na serwerze WWW, więc kod nie musi być kompilowany na pierwsze żądanie. JIT jest używany tylko w przypadku witryn korzystających z folderu App_code, w którym publikujesz kod źródłowy w witrynie.
Stief,
2

Częścią problemu jest także GAC. Biblioteki tam, gdzie są, będą musiały być sprawdzane pod kątem bezpieczeństwa za każdym razem, gdy są ładowane - to oznacza, że ​​cały ładunek wykonywanego rodzaju szyfrowania jest wykonywany, a to znacznie spowalnia. Jakiś czas temu rozmawiano o wydajności WPF z MS, która opisywała ten problem - ich odpowiedź brzmiała: „nie wkładaj rzeczy do GAC, jeśli nie możesz na to poradzić”

gbjbaanb
źródło
1
To powinno „pomóc” uniknąć podwójnego negatywu
Richard Szalay