为第三方 HTTP 调用优化 Celery
Posted
技术标签:
【中文标题】为第三方 HTTP 调用优化 Celery【英文标题】:Optimizing Celery for third party HTTP calls 【发布时间】: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 毫秒内响应吗? rabbitmq.com/blog/2012/05/11/… 第 3 部分 api 使用什么库?你在使用requests
模块吗?
是的,我们正在使用请求模块@ahmed
【参考方案1】:
首先 - GIL - 不应该这样,因为更多的机器应该运行得更快。但是 - 请检查负载是否只在服务器的一个核心上进行......
我不确定整个 Celery 是否适合您的情况。这是一个很棒的软件,有很多功能。但是,如果不需要,最好使用更简单的东西 - 以防某些功能干扰。我会编写小型 PoC,检查其他客户端软件,例如 pika。如果这没有帮助 - 问题在于基础设施。如果有帮助 - 你有解决方案。 :)
真的很难说到底发生了什么。它可能与 IO 相关,或者网络调用过多......我会退后一步 - 找出一些有用的东西。编写集成测试,但确保使用 2-3 台机器只是为了使用完整的 tcp 堆栈。确保有 CI,并且每天运行一次测试,或者这样 - 看看事情是否朝着正确的方向发展。
【讨论】:
另外,在某些特定情况下,GIL 不会在 100 毫秒后释放以上是关于为第三方 HTTP 调用优化 Celery的主要内容,如果未能解决你的问题,请参考以下文章