Утечка памяти Czmq в простом приложении PUB/SUB

Я столкнулся с проблемой утечки памяти при использовании библиотеки czmq для простого приложения PUB / SUB. Итак, вот описание:

Установка содержит несколько издателей и несколько подписчиков. Каждый издатель и подписчик — это отдельный поток. Потоки — это обычные потоки POSIX на компьютере с Linux. Я отправляю сообщения от издателя к подписчику, используя zmsg_send и zframe. Каждое сообщение, содержащее по одному кадру. Я могу отправлять и получать сообщения, но со временем я вижу, что память, занимаемая приложением, увеличивается. Я использую сокеты tcp pub-sub.

Одна вещь, которую я хотел бы упомянуть, это то, что после отправки сообщения я не уничтожаю его, поскольку в документации упоминается, что оно уничтожит их после успешной отправки. При получении сообщения я копирую полученное сообщение в локальную структуру, а затем уничтожаю фрейм и zmsg. Я использую zpoller для ожидания сообщений в сокете. Он работает на процессоре руки. Может ли кто-нибудь указать мне, какие вещи мне нужно иметь в виду, чтобы избежать утечки памяти? Приложение отправляет сообщения с частотой 10 Гц.

И ключ к общим ошибкам, которые я мог бы сделать, будет полезен. Спасибо.


person user226869    schedule 04.06.2018    source источник
comment
После того, как вы были членом в течение 4 лет и 7 месяцев, где ваш код MCVE и почему вы не вознаградили предыдущую помощь и предоставленный ответ?   -  person user3666197    schedule 05.06.2018
comment
Мне жаль. Я не задавал много вопросов. Я принял ответы и проголосовал за них, когда нашел их правильными. Я собираюсь разместить код здесь.   -  person user226869    schedule 05.06.2018


Ответы (1)


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

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

Еще можно попробовать уменьшить HWM до 1 для всех сокетов и посмотреть, будет ли это иметь значение. Возможно, утечка памяти — это просто ZeroMQ, использующий буферы (установленные HWM). Linux не всегда будет возвращать память в кучу, если она будет освобождена, если только она не понадобится где-то еще.

Наконец, благодаря архитектуре ZeroMQ вы можете очень легко разделить свое приложение на два, тогда ваши PUB и SUB будут отдельными и еще больше сузят утечку.

person James Harvey    schedule 07.06.2018