Уменьшите использование памяти RabbitMQ

Я пытаюсь запустить RabbitMQ на небольшом VPS (512 МБ ОЗУ) вместе с Nginx и несколькими другими программами. Мне удалось без труда настроить использование памяти для всего остального, но я не могу заставить RabbitMQ использовать меньше ОЗУ.

Я думаю, мне нужно уменьшить количество потоков, которые Erlang использует для RabbitMQ, но мне не удалось заставить его работать. Я также пробовал установить vm_memory_high_watermark на несколько разных значений ниже значения по умолчанию (40%), даже на 5%.

Частично проблема может заключаться в том, что провайдер VPS (MediaTemple) позволяет мне перебрать мою выделенную память, поэтому при использовании free или top он показывает, что на сервере около 900 МБ.

Есть ли предложения по уменьшению использования памяти RabbitMQ или ограничению количества потоков, которые создает Erlang? Я считаю, что Erlang использует 30 потоков на основе флага -A30, который я видел в команде процесса.

В идеале я бы хотел, чтобы использование памяти RabbitMQ было ниже 100 МБ.

Изменить:

Если для vm_memory_high_watermark установлено значение 5% (или 0,05 в файле конфигурации), журналы RabbitMQ сообщают, что предел памяти RabbitMQ установлен на 51 МБ. Я не уверен, откуда идет 51мб. Текущий объем выделенной памяти VPS составляет 924 МБ, поэтому 5% от этой суммы должно составлять около 46 МБ.

Согласно htop / free перед запуском RabbitMQ я сижу около 453 МБ использованной оперативной памяти, а после запуска RabbitMQ у меня около 650 МБ. Увеличение почти на 200мб. Может ли быть, что 200 МБ - это нижний предел, с которым будет работать RabbitMQ?

Изменить 2

Вот несколько скриншотов ps aux и free до и после запуска RabbitMQ, а также график, показывающий всплеск памяти при запуске RabbitMQ.

Изменить 3

Я также проверил, не включив плагины, и это не имело большого значения. Кажется, что плагины, которые у меня были (управление и его предпосылки), добавили только около 8 МБ оперативной памяти.

Изменить 4

У меня больше нет этого сервера для тестирования, однако есть параметр conf delegate_count, для которого установлено значение по умолчанию 16. Насколько мне известно, это порождает 16 sup-procs для rabbitmq. Уменьшение этого числа на меньших серверах может помочь уменьшить объем памяти. Не знаю, работает ли это на самом деле или как это влияет на производительность, но это стоит попробовать.


person Alex Jillard    schedule 26.06.2011    source источник


Ответы (2)


Подходящий способ ограничить использование памяти в RabbitMQ - использовать vm_memory_high_watermark. Вы сказали:

Я также попытался установить для vm_memory_high_watermark несколько разных значений ниже значения по умолчанию (40%), даже всего 5%.

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

=INFO REPORT==== 29-Oct-2009::15:43:27 ===
Memory limit set to 2048MB.

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

Иногда Rabbit не может определить, в какой системе вы находитесь, и использует 1 ГБ в качестве базовой точки (поэтому по умолчанию вы получаете ограничение в 410 МБ).

Кроме того, убедитесь, что вы используете версию RabbitMQ, которая поддерживает параметр vm_memory_high_watermark - в идеале вам следует использовать последнюю стабильную версию.

person Rob Harrop    schedule 28.06.2011
comment
Когда я использовал vm_memory_high_watermark, он сообщил о правильном ограничении оперативной памяти в журнале (на основе фактических 900 МБ VPS, а не 512 МБ, которые я купил). Когда установлено значение 5%, журналы показывают 45 МБ, но каждый порожденный процесс erlang использует от 20 до 25 МБ оперативной памяти, что быстро превышает мои 512 МБ. - person Alex Jillard; 29.06.2011
comment
Когда вы говорите «каждый процесс erlang», вы имеете в виду, процесс erlang ОС или внутренний процесс erlang? - person Rob Harrop; 29.06.2011
comment
Когда я запускаю htop, я вижу около 30 /usr/lib/erlang/erts-5.7.4/bin/beam.smp -W w -K true -A30 -P 1048576, а затем несколько флагов, связанных с RabbitMQ и mnesia. - person Alex Jillard; 29.06.2011
comment
Это плохо. RabbitMQ должен работать только как один процесс ОС. Возможно ли, что у вас осталось несколько экземпляров, оставшихся после тестирования. Попробуйте killall beam.smp избавиться от них. Я только что подтвердил, что могу запустить на своем компьютере единственный экземпляр RabbitMQ размером 100 МБ. - person Rob Harrop; 29.06.2011
comment
Когда я останавливаю rabbitmq (/etc/init.d/rabbitmq-server stop), все процессы уходят. При запуске top он показывает одиночный процесс rabbitmq-server и одиночный процесс beam.smp. Однако когда я запускаю htop, я вижу все процессы beam.smp. После того, как я killall beam.smp процесс rabbitmq-server пропал. После повторного запуска я получаю те же результаты, что и раньше. - person Alex Jillard; 29.06.2011
comment
Что top говорит об использовании памяти? Я предполагаю, что у вас htop настроено отображение потоков пользовательской среды, на самом деле у вас нет нескольких запущенных процессов - строки просто дублируются на поток - top даст вам точное использование памяти для всего процесса. - person Rob Harrop; 29.06.2011
comment
вверху показано, что для beam.smp используется 35 м (3,9%), а для VIRT - 402 м. Однако я не думаю, что это объясняет увеличение использования оперативной памяти на 200 МБ после запуска RabbitMQ. - person Alex Jillard; 30.06.2011
comment
После запуска RabbitMQ не должно быть никаких новых процессов, кроме процесса beam.smp. Можете ли вы сделать снимок вывода ps до и после начала получения различий? Может появиться что-то неожиданное. - person Rob Harrop; 01.07.2011
comment
Отредактировал вопрос, чтобы включить скриншоты до / после для _1 _ / _ 2_. Чтобы все было как можно яснее, я остановил все остальные процессы. - person Alex Jillard; 02.07.2011

Обязательно установите соответствующее значение предварительной выборки QoS. По умолчанию, если есть клиент, сервер Rabbit отправляет клиенту любые сообщения, которые он имеет для очереди этого клиента. Это приводит к интенсивному использованию памяти как на клиенте, так и на сервере.

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

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

person metaforge    schedule 26.06.2013