Приложение ASP.NET в IIS7 – очень медленный запуск после iisreset
-
10-07-2019 - |
Вопрос
У меня есть веб-сайт ASP.NET 3.5, работающий под управлением IIS7 в Windows 2008.
Когда я перезапускаю IIS (iisreset), а затем открываю страницу, первоначальный запуск происходит очень медленно.
Я вижу следующую активность в Process Explorer:
- W3WP.Exe Spawns, но показывает 0% активности процессора в течение около 60 секунд
- Наконец, W3WP.Exe переходит к 50% процессору в течение примерно 5 секунд, а затем страница загружается.
В это время я также не вижу никаких других процессов, использующих процессор.В основном просто висит.
Что происходит все это время?Как я могу отследить, что занимает все это время?
Решение 4
Я обнаружил, что при первоначальном подключении от внешнего веб-сервера к серверу базы данных произошла задержка в сети.
Проблема была характерна для Windows 2008 и нашего конкретного сетевого оборудования.
Решением было отключить на веб-серверах следующее:
Другие советы
У нас была аналогичная проблема, и выяснилось, что Windows истекает время проверки отзыва сертификатов подписи.Проверьте, не пытается ли ваш сервер куда-то позвонить (например,crl.microsoft.com).Возможно у вас неправильные настройки прокси?Или фаерволл мешает?В конечном итоге мы решили, что имеем достаточный контроль над сервером и не хотим «звонить домой», поэтому просто отключили проверку.Вы можете сделать это с помощью .NET 2.0 SP1 и более поздних версий, добавив следующее в файл Machine.config.
<runtime> <generatePublisherEvidence enabled="false"/> </runtime>
Я не уверен, что вы можете просто поместить это в свой app.config/web.config.
IL преобразуется в машинный код (Ассемблер) с помощью компилятора Just-In-Time, и вам придется ждать, пока произойдет вся магия.
При составлении исходного кода в управляемый код компилятор переводит источник на промежуточный язык Microsoft (MSIL).Это не независимый от процессора набора инструкций, который может эффективно преобразовать в собственный код.Microsoft Intermediate Language (MSIL) - это перевод, используемый в качестве вывода ряда компиляторов.Это вход для просто в срок (JIT) компилятора.Обычное время выполнения языка включает в себя компилятор JIT для преобразования MSIL в собственный код.
Перед тем, как Microsoft Intermediate Language (MSIL) может быть выполнен, должен быть преобразован с помощью компилятора .NET Framework Just-In-Time (JIT) в собственный код.Это код, специфичный для процессора, который работает на той же компьютерной архитектуре, что и компилятор JIT.Вместо того, чтобы использовать время и память, чтобы преобразовать все MSIL в портативном исполняемом (PE) файле в собственный код.Он преобразует MSIL по мере необходимости во время выполнения, а затем кэширует полученный собственный код, чтобы он был доступен для любых последующих вызовов.
Это компиляция страниц asp.Net в промежуточный язык + JIT-компиляция - это происходит только при первой загрузке страницы.(Видеть http://msdn.microsoft.com/en-us/library/ms366723.aspx)
Если это вас действительно беспокоит, вы можете предотвратить это, предварительно скомпилировав свой сайт.
РЕДАКТИРОВАТЬ: Просто перечитайте вопрос: 60 секунд — это очень долго, и в течение этого времени вы ожидаете увидеть некоторую активность процессора.Проверьте журнал событий на наличие ошибок/сообщений в пунктах назначения «Система» и «Приложение».Также попробуйте создать аварийный дамп процесса w3wp в течение этих 60 секунд — есть шанс, что вы сможете узнать, что он делает, просмотрев некоторые стеки вызовов.
Если это займет точно 60 секунд каждый раз, тогда вполне вероятно, что время ожидания чего-то истечет - 60 секунд - хорошее круглое число.Убедитесь, что он правильно подключен к контроллерам домена и т. д.
(Если есть какие-то инструменты диагностики IIS, которые справятся с этой задачей лучше, то, боюсь, я о них не знаю, этот вопрос может больше подходить для ServerFault, вышеописанный подход к устранению неполадок гораздо более ориентирован на разработчиков: - п)
Более 60 секунд звучит подозрительно.Попробуйте запустить страницу test.html и посмотрите, сколько времени это займет.Это изолирует роль IIS7.
Затем временно переименуйте папки web.config, global.asax и application и попробуйте страницу test.aspx (очень простая страница).Это изолирует ASP.NET.
Если оба из них быстрые (т.е.около 10 секунд), тогда это ваше приложение.Но если что-то медленное, то не приложение, а что-то с самим сервером.
Эта шляпа не имеет ничего общего с JIT-компиляцией.Обычный компилятор C# компилирует код файлов (.aspx.cs) в промежуточный язык в сборку при запуске, если эта сборка не существует или файлы кода изменились.Сборка вашего веб-сайта находится в папке «bin» вашего веб-сайта.
Фактически после этого происходит JIT-компиляция, но это очень быстро и не займет несколько минут.JIT-компиляция происходит при каждом запуске приложения .net, и это не займет больше секунды просмотра.
Вы можете избежать компиляции вашего веб-сайта, если развернете уже скомпилированную сборку веб-сайта (YourWebsite.dll) в папке bin.Также можно развернуть только файлы aspx и оставить код файлов (aspx.cs) отдельно.