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

27

Я занимаюсь разработкой сайтов на платформе .NET. Я обычно развертываю эти сайты на своем локальном IIS, чтобы я мог проверить их и увидеть их функциональность перед запуском. Тем не менее, каждый раз, когда я перезагружаю Windows, кажется, что сайты запускаются долго.

Я знаю о JIT, и я также знаю об этом вопросе , но он не отвечает на мой вопрос.

JIT происходит каждый раз, когда вы перезагружаете Windows? Это связано с созданием процесса w3wp.exe? Почему сайты так медленно работают при первом запросе после каждого перезапуска?

Саид Нямати
источник
3
Это известно как «холодный старт» или что-то в этом роде. Система должна загрузить w3wp в память, которая также требует всех связанных DLL, возможно, JIT, таблиц импорта процессов, чтения данных с диска, так как он не находится в кэш-памяти RAM и т. Д.
кодер
@ Кодер, +1 за ваш комментарий. Но не могли бы вы объяснить подробнее в ответе, чтобы я и другой разработчик воспользовались преимуществом. :)
Саид Нимати
IIS не моя специальность, поэтому я надеюсь, что кто-то даст лучший ответ. Вот похожая тема, которую я начал некоторое время назад stackoverflow.com/questions/3807791/cold-startup-optimization Может быть, это поможет еще немного.
Кодер
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 -До-скрипты /

Джоэл Этертон
источник
6
Это в основном правильно, но есть разница между компиляцией и джитингом, которая не ясна в этом ответе. Jitting компилирует байт-код .NET в машинный код. ASP.NET на самом деле компилирует эти веб-страницы, даже в проекте веб-приложения (если вы не используете aspnet_compiler). Все это время компиляции / сборки, плюс джиттинг и время загрузки библиотеки - вот почему это так медленно.
Aaronaught
JIT означает просто вовремя. Нет никакой разницы между «джитингом» и «компиляцией», кроме времени и количества компилируемого кода. Кроме того, 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, чтобы использовать это.

Есть также возможность выполнить некоторые дополнительные задачи, когда включается автозапуск, напр. предварительно загрузить данные в кеш.

Stief
источник
Обычно вы компилируете свой полный сайт перед тем, как поместить его на веб-сервер, поэтому код больше не нужно компилировать по первому запросу. JIT используется только для сайтов, использующих папку App_code, где вы публикуете свой исходный код на сайте.
Stief
2

Частью проблемы также является GAC. Места библиотек там должны будут проверяться на безопасность каждый раз, когда они загружаются - это означает, что выполняется целый ряд работ типа шифрования, и это сильно замедляет работу. Некоторое время назад от MS говорилось о производительности WPF, которая описывала эту проблему - их ответ был «не помещайте материал в GAC, если вы не можете с этим поделать»

gbjbaanb
источник
1
Это должно быть «может помочь», чтобы избежать двойного негатива
Ричард Сзалай
1

IIS имеет раздражающую (иногда) функцию для веб-сайтов с низким трафиком. Он перерабатывает неиспользуемые рабочие процессы - которые вызывают первого пользователя на сайт; иногда очень большая задержка (более 30 секунд). http://dotnettimes.wordpress.com/2014/03/24/fixing-slow-initial-load-for-iis-web-site/

S_007
источник