Приложение ASP.NET на IIS7 - очень медленный запуск после iisreset - PullRequest
13 голосов
/ 18 сентября 2009

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

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

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

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

Я не вижу других процессов, использующих ЦП в это время. В основном просто зависает.

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

Ответы [ 6 ]

6 голосов
/ 31 декабря 2009

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

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

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

4 голосов
/ 05 ноября 2010

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

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

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

4 голосов
/ 18 сентября 2009

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

Если это действительно беспокоит вас, вы можете остановить это, предварительно скомпилировав свой сайт.

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

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

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

4 голосов
/ 18 сентября 2009

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 по мере необходимости во время выполнения, затем кэширует результирующий нативный код, он доступен для любого последующего вызовов.

источник

2 голосов
/ 18 сентября 2009

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

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

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

1 голос
/ 18 сентября 2009

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

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

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

...