Приложение ASP.NET на IIS сбрасывает статические ресурсы из памяти - PullRequest
0 голосов
/ 05 июля 2019

У меня есть веб-приложение ASP.Net, которое размещено на IIS (Windows 2012R2 / IIS 8.5). Приложение постоянно отбрасывает статические ресурсы (т. Е. Статические классы / коллекции) из памяти, вызывая значительное замедление при случайных запросах.

Обычно это происходит, когда рабочая память процесса IIS пересекает около 900 МБ (при настройке разработки, общий объем памяти 4 ГБ), а затем уменьшается до 350 МБ. То же самое происходит в нашей производственной установке (16 ГБ памяти и приложение потребляют не более 1,9 ГБ, а затем уменьшаются до 800 МБ)

Настройка :

  • Windows 2012 R2
  • IIS 8,5
  • Целевая структура: 4.7.2
  • Платформа Цель: X64 (я заставил ее X64 из Any CPU исключить 32-разрядные ограничения памяти).

Настройка IIS:

  • .Net CLR версия: 4.0
  • Включить 32-битные приложения: False
  • Режим запуска: всегда работает
  • Время ожидания простоя: 0
  • Действие тайм-аута в режиме ожидания: Приостановить
  • Предел частной памяти: 0

Итак, как вы можете видеть, я исключил почти все, что мог придумать. Есть ли причина постоянных падений? Разве .Net CLR не должен хранить статические классы в памяти и не удалять их случайным образом? или я что-то упустил?

1 Ответ

0 голосов
/ 05 июля 2019

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

По умолчанию IIS настраивает пулы своих приложений на перезапуск каждые 29 часов (1740 минут), что означает, что он не будет перезагружаться в одно и то же время каждый день, но будет перезагружаться. Однако по умолчанию он должен выполнить «перекрывающуюся перезапуск», когда он вызывает новый экземпляр до того, как выключит старый.

Существует несколько опций, которые могут помочь, если это вызвано событиями перезапуска:

  1. Отключите утилизацию, установив «Регулярный интервал времени» на 0.
  2. Оставьте его включенным, но используйте функции Application Initialization для правильного прогрева приложения. Это часть IIS 8 и модуль, который можно установить в версии 7.5.

Вы уже установили режим запуска на Always Running, но с помощью модуля инициализации приложения вы также можете объявить страницу , которую сервер запросит во время запуска, чтобы прогреть ваше приложение:

<system.webServer>
   <applicationInitialization
      doAppInitAfterRestart="true">
      <add initializationPage="/default.aspx" hostName="myhost"/>
   </applicationInitialization>
</system.webServer>
...