Что я должен сделать, чтобы IIS не перерабатывал мое приложение?

83

У меня есть приложение службы WCF, размещенное в IIS. При запуске он идет и выбирает действительно дорогой (с точки зрения времени и ресурсов) ресурс для использования в качестве локального кэша.

К сожалению, IIS, кажется, перерабатывает процесс на довольно регулярной основе. Поэтому я пытаюсь изменить настройки пула приложений, чтобы убедиться, что IIS не перезапускает приложение. Пока что я изменил следующее:

  • Предельный интервал под CPU от 5 до 0.
  • Тайм-аут простоя по модели процесса от 20 до 0.
  • Регулярный интервал времени при переработке с 1740 до 0.

Этого будет достаточно? И у меня есть конкретные вопросы о предметах, которые я изменил:

  1. Что конкретно означает настройка предельного интервала под процессором? Означает ли это, что при превышении определенной загрузки ЦП пул приложений будет переработан?
  2. Что именно означает «переработанный»? Приложение полностью снесено и снова запущено?
  3. В чем разница между «остановкой рабочего процесса» и «утилизацией пула приложений»? В документации по тайм-ауту простоя в рамках модели процесса рассказывается о завершении рабочего процесса. В то время как документы для Regular Time Interval в разделе Recycling рассказывают об утилизации пула приложений. Я не совсем понимаю разницу между ними. Я думал, что w3wp.exe - это рабочий процесс, который запускает пул приложений. Может кто-нибудь объяснить разницу в приложении между двумя?

Причина наличия тегов IIS7 и IIS7.5 заключается в том, что приложение будет работать в обоих случаях и надеяться, что ответы между версиями будут одинаковыми.

Изображение для справки: введите описание изображения здесь

AngryHacker
источник
Где вы взяли этот скриншот выше с настройками для IIS?
Эндрю Уильям Росс
Это лист свойств Advanced App Pool.
TristanK

Ответы:

105

Переработка отходов

Рециркуляция обычно *, когда IIS запускает новый процесс в качестве контейнера для вашего приложения, а затем передает старому значение ShutdownTimeLimit, чтобы удалить его по собственному желанию, прежде чем он будет убит.

* - обычно: см. настройку DisallowOverlappingRotation / «Disable overlapped recycle»

Это разрушительно , поскольку исходный процесс и вся информация о его состоянии отбрасываются. Использование состояния сеанса вне процесса (например, State Server или базы данных, или даже куки, если ваше состояние крошечное) может позволить вам обойти это.

Но он по умолчанию перекрывается - это означает, что продолжительность простоя минимизируется, потому что новый процесс запускается и подключается к очереди запросов, прежде чем старому сообщают: «у вас [ShutdownTimeLimit] секунд, чтобы уйти.

настройки

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

Реактивная переработка - это то, где WAS обнаруживает проблему и снимает процесс (после установления подходящей замены W3WP).

Теперь вот некоторые вещи, которые могут вызвать переработку той или иной формы:

  • ISAPI решает, что это вредно для здоровья
  • сбой любого модуля
  • время простоя
  • ограничение процессора
  • настройка свойств пула приложений
    • как могла однажды закричала твоя мама : «Хватит на нее ковыряться , иначе она никогда не станет лучше!»
  • сбой "ping" * на самом деле не ping, потому что он использует именованный канал - больше "обнаружение жизни"
  • все настройки на скриншоте выше

Что делать:

