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 那些任务应该执行得如此之快以至于我不应该能够读取日志。
我的设置是:
- 芹菜 4.2.1
- RabbitMQ 3.7.8
- 二郎 21.1
我使用此设置进行网页抓取,有 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个这样的工人。
其他设置信息:
- 在 celery 和 RabbitMQ 中禁用心跳,使用 TCP keep-alive
- 一切尽在 AWS
- c4.xlarge 个工人实例
- i3.xlarge 用于 RabbitMQ(30GB RAM,765 NVMe SSD,4 核)
- 用于负载平衡的 haproxy(我有 2 个 RabbitMQ 集群用于 HA,完全复制,阻止了一个可能导致问题的想法,但我离开了负载平衡器以防我决定重新创建集群)
RabbitMQ 配置:
- 心跳 = 0
- lazy_queue_explicit_gc_run_operation_threshold = 500
- 代理协议 = true
- vm_memory_high_watermark = 0.6
- vm_memory_high_watermark_paging_ratio = 0.1
- queue_index_embed_msgs_below = 4096
芹菜配置:
- CELERY_TASK_ACKS_LATE = false(两种方法都试过了)
- CELERY_RESULT_BACKEND = None
- CELERY_WORKER_ENABLE_REMOTE_CONTROL = 真
- BROKER_HEARTBEAT = 0
- CELERY_CONTROL_QUEUE_EXPIRES = 60
- CELERY_BROKER_CONNECTION_TIMEOUT = 30
- CELERY_WORKER_PREFETCH_MULTIPLIER = 1
- 工人运行Ofair
- max-tasks-per-child = 10(没有它也试过)
尝试使用更高的预取,例如 5、10 和 20,但没有成功。
设法弄明白了。这是一个网络问题。我用于负载均衡器的 EC2 实例具有较低的网络性能。我选择了一种具有更好网络性能的新实例类型,而且它的运行速度惊人地快。
我遇到了一个我似乎无法解决的性能问题。
问题是执行任务太慢了。基于芹菜日志,大部分任务都在 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 那些任务应该执行得如此之快以至于我不应该能够读取日志。
我的设置是:
- 芹菜 4.2.1
- RabbitMQ 3.7.8
- 二郎 21.1
我使用此设置进行网页抓取,有 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个这样的工人。
其他设置信息:
- 在 celery 和 RabbitMQ 中禁用心跳,使用 TCP keep-alive
- 一切尽在 AWS
- c4.xlarge 个工人实例
- i3.xlarge 用于 RabbitMQ(30GB RAM,765 NVMe SSD,4 核)
- 用于负载平衡的 haproxy(我有 2 个 RabbitMQ 集群用于 HA,完全复制,阻止了一个可能导致问题的想法,但我离开了负载平衡器以防我决定重新创建集群)
RabbitMQ 配置:
- 心跳 = 0
- lazy_queue_explicit_gc_run_operation_threshold = 500
- 代理协议 = true
- vm_memory_high_watermark = 0.6
- vm_memory_high_watermark_paging_ratio = 0.1
- queue_index_embed_msgs_below = 4096
芹菜配置:
- CELERY_TASK_ACKS_LATE = false(两种方法都试过了)
- CELERY_RESULT_BACKEND = None
- CELERY_WORKER_ENABLE_REMOTE_CONTROL = 真
- BROKER_HEARTBEAT = 0
- CELERY_CONTROL_QUEUE_EXPIRES = 60
- CELERY_BROKER_CONNECTION_TIMEOUT = 30
- CELERY_WORKER_PREFETCH_MULTIPLIER = 1
- 工人运行Ofair
- max-tasks-per-child = 10(没有它也试过)
尝试使用更高的预取,例如 5、10 和 20,但没有成功。
设法弄明白了。这是一个网络问题。我用于负载均衡器的 EC2 实例具有较低的网络性能。我选择了一种具有更好网络性能的新实例类型,而且它的运行速度惊人地快。