芹菜在并发,工作和自动缩放之间的区别

Jos*_*eph 48 python concurrency celery

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

CELERYD_NODES="agent1 agent2 agent3 agent4 agent5 agent6 agent7 agent8"
CELERYD_OPTS="--autoscale=10,3 --concurrency=5"
Run Code Online (Sandbox Code Playgroud)

据我所知,该守护进程会产生8名芹菜工人,但我完全不知道该做什么autoscale,concurrency一起做什么.我认为并发是指定工作者可以使用的最大线程数的一种方式,并且如果需要,自动缩放是工作者扩展和缩小子工作者的一种方式.

这些任务有效载荷很大(大约20-50kB),有2-3万个这样的任务,但每个任务都在不到一秒的时间内运行.我看到内存使用率飙升,因为代理将任务分配给每个工作人员,因此多次复制有效负载.

我认为问题在于配置,并且工作者+并发+自动缩放的组合过度,我希望更好地理解这三个选项的作用.

scy*_*ale 39

让我们区分工人和工人的过程.您生成一个芹菜工人,这则产卵(取决于事情,比如一些进程--concurrency--autoscale,默认为产卵在机器上尽可能多的进程为核心).除非您想要进行路由,否则在特定计算机上运行多个worker是没有意义的.

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

如果仍有内存问题,请将数据保存到商店,并仅将ID传递给工作人员.

  • 如果同时指定`--concurrency`和`--autoscale`,哪一个优先? (4认同)
  • 首先,文档只说有**可能*有利于运行多个工作人员,但建议进行实验:"甚至有一些证据表明支持多个工作人员实例运行,可能比单个工作人员表现更好." 其次,在这种情况下,有效载荷非常大.由于每个任务都分配给每个工作人员,这意味着内存要求=有效负载的大小*排队任务的数量*导致内存问题的工作者数量.在这种情况下,使用1个工作符会减少内存使用量 然而,更好的解决方案是不通过如此大的有效载荷. (3认同)
  • [文档](http://docs.celeryproject.org/en/latest/userguide/workers.html#concurrency) 说在一台机器上运行多个工人有一个优势。也许自从您发布此内容以来,这几年发生了变化。 (2认同)
  • 这些关键字给我敲响了警钟:“重复”,每台机器“1 个工人”。这足以让我遵循这个明智的建议,而无需对这件事进行火箭科学分析……谢谢。 (2认同)

WMR*_*dan 15

当使用--autoscale进程数时,使用最大/最小值动态设置,这使工作线程能够根据负载进行扩展;当使用--concurrency进程数时,使用固定数量静态设置。因此,将两者一起使用是没有意义的。

Celery--autoscale负责根据负载动态增长和缩小池。这反过来会在有工作要做时添加更多进程,并在工作负载较低时删除进程。例如,--autoscale=10,3最多可以有 10 个进程,最少有 3 个进程。

至于--concurrencycelery 默认情况下使用多处理来执行任务的并发执行。可以使用参数更改工作进程/线程的数量,--concurrency如果未设置,则默认为可用 CPU 的数量。例如,--concurrency=5使用 5 个进程意味着 5 个任务可以同时运行。