Celery 并发性、工作人员和自动缩放之间的区别
Celery difference between concurrency, workers and autoscaling
在我的 /etc/defaults/celeryd
配置文件中,我设置了:
CELERYD_NODES="agent1 agent2 agent3 agent4 agent5 agent6 agent7 agent8"
CELERYD_OPTS="--autoscale=10,3 --concurrency=5"
我知道守护进程生成 8 个 celery worker,但我完全不确定 autoscale
和 concurrency
一起做什么。我认为并发是一种指定工作人员可以使用的最大线程数的方法,而自动缩放是工作人员在必要时扩大和缩小子工作人员规模的一种方式。
这些任务的负载很大(大约 20-50kB),大约有 2-3 百万个这样的任务,但每个任务的运行时间不到一秒。我看到内存使用量激增,因为代理将任务分配给每个工作人员,从而多次复制有效负载。
我认为问题出在配置上,worker + concurrency + autoscaling 的组合过度了,我想更好地理解这三个选项的作用。
让我们来区分工人和工人进程。你生成一个 celery worker,然后生成许多进程(取决于 --concurrency
和 --autoscale
,默认情况下生成与机器上的核心一样多的进程)。 运行 除非您想进行路由,否则在一台特定机器上有多个 worker 是没有意义的。
我建议 运行 使用默认进程数的每台机器只配置 1 个工人。这将通过消除工作人员之间的数据重复来减少内存使用。
如果您仍然有内存问题,请将数据保存到存储中并仅将一个 ID 传递给工作人员。
当使用 --autoscale
时,进程数使用 max/min 值动态设置,使工作人员能够根据负载进行扩展,而当使用 --concurrency
时,进程数使用固定值静态设置数字。所以这两个一起使用是没有意义的。
Celery --autoscale
负责根据负载动态地扩大和缩小池。这反过来会在有工作要做时添加更多进程,并在工作负载较低时删除进程。因此,例如 --autoscale=10,3
将为您提供最多 10 个进程和最少 3 个进程。
至于--concurrency
celery默认使用multiprocessing来并发执行任务。可以使用 --concurrency
参数更改工作人员的数量 processes/threads,如果未设置,则默认为可用的数量 CPU。因此,例如 --concurrency=5
将使用 5 个进程,这意味着 5 个任务可以同时 运行。
在我的 /etc/defaults/celeryd
配置文件中,我设置了:
CELERYD_NODES="agent1 agent2 agent3 agent4 agent5 agent6 agent7 agent8"
CELERYD_OPTS="--autoscale=10,3 --concurrency=5"
我知道守护进程生成 8 个 celery worker,但我完全不确定 autoscale
和 concurrency
一起做什么。我认为并发是一种指定工作人员可以使用的最大线程数的方法,而自动缩放是工作人员在必要时扩大和缩小子工作人员规模的一种方式。
这些任务的负载很大(大约 20-50kB),大约有 2-3 百万个这样的任务,但每个任务的运行时间不到一秒。我看到内存使用量激增,因为代理将任务分配给每个工作人员,从而多次复制有效负载。
我认为问题出在配置上,worker + concurrency + autoscaling 的组合过度了,我想更好地理解这三个选项的作用。
让我们来区分工人和工人进程。你生成一个 celery worker,然后生成许多进程(取决于 --concurrency
和 --autoscale
,默认情况下生成与机器上的核心一样多的进程)。 运行 除非您想进行路由,否则在一台特定机器上有多个 worker 是没有意义的。
我建议 运行 使用默认进程数的每台机器只配置 1 个工人。这将通过消除工作人员之间的数据重复来减少内存使用。
如果您仍然有内存问题,请将数据保存到存储中并仅将一个 ID 传递给工作人员。
当使用 --autoscale
时,进程数使用 max/min 值动态设置,使工作人员能够根据负载进行扩展,而当使用 --concurrency
时,进程数使用固定值静态设置数字。所以这两个一起使用是没有意义的。
Celery --autoscale
负责根据负载动态地扩大和缩小池。这反过来会在有工作要做时添加更多进程,并在工作负载较低时删除进程。因此,例如 --autoscale=10,3
将为您提供最多 10 个进程和最少 3 个进程。
至于--concurrency
celery默认使用multiprocessing来并发执行任务。可以使用 --concurrency
参数更改工作人员的数量 processes/threads,如果未设置,则默认为可用的数量 CPU。因此,例如 --concurrency=5
将使用 5 个进程,这意味着 5 个任务可以同时 运行。