我正在尝试使用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测试套件创建队列。在我看来,芹菜正在孤立这些队列而且它们不会消失。
以下是测试套件生成的队列。创建一个队列,所有消息都进入并出现:
Celerybeat每次运行任务时都会创建一个新队列:
它将auto-delete参数设置为true,但我不完全确定这些队列何时会被删除。他们似乎只是慢慢积累并吃掉资源。
有没有人有想法?
感谢。
答案 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以防止未使用的结果构建。如果您不需要特定应用程序,请按上述设置本地忽略。