Celery + RabbitMQ 变慢

Celery + RabbitMQ becomes slow

我遇到了一个我似乎无法解决的性能问题。

问题是执行任务太慢了。基于芹菜日志,大部分任务都在 0.3 秒内完成。

我注意到,如果我停止 worker 并再次启动它们,性能会提高,几乎达到 200 acks / second,然后,过了一会儿它变得更慢,大约 40 / s。

我不确定,但我认为这可能是经纪人问题而不是芹菜问题。 查看几个worker的日志,发现他们似乎都在执行任务,然后停下来重新开始。

感觉接任务有点慢

关于可能导致此问题的任何想法?谢谢!


日志示例:

Task drones.tasks.blue_drone_process_task[64c0a826-aa18-4226-8a39-3a455e0916a5] succeeded in 0.18421914400005335s: None

10 秒休息

Received task: drones.tasks.blue_drone_process_task[924a1b99-670d-492e-94a1-91d5ff7142b9] Received task: drones.tasks.blue_drone_process_task[74a9a1d3-aa2b-40eb-9e5a-1420ea8b13d1] Received task: drones.tasks.blue_drone_process_task[99ae3ca1-dfa6-4854-a624-735fe0447abb] Received task: drones.tasks.blue_drone_process_task[dfbc0d65-c189-4cfc-b6f9-f363f25f2713]

IMO 那些任务应该执行得如此之快以至于我不应该能够读取日志。


我的设置是:

我使用此设置进行网页抓取,有 2 个队列。我们称它们为请求和流程。

在 Requests 队列中我 URL 需要抓取的,在 Process 队列中将找到该页面的 URL + 源代码。 (最大 2.5 MB / 源页面,我将其删除以防它大于那个),因此进程队列中的所有消息最大为 2.5MB ± 1KB。

为了从请求队列中执行任务,我将 celery 与 gevent 池一起使用,并发度为 300。(-P gevent -c 300 --without-gossip --without-mingle --without-heartbeat)。 4-8 个这样的工人。

为了从 Process 队列执行任务,我使用了 prefork 池(默认)。 (-c 4 --without-gossip --without-mingle --without-heartbeat)。 30个这样的工人。


其他设置信息:


RabbitMQ 配置:


芹菜配置:

尝试使用更高的预取,例如 5、10 和 20,但没有成功。

设法弄明白了。这是一个网络问题。我用于负载均衡器的 EC2 实例具有较低的网络性能。我选择了一种具有更好网络性能的新实例类型,而且它的运行速度惊人地快。