Celery:根据worker内存动态分配并发

Celery: dynamically allocate concurrency based on worker memory

我的 celery 用例:启动一个 celery worker 集群并向该集群发送许多任务,然后在所有任务完成后终止集群(通常约 2 小时)。

我目前将其设置为使用默认并发,这对我的用例来说不是最佳选择。我看到可以指定 --concurrency argument in celery,它指定工作人员将 运行 并行执行的任务数。这也不适合我的用例,因为,例如:

因为我经常将这些集群用于非常不同类型的任务,所以我不想每次都必须事先手动分析任务并手动设置并发性。

我想要的行为是有内存阈值。例如,我可以在配置文件中设置:

min_worker_memory = .6
max_worker_memory = .8

意味着工作人员将 concurrency 递增 1,直到工作人员超过使用超过 80% 内存的阈值。然后,它将并发性递减 1。它将在集群的生命周期内保持该并发性,除非工作内存低于 60%,此时它将再次将并发性递增 1。

是否有任何我可以利用的现有芹菜设置,或者我必须自己实现这个逻辑吗? max memory per child 似乎有点接近我想要的,但这以杀死进程结束,这不是我想要的。

不幸的是,Celery 没有提供 Autoscaler that scales up/down depending on the memory usage. However, being a well-designed piece of software, it gives you an interface that you may implement up to however you like. I am sure with the help of the psutil package you can easily create your own autoscaler. Documentation reference