【发布时间】:2016-07-06 11:55:09
【问题描述】:
我们正在使用 celery 进行第三方 http 调用。我们有大约 100 多个任务,它们只是调用第三方 HTTP API 调用。有些任务会批量调用 API,例如凌晨 4 点有 50 万个请求,而有些任务是连续的 API 调用流,几乎每秒接收一次或两次请求。
大部分 API 调用响应时间在 500 - 800 毫秒之间。
我们发现芹菜的送货速度非常缓慢。对于上述大多数任务,最大交付率约为 100/s(最大)到几乎 1/s(最小)。我认为这很糟糕,肯定有问题,但我无法弄清楚它是什么。
我们从 3 台服务器的集群开始,逐渐将其变为 7 台服务器的集群,但没有任何改进。我们尝试了不同的并发设置,从自动缩放到固定的 10、20、50、100 名工作人员。没有结果后端,我们的代理是 RabbitMQ。
由于我们的任务执行时间非常短,大多数情况下不到一秒,我们还尝试将预取计数设置为不受限制的各种值。
--time-limit=1800 --maxtasksperchild=1000 -Ofair -c 64 --config=celeryconfig_production
服务器为 64 G RAM,Centos 6.6。
您能否告诉我可能出现的问题或如何解决问题的指示?
我们应该使用 gevents 吗?虽然我不知道它是什么。
【问题讨论】:
-
RabbitMQ 中的队列填满了多少?当队列为空时,RabbitMQ 最快。您可以监控 RabbitMQ 机器的 CPU 利用率。如果您看到 CPU 使用率很高,可能是因为 RabbitMQ 为应对巨大的队列大小做了很多工作。
-
可能听起来很傻,您肯定注意到了这一点,但是您是否检查过第三方服务器在负载下是否表现良好?即使您遇到许多并发请求,它仍然在 500-800 毫秒内响应吗?
-
第 3 部分 api 使用什么库?你在使用
requests模块吗? -
是的,我们正在使用请求模块@ahmed
标签: python rabbitmq celery scalability