Я сейчас сравниваю производительность 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 непригодных для использования объектов!).
В файле web.config
Также в web.config (и во многих вариантах политик, включая отсутствие).
Я попытаюсь полностью отключите запуск FileAuthorizationModule, если возможно, чтобы посмотреть, поможет ли это. Однако ASP.NET по-прежнему генерирует объекты 2 * N MapPathCacheInfo
и CacheEntry
, поэтому память по-прежнему расходуется, только гораздо медленнее.
Другая половина проблемы - та же проблема, что описана здесь: Предотвратить заполнение кэша ASP.NET множеством разных URL-адресов MVC . Настройка
помогает, но даже при таких очень агрессивных настройках использование памяти быстро возрастает до 2,5 ГБ (по сравнению с 4 ГБ). В идеале эти объекты вообще никогда бы не создавались. В противном случае я могу прибегнуть к хакерскому решению с использованием отражения для очистки кешей (все эти записи являются "частными" и не перечисляются при итерации по общедоступному кэшу).