Запущен сервер на Python с использованием RabbitMQ. Через некоторое время (около месяца) вот процесс съедает всю память и очереди останавливаются.
Вот этот процесс:
29431 rabbitmq 20 0 4330792 1,992g 4596 S 12,6 12,7 792:49.90 beam.smp
После убиства процесса все становится хорошо.
Судя по beam.smp, работает виртуальная машина erlang. Но почему она не освобождает память - непонятно.
Ответ
Разобрался с вопросом. Дело было в том, что раббит написан на erlang. В прекрасном языке erlang сборщик мусора в виртуальной машине работает по старым и не особо эффективным алгоритмам. Он начинает чистить память только когда она заканчивается. Однако есть способы указать явно когда он запускается.
Таким образом, через настройки RabbitMQ можно достучаться до виртуальной машины Erlang. Для этого необходимо создать (если его нет) файл /etc/rabbitmq/rabbitmq.config (Debian, Ubuntu). В нем можно указать процент от общей памяти или конкретное количество, сообщающее когда следует запускать сборщик мусора. Следует помнить, что учитывается не оперативная память, а виртуальная(!). Я сделал 20% от общей виртуальной памяти так:
[{rabbit, [{vm_memory_high_watermark, 0.2}]}].
Моя проблема заключалась в том, что значение по умолчанию 0.4, а это слишком много для нагруженного сервера в production...
Убедиться в том, что предел потребляемой виртуальной памяти не превышает норму можно командой sudo rabbitmqctl status. Нужный параметр: vm_memory_limit
Комментариев нет:
Отправить комментарий