Назад | Перейти на главную страницу

Обрезка кеша ASP.NET знает об ограничении памяти пула приложений?

Я запускаю приложение ASP.NET на 32-битной Win2003, которое обычно выделяет много памяти. Чтобы избежать OutOfMemoryExceptions, которые начинают появляться, когда процесс W3P превышает 1 ГБ, я установил максимальный предел виртуальной памяти в 850 МБ для этого пула приложений, поэтому приложение будет перезапущено вместо того, чтобы генерировать исключения.

Эти перезапуски, хотя и не вызывают исключений, все же приводят к временному снижению производительности (низкий коэффициент попадания в кеш, компиляция aspx и т. Д.), Поэтому я хотел бы минимизировать количество перезапусков. Наблюдая за счетчиками производительности, я вижу, что кеш ASP.NET работает так, как задумано (количество элементов и коэффициент попадания в кеш увеличиваются после запуска, после того как некоторые элементы удаляются, вероятно, из-за истечения срока действия), за исключением обрезки кеша.

E. g. Я ожидал, что обрезка кеша сработает, когда e. грамм. 750 МБ занято, половина из них - кэш. Но этого не происходит, под нагрузкой продолжает выделять все больше памяти вместо e. грамм. убирать элементы кэша с низким приоритетом, пока не будет достигнут предел памяти.

Кто-нибудь знает, что на самом деле вызовет обрезку кеша? Доступная физическая память? Есть ли какие-либо другие настройки для оптимизации этого сценария?

(Да, я знаю, 32-битный - это 2004 год, а с x64 эта проблема исчезнет, ​​возможно, даже с тем же объемом памяти, но для этого приложения я застрял с этим сервером еще на несколько месяцев и должен поддерживать его Бег...)

Я наконец нашел проблему. Существует необязательный раздел конфигурации web.config для кеша ASP.NET: https://msdn.microsoft.com/en-us/library/ms164606(v=vs.100).aspx

Конфигурация по умолчанию для 32-битных боксов с более чем 2 ГБ ОЗУ - это полная ерунда: он начал бы выбрасывать элементы кеша, если бы менее 10% физической RAM доступен. Имея e. грамм. Установлено 4 ГБ ОЗУ и ограничение в 2 ГБ на процесс, этого никогда не произойдет. Таким образом, размер кеша (и, следовательно, размер кучи, в основном куча поколения 2) увеличивается и увеличивается, пока вы не столкнетесь с OutOfMemoryExceptions или не достигнете предела пула приложений.

Теперь я добавил это в свой web.config:

<configuration>
  <system.web>
    <caching>
      <cache privateBytesLimit="400000000" privateBytesPollTime="00:01:00" />
    </caching>
  </system.web>
</configuration>

Кроме того, я установил следующие ограничения для пула приложений:

  • Предел виртуальной памяти 1400 МБ
  • Лимит используемой памяти 800 МБ (личные байты)

Ознакомьтесь с этой замечательной статьей для ознакомления с этими ценностями: http://msdn.microsoft.com/en-us/library/ms972959#monitor_perf_topic10

Теперь, если я загружаю тестовое приложение таким образом, что множество объектов будет добавлено в кеш за короткое время, я вижу, что счетчик производительности обрезки кеша ASP.NET увеличивается, а использование памяти постоянно остается в пределах моих ограничений перезапуска.