【问题标题】:Celery difference between concurrency, workers and autoscaling并发,工人和自动缩放之间的芹菜差异
【发布时间】:2015-11-01 02:43:14
【问题描述】:

在我的/etc/defaults/celeryd 配置文件中,我设置了:

CELERYD_NODES="agent1 agent2 agent3 agent4 agent5 agent6 agent7 agent8"
CELERYD_OPTS="--autoscale=10,3 --concurrency=5"

我知道守护进程会产生 8 个 celery worker,但我完全不确定 autoscaleconcurrency 一起做什么。我认为并发是一种指定工作人员可以使用的最大线程数的方法,而自动缩放是工作人员在必要时扩大和缩小子工作人员的一种方式。

这些任务的负载较大(大约 20-50kB),并且有大约 2-3 百万个这样的任务,但每个任务的运行时间不到一秒。我看到内存使用量激增,因为代理将任务分配给每个工作人员,从而多次复制有效负载。

我认为问题出在配置中,worker + concurrency + autoscaling 的组合过度,我想更好地了解这三个选项的作用。

【问题讨论】:

  • autoscaleconcurrency 的文档非常清楚。有什么不明白的。特别是同时指定两者并没有什么意义。你的问题到底是什么?内存峰值?这实际上是一个问题 - 即您是在进行交换,还是看到调用了 OOM?
  • @scytale 我看到 OOM 被调用。许多进程在达到峰值时会简单地以Killed 终止。我想我现在很清楚自动缩放与并发。我认为--autoscale 会增加更多的worker,但它只是一个用于指定并发的动态设置,而不是--concurrency 的固定设置。我想我唯一剩下的困惑是围绕“以更少的并发性添加更多的工人或以更多的并发性添加更少的工人”。我不知道如何评估这个权衡。
  • 让我们区分工作进程和工作进程。你生成了一个 celery worker,然后生成了许多进程(取决于 --concurrency 和 --autoscale 之类的东西)。运行一个以上的工作人员是没有意义的,除非你想做路由,监听不同的队列等。我会说运行一个具有默认进程数的工作人员(即省略 --concurrency 和 --autoscale ,它将默认为与核心一样多的进程)。然后测试您的应用程序,以建立适合您需求的并发级别。
  • 内存峰值可能表明您需要重新评估您的数据结构等。此外,如果您的任务在不到一秒的时间内运行,您可能会在消息传递开销上浪费大量时间 - 您能不重构您的代码或更改您的块大小,以便它们运行更长时间?
  • @scytale 我已经解决了几乎所有的问题。两个最大的胜利是:1)将有效负载移动到数据库中,并且只将有效负载 id 传递给任务。立即稳定 rabbitmq 和 celery(它们偶尔会在负载的组合重量下弯曲)并且需要很少的设计更改和 2)使用具有适当数量的并发进程的单个工作人员来减少重复。感谢您的帮助和耐心! :) 如果您想总结以上几点,我很乐意接受您的回答。

标签: python concurrency celery


【解决方案1】:

让我们区分工作进程和工作进程。你生成一个 celery worker,然后生成许多进程(取决于--concurrency--autoscale 之类的东西,默认情况下生成与机器上的内核一样多的进程)。除非您想进行路由,否则在特定机器上运行多个工作器是没有意义的。

我建议在默认进程数的情况下每台机器只运行 1 个工作人员。这将通过消除工作人员之间的数据重复来减少内存使用。

如果您仍然有内存问题,则将数据保存到存储中并仅将 id 传递给工作人员。

【讨论】:

  • The docs 说在一台机器上运行多个工人是有好处的。自从您发布此内容以来,这可能已经发生了变化。
  • 首先,文档只说可能运行多个工作程序有优势,但建议进行实验:“甚至有一些证据支持运行多个工作程序实例,可能会执行比一个工人好。”其次,在这种情况下,有效载荷非常大。由于每个任务都分配给每个工作人员,这意味着内存需求 = 有效负载的大小 * 排队任务的数量 * 导致内存问题的工作人员数量。在这种情况下,使用 1 个工作人员会减少内存使用量。然而,更好的解决方案是不传递这么大的有效载荷。
  • 如果同时指定--concurrency--autoscale,哪个优先?
  • 这些关键字给我敲响了警钟:duplication1 worker 每台机器。这足以让我遵循这个明智的建议,而无需对这件事进行火箭科学分析......谢谢。
猜你喜欢
  • 2020-03-19
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-07
  • 2019-04-16
  • 2014-08-17
相关资源
最近更新 更多