RabbitMQ (beam.smp) 和高 CPU/内存负载问题

Posted

技术标签:

【中文标题】RabbitMQ (beam.smp) 和高 CPU/内存负载问题【英文标题】:RabbitMQ (beam.smp) and high CPU/memory load issue 【发布时间】:2014-09-29 12:17:56 【问题描述】:

我有一个使用 celery 和 rabbitmq 运行任务的 debian box 大约一年。最近我注意到没有处理任务,所以我登录系统并注意到 celery 无法连接到 rabbitmq。我重新启动了 rabbitmq-server,即使 celery 不再抱怨,它现在也没有执行新任务。奇怪的是,rabbitmq 正在疯狂地吞噬 CPU 和内存资源。重新启动服务器不会解决问题。在网上花了几个小时寻找解决方案无济于事后,我决定重建服务器。

我用 Debian 7.5、rabbitmq 2.8.4、celery 3.1.13 (Cipater) 重建了新服务器。大约一个小时左右,一切都再次完美运行,直到 celery 再次开始抱怨它无法连接到 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 再次开始膨胀,不断冲击 cpu 并慢慢接管所有 ram 和 swap:

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.com 存储库安装最新版本的 rabbitmq (3.3.4-1) 似乎问题已解决。最初我从 Debian 存储库安装了一个(2.8.4)。到目前为止,rabbitmq-server 工作顺利。如果问题再次出现,我会更新这篇文章。

更新: 不幸的是,大约 24 小时后,问题再次出现,rabbitmq 关闭并重新启动进程会使其消耗资源,直到它在几分钟内再次关闭。

【问题讨论】:

我今天遇到了这个问题,结果证明我们的(单例)RabbitMQ 实例已经用尽了 EC2 上的突增限额。我想我会提到它可能会帮助其他登陆此页面的人。 【参考方案1】:

我终于找到了解决方案。这些帖子有助于解决这个问题。 RabbitMQ on EC2 Consuming Tons of CPU 和 https://serverfault.com/questions/337982/how-do-i-restart-rabbitmq-after-switching-machines

所发生的事情是,rabbitmq 一直保留着所有从未释放到过载的结果。我清除了/var/lib/rabbitmq/mnesia/rabbit/ 中的所有陈旧数据,重新启动了rabbit,它现在工作正常。

我的解决方案是在 Celery 配置文件中禁用与 CELERY_IGNORE_RESULT = True 一起存储结果,以确保不会再次发生这种情况。

【讨论】:

如果我不使用 celery,如何停止rabbitmq 的高负载问题。有什么想法吗?【参考方案2】:

你也可以重置队列:

警告这会清除所有数据和配置!谨慎使用。

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

如果您的系统没有响应,您可能需要在重新启动后立即运行这些命令。

【讨论】:

rabbitmqctl reset 破坏配置和数据!我不得不假设你不知道这一点,因为在没有这个警告的情况下提出这样的建议是很鲁莽的:(【参考方案3】:

你因为 celery 耗尽了内存资源,我遇到了类似的问题,这是 celery 后端结果使用的队列有问题。

您可以使用 rabbitmqctl list_queues 命令检查有多少队列,如果该数字永远增长,请注意。在这种情况下,请检查您的芹菜用途。

关于 celery,如果您没有以异步事件的形式获得结果,请不要配置后端来存储那些未使用的结果。

【讨论】:

谢谢,我昨天想通了。我在我的 celeryconfig.py 中添加了 CELERY_IGNORE_RESULT = True ,从你所说的不指定后端也可以解决问题。如果需要结果,好的方法是使用数据库(mongo、redis)作为后端。【参考方案4】:

我遇到了类似的问题,结果证明是由于一些流氓 RabbitMQ 客户端应用程序造成的。 问题似乎是由于一些未处理的错误,流氓应用程序不断尝试与 RabbitMQ 代理建立连接。 重新启动客户端应用程序后,一切都恢复正常(因为应用程序停止了故障,并且停止尝试在无限循环中建立与 RabbitMQ 的连接)

【讨论】:

你救了我的命!【参考方案5】:

另一个可能的原因:管理插件。

我正在运行启用了管理插件的 RabbitMQ 3.8.1。 在 10 核服务器上,我的 CPU 使用率高达 1000%,有 3 个空闲消费者,没有发送一条消息,还有一个队列。

当我通过执行 rabbitmq-plugins disable rabbitmq_management 禁用管理插件时,使用率下降到 0%,偶尔达到 200%。

【讨论】:

以上是关于RabbitMQ (beam.smp) 和高 CPU/内存负载问题的主要内容,如果未能解决你的问题,请参考以下文章

RabbitMQ集群和高可用配置

RabbitMQ分布式集群架构

RabbitMQ学习记录- 消息队列存储机制源码分析

Amazon Linux 2 上的混合版本

如何在c#中使用RabbitMQ

rabbitmq