RabbitMQ (beam.smp) и проблема с высокой загрузкой ЦП/памяти

У меня есть коробка Debian, на которой работают задачи с celery и rabbitmq около года. Недавно я заметил, что задачи не обрабатываются, поэтому я вошел в систему и заметил, что celery не может подключиться к rabbitmq. Я перезапустил rabbitmq-сервер, и хотя сельдерей больше не жаловался, теперь он не выполнял новые задачи. Странно было то, что rabbitmq пожирал ресурсы процессора и памяти как сумасшедший. Перезапуск сервера не решит проблему. Потратив пару часов на безрезультатные поиски решения в Интернете, я решил восстановить сервер.

Я пересобрал новый сервер с Debian 7.5, rabbitmq 2.8.4, celery 3.1.13 (Cipater). Около часа все снова работало прекрасно, пока сельдерей снова не начал жаловаться, что не может подключиться к rabbitmq!

[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 'rabbit@li370-61' ...
[{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('rabbit@li370-61'): ** WARNING ** Mnesia is overloaded: {dump_log,
                                                                write_threshold}

=WARNING REPORT==== 8-Aug-2014::00:11:35 ===
Mnesia('rabbit@li370-61'): ** WARNING ** Mnesia is overloaded: {dump_log,
                                                                write_threshold}

=WARNING REPORT==== 8-Aug-2014::00:11:35 ===
Mnesia('rabbit@li370-61'): ** WARNING ** Mnesia is overloaded: {dump_log,
                                                                write_threshold}

=WARNING REPORT==== 8-Aug-2014::00:11:35 ===
Mnesia('rabbit@li370-61'): ** WARNING ** Mnesia is overloaded: {dump_log,
                                                                write_threshold}

=WARNING REPORT==== 8-Aug-2014::00:11:36 ===
Mnesia('rabbit@li370-61'): ** 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 'rabbit@li370-61'.

**********************************************************
*** 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 'rabbit@li370-61'

=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 'rabbit@li370-61'.

**********************************************************
*** 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 'rabbit@li370-61'

=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 'rabbit@li370-61'.

**********************************************************
*** 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/rabbit@li370-61",
                               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/rabbit@li370-61",
                               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

ОБНОВЛЕНИЕ: похоже, что проблема была решена после установки новейшей версии rabbitmq (3.3.4-1) из репозитория rabbitmq.com. Первоначально у меня был установлен один (2.8.4) из репозиториев Debian. Пока сервер rabbitmq работает без сбоев. Я обновлю этот пост, если проблема вернется.

ОБНОВЛЕНИЕ: К сожалению, примерно через 24 часа проблема снова появилась, когда rabbitmq отключился, и перезапуск процесса заставил бы его потреблять ресурсы, пока он снова не отключится в течение нескольких минут.


person marcin_koss    schedule 06.08.2014    source источник
comment
Я столкнулся с этой проблемой сегодня, и оказалось, что наш (одноэлементный) экземпляр RabbitMQ исчерпал свой допустимый пакет на EC2. Думал, что упомяну, поскольку это может помочь кому-то еще, кто попадет на эту страницу.   -  person MattDavey    schedule 07.12.2018


Ответы (5)


Наконец я нашел решение. Эти посты помогли разобраться. 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, чтобы этого больше не повторилось.

person marcin_koss    schedule 06.08.2014
comment
Как решить проблему с высокой нагрузкой для rabbitmq, если я не использую сельдерей. Любые идеи ? - person Akshay Hazari; 28.06.2016

Вы также можете сбросить очередь:

Внимание. При этом удаляются все данные и конфигурация! Используйте с осторожностью.

sudo service rabbitmq-server start
sudo rabbitmqctl stop_app
sudo rabbitmqctl reset
sudo rabbitmqctl start_app

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

person Kostyantyn    schedule 01.09.2015
comment
rabbitmqctl reset уничтожает конфигурацию и данные! я должен предположить, что вы этого не знали, потому что в противном случае было бы довольно безрассудно предлагать это без этого предупреждения :( - person RubyTuesdayDONO; 14.08.2018

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

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

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

person pfreixes    schedule 08.08.2014
comment
Спасибо, вчера разобрался. Я добавил CELERY_IGNORE_RESULT = True в свой celeryconfig.py, и из того, что вы говорите, отсутствие указания бэкэнда также поможет. Хорошим подходом, если нужны результаты, было бы использование базы данных (mongo, redis) в качестве серверной части. - person marcin_koss; 08.08.2014

У меня возникла аналогичная проблема, и оказалось, что это связано с некоторыми мошенническими клиентскими приложениями RabbitMQ. Похоже, проблема заключалась в том, что из-за какой-то необработанной ошибки мошенническое приложение постоянно пыталось установить соединение с брокером RabbitMQ. Как только клиентские приложения были перезапущены, все вернулось в норму (поскольку приложение перестало работать со сбоями и перестало пытаться установить соединение с RabbitMQ в бесконечном цикле)

person geoand    schedule 23.09.2015
comment
Вы спасли мою жизнь! - person chrysanthos; 06.07.2017

Другая возможная причина: плагин управления.

Я использую RabbitMQ 3.8.1 с включенным плагином управления. На 10-ядерном сервере у меня было до 1000% загрузки ЦП с 3 бездействующими потребителями, ни одним отправленным сообщением и одной очередью.

Когда я отключил плагин управления, выполнив rabbitmq-plugins disable rabbitmq_management, использование упало до 0% с редкими всплесками до 200%.

person anty    schedule 08.11.2019