Чому після кожного перезавантаження мої локальні .NET-сайти потребують часу для першого завантаження? [зачинено]


27

Я розробляю сайти на платформі .NET. Зазвичай я розгортаю ці сайти на своєму локальному IIS, щоб я міг протестувати їх і побачити їх функціональність перед тим, як перейти в прямому ефірі. Однак щоразу, коли я перезавантажую Windows, здається, що сайти потребують тривалого запуску вперше.

Я знаю про JIT і мені також відомо про це питання , але воно не відповідає на моє запитання.

Чи відбувається JIT щоразу, коли ви перезапускаєте Windows? Це пов'язано зі створенням процесу w3wp.exe? Чому сайти так повільні для першого запиту після кожного перезавантаження?


3
Це відомо як "холодний старт" чи щось таке. Система повинна завантажити w3wp в пам'ять, яка також потребує всіх пов'язаних dll, можливо, JIT-матеріалів, обробляти таблиці імпорту, читати дані з диска, оскільки це не в кеш-пам’яті оперативної пам’яті тощо.
Coder

@Coder, +1 для вашого коментаря. Але ви можете, будь ласка, пояснити більше у відповіді, щоб я та інший розробник користувалися благами. :)
Saeed Neamati

IIS - це не моя спеціальність, тому я сподіваюся, що хтось дасть кращу відповідь. Ось подібна тема, яку я розпочав деякий час тому stackoverflow.com/questions/3807791/cold-startup-optimization Можливо, це допоможе ще трохи.
Coder

4
Це питання видається поза темою, оскільки йдеться про проблему впровадження, а не про концептуальну програмування.

Відповіді:


32

Ця проблема - компіляція JIT. Пул додатків потребує часу для складання бібліотек, перш ніж він може розпочати їх обробку. Це можна прискорити за допомогою сценарію розминки, але це має відбутися. Це також залежить від того, ви використовуєте веб-сайт або проект веб-додатків. Веб-сайт - це JIT для кожної сторінки, тому перше звернення відбувається повільно, і кожен звернення на нову сторінку також має додатковий час для компіляції. Проекти веб-додатків попередньо складені, тому не слід зазнавати цього удару так сильно, але бібліотеки все ще потрібно завантажувати. Чим більше бібліотек / інструментів у вас, тим гірше схильний цей хіт. Ось кілька посилань, які обговорюють розминку:

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-скрипти /


6
Це здебільшого правильно, але є різниця між компіляцією та джитінгам, що не ясно в цій відповіді. Jitting - це компіляція .NET байтового коду до машинного коду. ASP.NET насправді збирає ці веб-сторінки, навіть у проекті веб-додатків (якщо ви не використовуєте aspnet_compiler). Весь час компіляції / складання, а також час завантаження та завантаження бібліотеки, тому так повільно.
Aaronaught

JIT просто означає просто час. Не існує різниці між "jitting" та "compiling", поза тимчасовим та кількістю компільованого коду. Також компіляція JIT відбувається лише для кожного нерозвіданого коду , не обов'язково для кожної сторінки. Якщо вони використовують один і той же шаблон, наприклад, компіляція не потрібна. Звичайно, цілком вірно зауваження, що більша кількість бібліотек призводить до того, що потрібно більше часу для збирання.
Корнелій

9

Повільна реакція на ваш перший запит полягає в тому, що IIS лише запускає / завантажує сайт або пул додатків під час першого вхідного запиту. Після закінчення певного часу нові сервіси, що надходять, на сервер IIS знову не зупиняють сайт (переробка пулу додатків).

ASP.NET 4.0 має нову функцію під назвою автозапуск. За допомогою цієї функції ви можете встановити пул додатків або окремий сайт для запуску перед будь-якими запитами. Це спрацьовує під час завантаження (коли запускається IIS) або під час оновлення сайту ASP.NET (який зупиняє сайт).

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

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

Для цього вам потрібен IIS 7.5.

Також є можливість виконувати певні додаткові завдання, коли автозапуск починається, наприклад. для попереднього завантаження даних у кеш.


Зазвичай ви складаєте повний сайт перед тим, як розмістити його на веб-сервері, тому код не потрібно більше компілювати за першим запитом. JIT використовується лише для сайтів, що використовують папку App_code, де ви публікуєте свій вихідний код на веб-сайті.
Стіф

2

Частиною проблеми є також GAC. Місця, що там знаходяться в бібліотеках, повинні перевіряти безпеку кожного разу, коли вони завантажуються - це означає, що виконується ціле навантаження роботи типу шифрування, і це значно сповільнює роботу. Нещодавно від МС говорили про ефективність WPF, яка описувала цю проблему - їх відповідь була "не вкладайте речі в GAC, якщо ви не можете в цьому допомогти".


1
Це повинно бути "може допомогти", щоб уникнути подвійного негативу
Річард Шалай

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.