Приложение ASP.NET на IIS7 - очень медленный запуск после iisreset

У меня есть веб-сайт ASP.NET 3.5, работающий под IIS7 в Windows 2008.

Когда я перезапускаю IIS (iisreset), а затем нажимаю страницу, начальный запуск происходит очень медленно.

В Process Explorer я вижу следующее действие:

  • w3wp.exe порождает, но показывает 0% CPU активность около 60 секунд.
  • Наконец, w3wp.exe переходит на 50% CPU для около 5 секунд, а затем страницу грузы.

В течение этого времени я не вижу никаких других процессов, использующих CPU. Это в основном просто зависает.

Что происходит в течение всего этого времени? Как я могу отслеживать, что происходит все это время?

Ответы

Ответ 1

Я обнаружил, что была сетевая задержка, начальная связь с веб-сервером на сервере базы данных.

Проблема была характерна для Windows 2008 и нашего конкретного сетевого оборудования.

Разрешение было отключить следующие веб-серверы:

Ответ 2

У нас была аналогичная проблема, и оказалось, что Windows тайм-аут проверяет отмену подписания сертификатов. Проверьте, не пытается ли ваш сервер где-нибудь позвонить (например, crl.microsoft.com). Возможно, у вас неправильная настройка прокси? Или брандмауэр в пути? В конечном итоге мы определили, что у нас достаточно контроля над сервером и мы не хотим "звонить домой", поэтому мы просто отключили проверку. Вы можете сделать это с помощью .NET 2.0 SP1 и более поздних версий, добавив следующее к machine.config.

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

Я не уверен, что вы можете просто поместить это в свой файл app.config/web.config.

Ответ 3

IL преобразуется в машинный собственный код (сборка) компилятором Just-In-Time, и вы можете ждать, пока происходит вся магия.

При компиляции исходного кода управляемый код, компилятор переводит источник в Microsoft промежуточного язык (MSIL). Это Независимый от процессора набор инструкций которые могут быть эффективно преобразованы в собственный код. Microsoft промежуточный язык (MSIL) - используемый перевод как результат ряда компиляторы. Это вклад в компилятор "точно в срок" (JIT). Common Language Runtime включает JIT компилятор для преобразования MSIL в собственный код.

До Microsoft Intermediate Language (MSIL) может быть выполнена, он должен быть преобразованный .NET Framework компилятор "точно в срок" (JIT) код. Это код, специфичный для процессора, который работает на одной компьютерной архитектуре как JIT-компилятор. Вместо использования времени и памяти для преобразования всех MSIL в переносном исполняемом файле (PE) файл на собственный код. Он преобразует MSIL по мере необходимости во время выполнения, затем кэширует полученный его доступным для любого последующего вызовы.

источник

Ответ 4

Это компиляция страниц asp.Net на промежуточном языке + компиляция JIT - это происходит только при первой загрузке страницы. (См. http://msdn.microsoft.com/en-us/library/ms366723.aspx)

Если это вас действительно беспокоит, вы можете остановить его из-за предварительной компиляции вашего сайта.

РЕДАКТИРОВАТЬ: Просто перечитайте вопрос - 60 секунд очень длинны, и вы ожидаете увидеть некоторую активность процессора за это время. Проверьте EventLog на наличие ошибок/сообщений в назначениях системы и приложения. Также попробуйте создать аварийный дамп процесса w3wp за эти 60 секунд - есть шанс, что вы сможете узнать, что он делает, глядя на некоторые из стеков вызовов.

Если он принимает ровно 60 секунд каждый раз, то вероятность того, что его ждет что-то в тайм-аут - 60 секунд - это хороший круглый номер. Убедитесь, что он имеет правильные подключения к контроллерам домена и т.д.

(Если есть некоторые диагностические инструменты IIS, которые бы сделали лучшую работу, то я боюсь, что я не знаю о них, этот вопрос может быть больше подходит для ServerFault, выше - это гораздо более основанный на разработчике подход к устранение неполадок: -p)

Ответ 5

Более 60 секунд звучит подозрительно. Попробуйте запустить страницу test.html, чтобы узнать, сколько времени потребуется. Это изолирует роль IIS7.

Затем временно переименуйте папки web.config, global.asax и приложения и попробуйте страницу test.aspx(очень простая страница). Это изолирует ASP.NET.

Если оба из них быстры (т.е. около 10 секунд), то это ваше приложение. Но, если они медленны, то не приложение и что-то с самим сервером.

Ответ 6

Эта шляпа не связана с компиляцией JIT. Обычный компилятор С# компилирует ваш код за файлами (.aspx.cs) на промежуточный язык в сборку при запуске, если эта сборка не существует или файлы кода были изменены. Ваша сборка веб-сайта находится в папке "bin" вашего веб-сайта.

Фактически после этого происходит компиляция JIT, но это очень быстро и не займет нескольких минут. Компиляция JIT происходит при каждом запуске приложения .net, и это займет не более нескольких секунд.

Вы можете избежать копания вашего веб-сайта, если вы разворачиваете уже собранную сборку веб-сайта (YourWebsite.dll) в папку bin. Также возможно развернуть только файлы aspx и оставить код за файлами (aspx.cs).