芹菜+ RabbitMQ变慢

时间:2018-10-12 13:52:09

标签: python rabbitmq celery

我在这里遇到一个性能问题,我似乎无法弄清楚。

问题在于执行任务太慢。根据芹菜日志,大多数任务在0.3秒内完成。

我注意到,如果我停止工人并再次启动他们,性能会提高,几乎达到200 ack / s,然后过一会儿,它变得非常慢,大约40 / s。

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

感觉接收任务很慢。

关于什么可能导致这种情况的任何想法?谢谢!


一个日志示例:

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
  • Erlang 21.1

我将此设置用于网络抓取,有2个队列。我们称它们为“请求和流程”。

在“请求”队列I中,需要抓取的URL,在“处理”队列中,将找到该页面的URL +源代码。 (最大2.5 MB /源页面,如果大于它,我将其丢弃),因此Process队列中的所有消息最大2.5MB±1KB。

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

要从“处理”队列中执行任务,我使用预叉池(默认)。 (-c 4 --without-gossip --without-mangle --without-heartbeat)。像这样的30名工人。


其他设置信息:

  • 在芹菜和RabbitMQ中禁用心跳,使用TCP保持活动
  • 一切都在AWS中
  • 用于工作者的c4.xlarge实例
  • 用于RabbitMQ的i3.xlarge(30GB RAM,765 NVMe SSD,4核)
  • 用于负载平衡的haproxy(我有2个用于HA的RabbitMQ集群,已完全复制,停止了可能导致问题的思考,但是我离开了负载均衡器以防万一我决定重新创建集群)

RabbitMQ配置:

  • 心跳= 0
  • lazy_queue_explicit_gc_run_operation_threshold = 500
  • proxy-protocol = true
  • vm_memory_high_watermark = 0.6
  • vm_memory_high_watermark_paging_ratio = 0.1
  • queue_index_embed_msgs_below = 4096

Celery配置:

  • CELERY_TASK_ACKS_LATE = false(双向尝试)
  • CELERY_RESULT_BACKEND =无
  • CELERY_WORKER_ENABLE_REMOTE_CONTROL = True
  • BROKER_HEARTBEAT = 0
  • CELERY_CONTROL_QUEUE_EXPIRES = 60
  • CELERY_BROKER_CONNECTION_TIMEOUT = 30
  • CELERY_WORKER_PREFETCH_MULTIPLIER = 1
  • 与Ofair合作的工人
  • 每个孩子的最大任务数= 10(也尝试不使用)

尝试使用较高的预取功能(例如5、10和20),但此操作无效。

In case this helps

1 个答案:

答案 0 :(得分:0)

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