EC2上的RabbitMQ消耗了大量的CPU

时间:2011-06-15 18:57:50

标签: django rabbitmq celery

我正在尝试使用Celery和Django的RabbitMQ进行EC2实例来进行一些非常基本的后台处理。我正在大型EC2实例上运行rabbitmq-server 2.5.0。

我按照here说明(位于页面底部)下载并安装了测试客户端。我只是让测试脚本去了,并得到了预期的输出:

recving rate: 2350 msg/s, min/avg/max latency: 588078478/588352905/588588968 microseconds
recving rate: 1844 msg/s, min/avg/max latency: 588589350/588845737/589195341 microseconds
recving rate: 1562 msg/s, min/avg/max latency: 589182735/589571192/589959071 microseconds
recving rate: 2080 msg/s, min/avg/max latency: 589959557/590284302/590679611 microseconds

问题在于它消耗了大量的CPU:

  

PID用户PR NI VIRT RES SHR S%CPU%MEM TIME + COMMAND
    668 rabbitmq 20 0 618m 506m 2340 S 166 6.8 2:31.53 beam.smp
   1301 ubuntu 20 0 2142m 90m 9128 S 17 1.2 0:24.75 java

我之前在微实例上进行了测试,它完全消耗了实例上的所有资源。

这是预期的吗?我做错了吗?

感谢。

修改

这篇文章的真正原因是celerybeat似乎运行了一段时间然后突然消耗了系统上的所有资源。我安装了rabbitmq management tools,并一直在调查如何从芹菜和rabbitmq测试套件创建队列。在我看来,芹菜正在孤立这些队列而且它们不会消失。

以下是测试套件生成的队列。创建一个队列,所有消息都进入并出现: enter image description here

Celerybeat每次运行任务时都会创建一个新队列: enter image description here

它将auto-delete参数设置为true,但我不完全确定这些队列何时会被删除。他们似乎只是慢慢积累并吃掉资源。

有没有人有想法?

感谢。

2 个答案:

答案 0 :(得分:7)

好的,我明白了。

以下是相关的文档: http://readthedocs.org/docs/celery/latest/userguide/tasks.html#amqp-result-backend

  

旧结果不会自动清除,因此您必须确保使用结果,否则队列的数量最终会失控。如果您正在运行RabbitMQ 2.1.1或更高版本,则可以利用队列的x-expires参数,这将在未使用后的某个时间限制之后使队列到期。可以通过CELERY_AMQP_TASK_RESULT_EXPIRES设置(默认情况下未启用)设置队列到期时间(以秒为单位)。

答案 1 :(得分:2)

要为自己的问题添加Eric Conner's解决方案,http://docs.celeryproject.org/en/latest/userguide/tasks.html#tips-and-best-practices说明:

  

忽略您不想要的结果

     

如果您不关心任务的结果,请务必设置ignore_result选项,因为存储结果会浪费时间和资源。

@app.task(ignore_result=True)
def mytask(…):
    something()
     

甚至可以使用CELERY_IGNORE_RESULT设置全局禁用结果。

与Eric的回答一起,可能是管理结果后端的最低限度的最佳实践。

如果您不需要结果后端,请设置CELERY_IGNORE_RESULT或根本不设置结果后端。如果确实需要结果后端,请设置CELERY_AMQP_TASK_RESULT_EXPIRES以防止未使用的结果构建。如果您不需要特定应用程序,请按上述设置本地忽略。