2013-04-24 2 views
2

У меня проблема с rabbitmq 2.8.5. Есть 3 очереди, в которых публикуются сообщения, и потребители потребляют относительно быстро. Таким образом, очереди невелики. Существует 3 обмена по одной для каждой очереди. Однако память на кроличнике продолжает расти.RabbitMQ Использование памяти слишком велико

Я попробовал запустить две разные команды, чтобы понять, что происходит с памятью, однако rabbitmq зависает, когда я запускаю их.

rabbitmqctl eval '[[{pid, R}, M | process_info(R)] || {M, R} <- 
lists:sublist(lists:reverse(lists:sort([{process_info(P, memory), P} || 
P <- erlang:processes()])), 10)].' 

'lists:sublist(lists:reverse(lists:sort([{process_info(Pid,memory), Pid, 
sys:get_status(Pid,infinity)} || Pid <- [element(7, Q) || Q <- 
rabbit_amqqueue:list()]])), 10).' 

Затем я попытался наблюдать использование памяти на Erlang VM, что RabbitMQ работает от и 9235 (я думаю, что его в байтах).

Итак, если очереди и обмены невелики, а Erlang Ram намного ниже, чем у rabbitmq, что может быть причиной?

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

+0

проверьте размер сообщения и время, которое сообщение проводит в очереди, прежде чем потребитель получит его. Кроме того, какой метод вы используете для извлечения сообщений: 'опрос' или' подписка'? Если процессы в вашем среднем продукте опросают сервер для сообщений, тогда в зависимости от частоты опроса и количества потоков опроса RABBITMQ будет принимать множество входящих запросов и, следовательно, использовать большую часть памяти по сравнению с методом подписки. С подписчиками мы заметили, что RABBITMQ использует меньше ресурсов. –

+0

Потребители основаны на подписках. Но даже если бы это было так, я бы заподозрил, когда трафик низкий, моя оперативная память должна сжиматься, но она никогда не уменьшается по размеру. – sqwale

+0

Теперь, я думаю, что есть пара таблиц mnesia 'disc_copies', используемых' RABBITMQ'. Кроме того, это зависит от технологии обмена сообщениями. Если получатель сообщений не отправляет для них 'ACK', я думаю, что' RABBITMQ' сохраняет копию в базе данных. Убедитесь, что для каждого полученного сообщения вы отправляете для него 'ACK'. Тогда, также, ваши очереди «долговечны»? сообщения 'durable' или обмены' durable'? вы видите, что «RABBITMQ» имеет множество концепций. Попробуйте это, сделайте сообщения и очереди 'un-durable' и убедитесь, что для каждого сообщения отправлено' ACK'. Сколько «обменов» или «очередей» у вас есть? –

ответ

0

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

Если он слишком велик, лучше переделать беспорядок.

+1

Сообщения невелики. И даже когда очереди пустые, оперативная память по-прежнему остается remians, что она когда-то была. То есть Моя оперативная память никогда не уменьшится в размерах, она может только расти. – sqwale