Наш сайт использует ASP.NET MVC для части страниц в нем. Эти URL-адреса обычно имеют форму http://oursite/detail.mvc/12345/pictures/. В этом URL-адресе 12345 является идентификатором в базе данных. У нас есть несколько сотен тысяч объектов, для которых мы показываем страницы с подробностями. Недавно мы заметили рост использования памяти для сайта, поэтому я немного исследовал. Мы сделали дамп памяти производственного сайта и обнаружили, что значительный объем общего использования памяти был вызван строками в кэше в форме «dmachine / webroot / 1 / site / detail.mvc / 12345 / pictures /» и «H». : \ сайт \ detail.mvc \ 12345 \ картинками \»
.
Дальнейшие исследования и интенсивное использование Reflector показали, что эти строки хранятся в кэше ASP.NET в форме объекта System.Web.CachedPathData. Это создается ConfigurationManager при чтении информации из файла web.config. Он вызывает HttpContext.GetSection () -> HttpContext.GetConfigurationPathData () -> CachedPathData.GetVirtualPathData (). В конечном итоге в CachedPathData.GetConfigPathData определяется виртуальный путь для запрошенного пути, который кэшируется в кэше ASP.NET без истечения срока действия.
Теперь проблема в том, что у нас есть миллионы различных URL-адресов, и для каждого пути система конфигурации хранит ряд строк (configPath, виртуальный путь, физический путь) в кэше. Со временем эта информация занимает несколько сотен МБ, почти все данные в кеше.
Я предполагаю, что когда памяти станет мало, эти записи будут удалены, но в операциях они не доверяют процессам, которые растут и растут. Это также кажется очень неэффективным. Есть ли способ сказать HttpContext не кэшировать эту информацию для каждого уникального URL? Или, может быть, мы можем сначала сопоставить путь запроса с более простым URL и использовать его для выбора правильного web.config?