2011-06-15 97 views
7

我想获得与芹菜和Django的RabbitMQ去EC2实例做一些相当基本的后台处理。我在一个大的EC2实例上运行rabbitmq-server 2.5.0。在EC2上的RabbitMQ消耗CPU的CPU

我按照说明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 USER PR NI VIRT RES SHR小号%CPU%MEM TIME + COMMAND
668的RabbitMQ 20 0618米506米2340 S166中6.8 2:31.53 beam.smp
1301的ubuntu 20 02142米90米9128 S17中1.2 0:24.75的java

我之前正在测试一个微型实例,它完全消耗了实例上的所有资源。

这是预期的吗?难道我做错了什么?

谢谢。

编辑:

这个岗位的真正原因是celerybeat似乎运行好一段时间,然后突然消耗掉系统的所有资源。我安装了rabbitmq management tools,并一直在研究如何从芹菜和rabbitmq测试套件创建队列。在我看来,芹菜使这些队列孤立,他们不会离开。

这是测试套件生成的队列。创建一个队列,所有的邮件会进入它,出来: enter image description here

Celerybeat为每次创建一个新的队列运行任务: enter image description here

它集自动删除参数设置为true,但我不完全确定这些队列何时会被删除。他们似乎只是慢慢建立起来,吃资源。

有没有人有想法?

谢谢。

回答

6

好吧,我想通了。

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

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

+1

默认情况下,下一个Celery版本(2.3.0)不会有后端结果。让它成为更有意识的选择,这样的陷阱就可以避免。 – asksol 2011-06-16 10:54:04

+1

请更新链接,页面不存在 – lfender6445 2014-10-01 18:07:28

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以防止未使用的结果建立。如果您不需要特定应用程序,请像上面那样设置本地忽略。