RabbitMQ (beam.smp) и проблема с высокой загрузкой процессора/памяти
У меня есть debian box, выполняющий задачи с сельдереем и кроликом в течение года. Недавно я заметил, что задачи не обрабатываются, поэтому я вошел в систему и заметил, что сельдерей не может подключиться к rabbitmq. Я перезапустил rabbitmq-сервер, и хотя сельдерей больше не жаловался, он не выполнял новые задачи сейчас. Странным было то, что rabbitmq пожирал ресурсы процессора и памяти, такие как сумасшедшие. Перезапуск сервера не решит проблему. Потратив пару часов на поиск решения онлайн безрезультатно, я решил перестроить сервер.
Я перестроил новый сервер с Debian 7.5, rabbitmq 2.8.4, celery 3.1.13 (Cipater). Около часа или около того все работало красиво снова, пока сельдерей не начал снова жаловаться, что он не может подключиться к кроличему!
[2014-08-06 05:17:21,036: ERROR/MainProcess] consumer: Cannot connect to amqp://guest:**@127.0.0.1:5672//: [Errno 111] Connection refused.
Trying again in 6.00 seconds...
Я перезапустил rabbitmq service rabbitmq-server start
и тот же самый эффект:
rabbitmq начал снова набухать постоянно, стуча по процессору и медленно перебирать все бары и свопы:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
21823 rabbitmq 20 0 908m 488m 3900 S 731.2 49.4 9:44.74 beam.smp
Здесь результат на rabbitmqctl status
:
Status of node '[email protected]' ...
[{pid,21823},
{running_applications,[{rabbit,"RabbitMQ","2.8.4"},
{os_mon,"CPO CXC 138 46","2.2.9"},
{sasl,"SASL CXC 138 11","2.2.1"},
{mnesia,"MNESIA CXC 138 12","4.7"},
{stdlib,"ERTS CXC 138 10","1.18.1"},
{kernel,"ERTS CXC 138 10","2.15.1"}]},
{os,{unix,linux}},
{erlang_version,"Erlang R15B01 (erts-5.9.1) [source] [64-bit] [smp:8:8] [async-threads:30] [kernel-poll:true]\n"},
{memory,[{total,489341272},
{processes,462841967},
{processes_used,462685207},
{system,26499305},
{atom,504409},
{atom_used,473810},
{binary,98752},
{code,11874771},
{ets,6695040}]},
{vm_memory_high_watermark,0.3999999992280962},
{vm_memory_limit,414559436},
{disk_free_limit,1000000000},
{disk_free,48346546176},
{file_descriptors,[{total_limit,924},
{total_used,924},
{sockets_limit,829},
{sockets_used,3}]},
{processes,[{limit,1048576},{used,1354}]},
{run_queue,0},
Некоторые записи из /var/log/rabbitmq:
=WARNING REPORT==== 8-Aug-2014::00:11:35 ===
Mnesia('[email protected]'): ** WARNING ** Mnesia is overloaded: {dump_log,
write_threshold}
=WARNING REPORT==== 8-Aug-2014::00:11:35 ===
Mnesia('[email protected]'): ** WARNING ** Mnesia is overloaded: {dump_log,
write_threshold}
=WARNING REPORT==== 8-Aug-2014::00:11:35 ===
Mnesia('[email protected]'): ** WARNING ** Mnesia is overloaded: {dump_log,
write_threshold}
=WARNING REPORT==== 8-Aug-2014::00:11:35 ===
Mnesia('[email protected]'): ** WARNING ** Mnesia is overloaded: {dump_log,
write_threshold}
=WARNING REPORT==== 8-Aug-2014::00:11:36 ===
Mnesia('[email protected]'): ** WARNING ** Mnesia is overloaded: {dump_log,
write_threshold}
=INFO REPORT==== 8-Aug-2014::00:11:36 ===
vm_memory_high_watermark set. Memory used:422283840 allowed:414559436
=WARNING REPORT==== 8-Aug-2014::00:11:36 ===
memory resource limit alarm set on node '[email protected]'.
**********************************************************
*** Publishers will be blocked until this alarm clears ***
**********************************************************
=INFO REPORT==== 8-Aug-2014::00:11:43 ===
started TCP Listener on [::]:5672
=INFO REPORT==== 8-Aug-2014::00:11:44 ===
vm_memory_high_watermark clear. Memory used:290424384 allowed:414559436
=WARNING REPORT==== 8-Aug-2014::00:11:44 ===
memory resource limit alarm cleared on node '[email protected]'
=INFO REPORT==== 8-Aug-2014::00:11:59 ===
vm_memory_high_watermark set. Memory used:414584504 allowed:414559436
=WARNING REPORT==== 8-Aug-2014::00:11:59 ===
memory resource limit alarm set on node '[email protected]'.
**********************************************************
*** Publishers will be blocked until this alarm clears ***
**********************************************************
=INFO REPORT==== 8-Aug-2014::00:12:00 ===
vm_memory_high_watermark clear. Memory used:411143496 allowed:414559436
=WARNING REPORT==== 8-Aug-2014::00:12:00 ===
memory resource limit alarm cleared on node '[email protected]'
=INFO REPORT==== 8-Aug-2014::00:12:01 ===
vm_memory_high_watermark set. Memory used:415563120 allowed:414559436
=WARNING REPORT==== 8-Aug-2014::00:12:01 ===
memory resource limit alarm set on node '[email protected]'.
**********************************************************
*** Publishers will be blocked until this alarm clears ***
**********************************************************
=INFO REPORT==== 8-Aug-2014::00:12:07 ===
Server startup complete; 0 plugins started.
=ERROR REPORT==== 8-Aug-2014::00:15:32 ===
** Generic server rabbit_disk_monitor terminating
** Last message in was update
** When Server state == {state,"/var/lib/rabbitmq/mnesia/[email protected]",
50000000,46946492416,100,10000,
#Ref<0.0.1.79456>,false}
** Reason for termination ==
** {unparseable,[]}
=INFO REPORT==== 8-Aug-2014::00:15:37 ===
Disk free limit set to 50MB
=ERROR REPORT==== 8-Aug-2014::00:16:03 ===
** Generic server rabbit_disk_monitor terminating
** Last message in was update
** When Server state == {state,"/var/lib/rabbitmq/mnesia/[email protected]",
50000000,46946426880,100,10000,
#Ref<0.0.1.80930>,false}
** Reason for termination ==
** {unparseable,[]}
=INFO REPORT==== 8-Aug-2014::00:16:05 ===
Disk free limit set to 50MB
UPDATE:
Похоже, проблема была решена при установке новейшей версии rabbitmq (3.3.4-1) из репозитория rabbitmq.com. Первоначально я установил один (2.8.4) из репозиториев Debian. До сих пор rabbitmq-сервер работает плавно. Я обновлю это сообщение, если проблема вернется.
UPDATE:
К сожалению, примерно через 24 часа проблема снова возникла, когда кроликм выключился и перезапуск процесса заставил бы его потреблять ресурсы, пока он не закроется снова в течение нескольких минут.
Ответы
Ответ 1
Наконец я нашел решение. Эти посты помогли понять это. RabbitMQ на EC2 потребляет тонны процессора и https://serverfault.com/questions/337982/how-do-i-restart-rabbitmq-after-switching-machines
Произошло то, что rabbitmq держал все результаты, которые никогда не были освобождены до такой степени, что он стал перегруженным. Я удалил все устаревшие данные в /var/lib/rabbitmq/mnesia/rabbit/
, перезапустил кролика, и теперь он работает нормально.
Мое решение состояло в том, чтобы полностью отключить сохранение результатов с помощью CELERY_IGNORE_RESULT = True
в конфигурационном файле CELERY_IGNORE_RESULT = True
чтобы это больше не повторилось.
Ответ 2
Вы также можете сбросить очередь:
Предупреждение: это очищает все данные и конфигурацию! Используйте с осторожностью.
sudo service rabbitmq-server start
sudo rabbitmqctl stop_app
sudo rabbitmqctl reset
sudo rabbitmqctl start_app
Вам может потребоваться выполнить эти команды сразу после перезагрузки, если ваша система не отвечает.
Ответ 3
У вас исчерпаны ресурсы памяти из-за сельдерея, у меня возникла аналогичная проблема, и это было проблемой с очередями, используемыми результатом блендера сельдерея.
Вы можете проверить, сколько очередей используется с помощью команды rabbitmqctl list_queues, обратите внимание, если это число растет накануне. В этом случае проверьте использование вашего сельдерея.
О сельдерее, если вы не получаете результаты в виде асикронных событий, не настраивайте бэкэнд для хранения этих неиспользуемых результатов.
Ответ 4
У меня возникла аналогичная проблема, и, как оказалось, это было связано с некоторыми мошенническими клиентскими приложениями RabbitMQ.
Проблема, похоже, в том, что из-за некорректной ошибки приложение-изгоя постоянно пыталось установить соединение с брокером RabbitMQ.
После перезапуска клиентских приложений все вернулось к нормальному состоянию (так как приложение перестало работать и перестало пытаться подключиться к RabbitMQ в бесконечном цикле)