Все объекты iDisposable теперь обернуты с использованием блоков (мы делали это строго ранее, но мы нашли несколько неправильно расположенных)
Мы не можем много сказать о cra sh без какой-либо информации об этом, но у меня есть некоторые предположения об этом. Я вижу 10 000 (!) Не расположенных объектов, обработанных в очереди завершения. Давайте начнем с них, найдите их все и добавьте вызов Dispose в свое приложение. Также я бы порекомендовал проверить, сколько системных дескрипторов используется вашим приложением. Существует ограничение операционной системы на количество дескрипторов, и если они превышены, больше нельзя создавать файловые дескрипторы, сетевые сокеты и т. Д. c. Я рекомендую это особенно, поскольку количество неразмещенных объектов.
Также, если у вас есть тайм-аут на доступ к Redis, получите профилировщик производительности и посмотрите, почему так. Я рекомендую получить JetBrains dotTrace и использовать режим TIMELINE , чтобы получить профиль вашего приложения, он покажет спящий поток, конфликт потоков и многое другое, что поможет вам найти проблему root. Вы можете использовать инструмент командной строки для получения данных профиля, чтобы не устанавливать приложение GUI на стороне сервера.
оно вызывает быстрое увеличение утечек событий CaliEventHandlerDelegateProxy и ArglessEventHandlerProxy
dotMemory не меняет код вашего приложения и не выделяет никаких управляемых объектов в профилированном процессе. Microsoft Profiling API внедряет dll (написанный на c ++) в процесс профилирования, это часть dotMemory, называемая Profilng Core, играющая роль «сервера» (где автономный dotMemory, написанный в C#, является клиентом). Профилирование Ядро выполняет некоторую работу со собранными данными перед отправкой их на клиентскую сторону, для этого требуется некоторая память, которая, конечно, выделяется в адресном пространстве процесса профилирования, но это не влияет на управляемую память.
Профилирование памяти может повлиять на производительность вашего приложения. Например, API профилирования отключает одновременный G C, когда приложение находится в режиме профилирования или сбор данных выделения памяти может значительно замедлить работу вашего приложения. Почему вы считаете, что CaliEventHandlerDelegateProxy и ArglessEventHandlerProxy размещаются только при профилировании dotMemory? Не могли бы вы описать, как вы это исследовали?
Обработчики событий не подписаны - в нашей кодовой базе очень мало
dotMemory сообщает об обработчике событий как об утечке. есть только одна ссылка на него - из источника события у него нет возможности отписаться от этого события. Проверьте все эти утечки, найдите свой код в коде, как это произошло. В любом случае, эти объекты хранят только 110,3 КБ. Почему вы решили, что ваш сайт из-за них потерпел крах?
Сейчас я в растерянности, полагаю, что я исчерпал все возможности памяти утечки в нашей кодовой базе
Сделайте несколько снимков за период времени, когда потребление памяти растет, откройте полное сравнение некоторых из этих снимков и посмотрите на все выжившие объекты, которые не должны выжить, и выясните, почему они выжила. Это единственный способ доказать, что в вашем приложении нет утечки памяти, а код не подтверждает этого, извините.
Надеюсь, если вы выполните все действия, которые я рекомендую вам выполнить (профилирование производительности, полное сравнение снимков и сравнение снимков, а не только просмотр проверок, проверка наличия огромного количества неразмещенных объектов), вы найдете и исправите проблему root.