AlexMAS / GostCryptography

.NET driver for ViPNet CSP and CryptoPro CSP
MIT License
128 stars 41 forks source link

Утечки памяти в GostCryptography #36

Open lyakhlyakh opened 3 years ago

lyakhlyakh commented 3 years ago

Здравствуйте! Возможны ли утечки памяти при использовании библиотеки GostCryptography? Обращался ли к Вам кто-либо с данной проблемой? В коде своих сервисов все объекты после использования мы освобождаем. Мы используем GostCryptography для шифрования и подписи сообщений. Взаимодействие с сервисом ФСС для отправки ЭЛН(шифрование) и взаимодействие с Федеральной электронной регистратурой (подпись запросов). На сервере в продуктивном контуре, где запущены наши сервисы, стоит крипто-про CSP 4.0.9963, Версия ядра СКЗИ: 4.0.9014 KC1. ОС: Windows Server 2016 Standart, наблюдается постоянное увеличение памяти, используемое сервисами. Может подскажите куда копать?

AlexMAS commented 3 years ago

Здравствуйте. Вероятность этого есть, т.к. вызывается unmanaged код и, возможно, где-то не освобождается память. До сих пор жалобы не поступили. Могу порекомендовать сделать нагрузочный тест, который делает характерную для вашего приложения работу, и запустить его через memory profiler (dotMemory, например).

lyakhlyakh commented 3 years ago

Благодарю Вас за столь быстрый ответ. image Не могли бы Вы взглянуть на скриншот dotMemory. Судя по скриншоту создаются объекты SafeKeyHandleImpl, но при этом из памяти они не освобождаются. Это нормальное поведение библиотеки?

AlexMAS commented 3 years ago

Тут трудно что-то сказать, нужно попытаться как-то локализовать проблемную ситуацию, симулировав часть работы вашей системы. Если есть возможность, сделайте несколько snapshots один за другим через какое-то время. Например, один сейчас, второй через 1 час работы, третий через 2 часа и т.п. (размер интервала можете выбрать, исходя из того, как быстро растет память: чем быстрей, тем меньше можно брать интервал). Посмотрите diff между этими snapshots, там должно быть видно где и что регулярно прибавляется.

Относительно SafeKeyHandleImpl - это по сути ссылка на unmanaged-объект. Логика его освобождения определена методом ReleaseHandle(), который должен вызываться при освобождении этого объекта. Если все disposable-экземпляры обернуты в using, то рано или поздно сборщик мусора должен их освободить. Если где-то (в коде библиотеки или у вас) остается повисшая ссылка, то для ее обнаружения нам, скорей всего, придется сузить задачу, чтобы ее можно было воспроизвести, отладить и исправить.

DeminAO commented 3 years ago

Добрый день. Вот, Наткнулся на беседу. Больше информации не поступало, так понимаю?