RabbitEC上的EC2消耗吨CPU

问题描述

| 我正在尝试将Celery和Django的RabbitMQ与EC2实例一起进行一些基本的后台处理。我正在大型EC2实例上运行Rabbitmq-server 2.5.0。 我按照此处的说明(在页面的最底部)下载并安装了测试客户端。我只是放开测试脚本,并获得了预期的输出
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 +命令     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管理工具,并一直在研究如何从芹菜和rabbitmq测试套件中创建队列。在我看来,芹菜正在孤立这些队列,并且它们并没有消失。 这是测试套件生成的队列。创建一个队列,所有消息进入并发出: Celerybeat每次运行任务时都会创建一个新队列: 它将auto-delete参数设置为true,但是我不确定这些队列何时被删除。他们似乎只是慢慢地积累和消耗资源。 有人有主意吗? 谢谢。     

解决方法

        好的,我知道了。 这是相关的文档: http://readthedocs.org/docs/celery/latest/userguide/tasks.html#amqp-result-backend   旧结果将不会自动清除,因此您必须确保使用结果,否则队列数最终将失去控制。如果您运行的是RabbitMQ 2.1.1或更高版本,则可以将x-expires参数用于队列,队列将在未使用一定时间后过期,从而使队列过期。队列到期时间可以通过CELERY_AMQP_TASK_RESULT_EXPIRES设置(以秒为单位)设置(默认情况下未启用)。     ,        要增加Eric Conner对自己的问题的解决方案,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以防止未使用的结果累积。如果您不需要特定的应用程序,请按上述设置本地忽略。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...