Отключение кэширования ответов ASP.NET HttpHandler

Предпосылки

Я сейчас сравниваю производительность NancyFx и ServiceStack.NET, работающих под IIS 7 (тестирование на хосте Windows 7). Оба они безумно быстрые - при локальном тестировании каждый фреймворк обрабатывает более 10 000 запросов в секунду, при этом ServiceStack работает примерно на 20% быстрее.

Проблема, с которой я столкнулся, заключается в том, что ASP.NET, похоже, кэширует ответы для каждого уникального URI запрос от HttpHandler, быстро приводящий к огромной нехватке памяти (3+ ГБ) и перегрузке сборщика мусора (~ 25% времени, потребляемого сборщиком мусора). Пока мне не удалось отключить кеширование и накопление объектов, и я ищу предложения, как отключить это поведение.

Подробности

Цикл запроса в основном выглядит следующим образом:

for i = 1..100000:
    string uri = http://localhost/users/{i}
    Http.Get(uri)

Ответ - это простой объект JSON, отформатированный как {UserID: n}.

Я открыл WinDBG, и для каждого запроса есть:

  • Один System.Web.FileChangeEventHandler
  • Два System. Web.Configuration.MapPathCacheInfos
  • Два System.Web.CachedPathDatas
  • Три System.Web.Caching.CacheDependencys
  • Пять System.Web.Caching.CacheEntrys

Очевидно именно эти элементы кеша заставляют меня думать, что это проблема с раздуванием кеша (я бы хотел избавиться от 150 000 непригодных для использования объектов!).

То, что я пробовал до сих пор

  • В IIS 'HTTP Resonse Headers' установите для параметра «Истекать срок действия веб-содержимого» значение «немедленно».
  • В файле web.config

     
  • Также в web.config (и во многих вариантах политик, включая отсутствие).

     

    Я попытаюсь полностью отключите запуск FileAuthorizationModule, если возможно, чтобы посмотреть, поможет ли это. Однако ASP.NET по-прежнему генерирует объекты 2 * N MapPathCacheInfo и CacheEntry , поэтому память по-прежнему расходуется, только гораздо медленнее.

    Обновление №2

    Другая половина проблемы - та же проблема, что описана здесь: Предотвратить заполнение кэша ASP.NET множеством разных URL-адресов MVC . Настройка

    помогает, но даже при таких очень агрессивных настройках использование памяти быстро возрастает до 2,5 ГБ (по сравнению с 4 ГБ). В идеале эти объекты вообще никогда бы не создавались. В противном случае я могу прибегнуть к хакерскому решению с использованием отражения для очистки кешей (все эти записи являются "частными" и не перечисляются при итерации по общедоступному кэшу).

18
задан Community 23 May 2017 в 10:34
поделиться