В общем:

  • Отключить время простоя . 20 минут бездействия = бум! Новый процесс при следующем входящем запросе. Установите это в ноль.

  • Отключить обычный интервал времени - по умолчанию 29-часовой период был описан различными сторонами как «безумный», «раздражающий» и «умный». На самом деле, только два из них являются правдой.

  • При желании включите DisallowRotationOnConfigChange (см. Выше, « Отключить повторный вызов для изменений конфигурации» ), если вы просто не можете прекратить играть с ним - это позволяет вам изменять любой параметр пула приложений без немедленного оповещения рабочих процессов о том, что его нужно убить. Вам нужно вручную переработать пул приложений, чтобы настройки вступили в силу, что позволяет предварительно настроить параметры, а затем использовать окно изменений, чтобы применить их в процессе перезапуска.

  • Как правило, оставьте пинг включенным . Это ваша сеть безопасности. Я видел, как люди выключали его, а затем иногда сайт зависал на неопределенное время, что приводило к панике ... поэтому, если настройки слишком агрессивны для вашего приложения, которое, по-видимому, очень-очень-очень медленно реагирует, отведите их немного назад и посмотрите, что вы получите, а не выключите его. (Если у вас не настроен дамп режима авто-сбоя для зависших W3WP через ваш собственный процесс мониторинга)

Этого достаточно, чтобы заставить хорошо себя вести процесс жить вечно. Если он умрет, конечно, он будет заменен. Если она висит, пинг должен выбрать , что и новая должны начаться в течение 2 -х минут (по умолчанию, в худшем случае известково должен быть: до частоты пинга + пинг тайма - аута + запуск лимита времени , прежде чем запросы снова начать работать).

Обычно ограничение ЦП не представляет интереса, потому что по умолчанию оно отключено и в любом случае настроено так, чтобы ничего не делать; если бы он был настроен на уничтожение процесса, это был бы триггер. Оставь это. Примечание для IIS 8.x, регулирование ЦП также становится опцией.

(IIS) AppPool не является (.Net) AppDomain (но может содержать один / несколько)

Но ... тогда мы попадаем на .Net land и перерабатываем AppDomain, что также может привести к потере состояния. (См .: https://blogs.msdn.microsoft.com/tess/2006/08/02/asp-net-case-study-lost-session-variables-and-appdomain-recycles/ )

Короткая версия, вы делаете что коснувшись файл web.config в папке содержимого (снова с захватным!), Либо путем создания папки в этой папке, или файл ASPX, или .. другие вещи ... и это о такой же разрушительный, как и повторное использование пула приложений, за вычетом затрат на запуск собственного кода (это просто концепция управляемого кода (.Net), поэтому здесь происходит только управление управляемым кодом).

Антивирус также может вызвать это, поскольку он сканирует файлы web.config, вызывая уведомление об изменении, вызывая ....

TristanK
источник
2
Подожди, подожди, подожди ... почему ЧТЕНИЕ web.config из Антивируса вызовет уведомление об изменении? Любой антивирус, который "касается" web.config без причины, является мусорным ведром.
Шив
AV может не только читать, но и записывать - например, в альтернативный поток данных, записывая версию механизма, использованную в последний раз для сканирования файла. Как мысль.
TristanK
7

Пожалуйста, проверьте,

Почему мы перерабатываем наши пулы приложений?

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

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

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

MSTdev
источник
3
Одной из причин было то, что .NET использует отдельную кучу для «больших объектов» (обычно 85 КБ или больше), которая не сжимается при сборке мусора (хотя в .NET 4.5.1 я думаю, что они добавили опцию для сжатия LOH), и в ASP.NET при рендеринге HTML на стороне сервера нередко видеть 85 КБ HTML (особенно для повторяющегося контента, такого как таблицы и сетки), и этот HTML в основном в какой-то момент является просто огромным объектом String на сервере, и если он квалифицируется как большой объект, он вносит вклад в фрагментацию кучи больших объектов, что в конечном итоге приводит к исключению OutOfMemoryException, что приводит к его повторной переработке
ничего лишнего
0

В зависимости от сценария OP (длительная инициализация при запуске / прогреве), еще одна вещь, которую необходимо проверить, это ограничение времени запуска (в секундах), значение по умолчанию которого составляет 90 секунд. Если инициализация занимает больше времени запуска, рабочий процесс может быть остановлен.

Алексей
источник