Утечка памяти в модулях DNN 9 MVC

Мы получаем утечку памяти в службе приложений Azure, на которой работает интерфейсный веб-сайт DNN, содержащий преимущественно WebForm, но также и некоторые модули MVC.

Я выполнил дамп памяти через dotMemory и обнаружил, что наибольший сохраненный размер занимает объектный тип ViewEngineCollection.

Насколько я понимаю, он должен содержать механизм просмотра Razor, а также любые другие, используемые в веб-приложении.

Я обнаружил, что вместо этого каждый экземпляр каждого объекта MVC добавляется в коллекцию как механизмы просмотра и никогда не собираются сборщиком мусора, занимая гигабайты памяти. Во время дампа памяти> 90% находились в памяти второго поколения, поэтому они долговечны.

Рассмотрим модуль MVC MyMVCModule. Допустим, в .cshtml есть тег действия, который содержит динамически сгенерированный URL-адрес - кажется, что при создании экземпляра объекта MVC компаратор объектов определяет эквивалентность с другими объектами, уже находящимися в коллекции. Любая небольшая разница в версиях одного и того же модуля приведет к тому, что он будет добавлен в память как «новый» механизм. Я считаю, что это функция кэширования, но существует так много перестановок, что затраты на хранение на порядки перевешивают затраты на повторное создание наших объектов MVC. В памяти находятся тысячи копий модуля.

Словарь является дочерним по отношению к ModuleDelegatingViewEngine, который является специфическим для dnn компонентом, поэтому я не верю, что эта проблема связана с фреймворком MVC в целом.

частичный снимок экрана вывода dotMemory

Это обычное поведение? Если да, могу ли я заставить сборщик мусора очистить эти страницы раньше? Спасибо за помощь.


person S4vrs3nC0de    schedule 22.10.2019    source источник


Ответы (1)


Несколько ответов / заметок для вас. Не стопроцентный ответ, а больше, чем комментарий.

  1. Это НЕ нормально и быть не должно.
  2. Подобные элементы должны регистрироваться в самом проекте https://www.github.com/dnnsoftware/dnn.platform, где их можно отслеживать / управлять.
  3. Мы работаем над проблемой, особенно с модулями WebAPI, которые могут быть связаны: https://github.com/dnnsoftware/Dnn.Platform/issues/3186

Не могли бы вы подтвердить, какую именно версию 9.x вы используете? Есть ли шанс отправить образец модуля?

person Mitchel Sellers    schedule 22.10.2019
comment
Мы на DNN v. 09.00.01 - person S4vrs3nC0de; 23.10.2019
comment
Проблемы на странице dnn на github принимаются только для более поздних версий dnn - дайте мне знать, если вы все равно хотите, чтобы я поднял вопрос, и я это сделаю. - person S4vrs3nC0de; 23.10.2019
comment
@ S4vrs3nC0de, учитывая, что вы не используете 9.4.1, мне было бы любопытно узнать, какие расширения вы используете на сайте. У вас много нестандартных вещей? - person Mitchel Sellers; 25.10.2019
comment
По сути, мы не используем никаких расширений из store / forge - все наши модули, за исключением пары html-модулей, являются либо настраиваемыми веб-формами, либо настраиваемыми mvcs. Мы в основном используем DNN как тонкую оболочку над dotnet. - person S4vrs3nC0de; 29.10.2019