Я запускаю приложение 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>
Кроме того, я установил следующие ограничения для пула приложений:
Ознакомьтесь с этой замечательной статьей для ознакомления с этими ценностями: http://msdn.microsoft.com/en-us/library/ms972959#monitor_perf_topic10
Теперь, если я загружаю тестовое приложение таким образом, что множество объектов будет добавлено в кеш за короткое время, я вижу, что счетчик производительности обрезки кеша ASP.NET увеличивается, а использование памяти постоянно остается в пределах моих ограничений перезапуска.