Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Потребление памяти компонентой #885

Open
dimok22prog1 opened this issue Jan 25, 2023 · 10 comments
Open

Потребление памяти компонентой #885

dimok22prog1 opened this issue Jan 25, 2023 · 10 comments
Assignees
Labels
bug Часть поведения компоненты неправильное

Comments

@dimok22prog1
Copy link

Здравствуйте.
Используем компоненту 5.39.1.865 x64 для произвольных систем, собственное решение.
Компонента установлена у нас на сервере, через приложении Component Servises.
Используем ее в многопоточном режиме.
Если открыть диспетчер задач, видно активное потребление памяти, похожее на утечку.
Приходится автоматически принудительно завершать выделенный процесс при превышении некоторого объема памяти.
На самом деле оно было на разных версиях компоненты, поэтому не могу сказать, что это проблема именно указанной версии.
Хотелось бы разобраться до конца.
Последнее что пытались сделать - кэшируем com-объект и соединение с Organization, но к особым успехам не привело.
Может быть есть какие-нибудь методы по освобождению памяти или рекомендации по работе с компонентой?
Действия выполняем классические: создание объекта, подключение к ящику организации по сертификату, создание задания на отправку и отправка документов (УПД, неформализованные документы).

Если нужна дополнительная информация (dump с сервера (?), логи какие-либо (?)), напишите, пожалуйста, какая.

@GilimkhanovDenis
Copy link
Contributor

Добрый день

Можете поточнее описать последовательность действий, которая приводит к утечке памяти, в идеале минимальный пример: заполняете ли динамический контент, достаточно ли для воспроизведения отправлять документы в одному и тому же получателю или нужно всегда разным, сохраняете ли объект отправленного документа куда-то и что потом с этим объектом происходит и т.п.

@GilimkhanovDenis GilimkhanovDenis added the bug Часть поведения компоненты неправильное label Feb 1, 2023
@dimok22prog1
Copy link
Author

Если вкрадце:
У нас есть очередь, в нее помещаем документы информационной системы. Документов много.
В очереди на каждый документ два этапа: отправка документа, подписание документа. Элементов очереди много.
Очередь обрабатывается в несколько потоков (оба этапа в несколько потоков).
На каждый элемент очереди выполняется последовательность действий:

  1. Создание com-объекта (ДиадокАПИ);
  2. Подключение по сертификату (ДиадокСоединение =ДиадокАПИ.CreateConnectionByCertificate);
  3. Подключение к ящику организации (КонтекстОрганизации = ДиадокСоединение.GetOrganizationById);
  4. Получение (Document = Organization.GetDocumentById) / отправка (SendTask = КонтекстОрганизации.CreatePackageSendTask2()) документа;
  5. Заполняем контент при отправке (UtdSellerContent = SendTask.Content.UniversalTransferDocumentWithHyphens);
  6. Читаем динамический контент: Document.GetDynamicContent("Seller") / Document.GetDynamicContent("Buyer");
  7. Сохраняем информацию из сервиса Диадок в нашу внутреннюю систему (Document.SaveAllContent(КаталогВыгрузкиФайлов, Истина)).

В рамках каждого потока кэшируем п.1-п.3.

достаточно ли для воспроизведения отправлять документы в одному и тому же получателю или нужно всегда разным
Есть мнение, что все зависит от количества потоков и обрабатываемых элементов очереди. В тестовом окружении нагрузочного тестирования не проводим, поэтому потребление памяти незаметно. В рабочем же, время жизни процесса примерно 5 минут, достигает 6 Гб.

сохраняете ли объект отправленного документа куда-то и что потом с этим объектом происходит
Нет, не сохраняем. Получаем Document, если никаких действий выполнять не нужно, переходим к следующему.

Настройка Component Servises:
Pic1

@GilimkhanovDenis GilimkhanovDenis self-assigned this Feb 1, 2023
@JohnSergeev
Copy link

JohnSergeev commented Feb 3, 2023

Добрый день.

А можно узнать сколько памяти съедается и за какой период?

Просто я пару лет назад уже находил намеки на утечки, сообщал разработке, были правки и теперь все более-менее нормально. Раньше жестко утекало.

Сейчас тоже есть что-то похожее на постоянный жор памяти. Но происходит это относительно медленно.
У нас на сервере ЭДО 16 Гб памяти и она постепенно "выжирается" в течение суток. Но, т.к. у нас каждое утро плановый перезапуск кластера, то с таким жором памяти мы живем нормально. Ну как - нормально - терпим, т.к. текущий уровень утечки пока не приводит к проблемам.

Но, вообще говоря, явно какие-то утечки остались, т.к. пусть очень медленно, но за день на серваке вся память стабильно съедается. Плюс бывают "всплески" этого выжирания. Вот даже специально не напрягаясь, просто зашел на сервер и увидел:
изображение

изображение

На этом сервере кластера у нас кроме фоновых ЭДО не крутиться больше вообще ничего.

@JohnSergeev
Copy link

А часто бывает, и так: еще день не прошел, вся память выжралась, кластер перезапускает rphost и получаем (вот только что произошло):
изображение

Т.е. мы "выживаем" скорее даже не потому, что память мало жреться, а потому, что rphost постоянно перезапускается, когда все выжрано.

Но было бы здорово, если бы такого жора не было!

@JohnSergeev
Copy link

После сброса сперва выжирается куча памяти (ну это нормально), а затем не спеша, гигов с 10 начинает потихоньку выжирать все до конца:
изображение

@dimok22prog1
Copy link
Author

А часто бывает, и так: еще день не прошел, вся память выжралась, кластер перезапускает rphost и получаем (вот только что произошло): изображение

Т.е. мы "выживаем" скорее даже не потому, что память мало жреться, а потому, что rphost постоянно перезапускается, когда все выжрано.

Но было бы здорово, если бы такого жора не было!

Вот из-за того, что rphost падает пришлось использовать Component Servises. При этом растет потребление памяти выделенного dllhost, а rphost не падает. Падение rphost для нас критично, т.к. в информационной системе работает большое количество пользователей и вместе с diadoccomapi падали они.

@JohnSergeev
Copy link

У нас падение rphost'a не критично, т.к. это отдельный сервер в кластере. И на этом сервере только фоновые ЭДО работают, больше ничего.

Но хотелось бы, конечно, чтобы этот жор памяти как-то победили.

@JohnSergeev
Copy link

Добрый день.

Раз тема по утечкам памяти по прежнему "висит", сделаю маленькое дополнение:

После перехода на версию 5.52.1.982 наблюдаем гораздо меньшее потребление памяти, чем на версии 5.46.1.920.

46-я постепенно на сервере потихоньку выжирала у нас всю память (16 Гб) за несколько часов. А 52-я на потреблении памяти показывает практически горизонтальную линию (выходит в район 8-9 Гб и там и остается, плавая потихоньку вверх-вниз).

Такое ощущение, что что-то поменяв и исправив последние ошибки, будто случайно, что-то задели и грохнули какую-то багу, которая ранее жрала память.

Сейчас проблем практически нет!

@GilimkhanovDenis
Copy link
Contributor

@JohnSergeev

Это замечательные новости! Мы действительно в последних релизах много чего переделывали и где-то могли поправить баги с утечками памяти.
Предлагаю понаблюдать поведение подольше. Если не будет течь, то закроем тикет

@GilimkhanovDenis
Copy link
Contributor

GilimkhanovDenis commented Jul 16, 2024

Хотя кажется, 8-9 Гб как-то многовато для компоненты... Подумаем ещё и в этом направлении

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Часть поведения компоненты неправильное
Projects
None yet
Development

No branches or pull requests

3 participants