【问题标题】:Celery: dynamically allocate concurrency based on worker memoryCelery:根据工作内存动态分配并发
【发布时间】:2020-08-03 19:22:03
【问题描述】:

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

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

  • 集群 A 可能有非常占用内存的任务,--concurrency=1 是有道理的,但是
  • 集群 B 可能内存较少,--concurrency=50 会优化我的工作人员。

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

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

min_worker_memory = .6
max_worker_memory = .8

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

我可以利用任何现有的 celery 设置来执行此操作,还是我必须自己实现此逻辑? max memory per child 似乎有点接近我想要的,但这会导致进程被杀死,这不是我想要的。

【问题讨论】:

    标签: celery


    【解决方案1】:

    不幸的是,Celery 没有提供一个Autoscaler,它根据内存使用情况向上/向下扩展。但是,作为一款设计良好的软件,它为您提供了一个界面,您可以随意实现它。我确信在 psutil 包的帮助下,您可以轻松创建自己的自动缩放器。 Documentation reference.

    【讨论】:

    猜你喜欢
    • 2023-04-06
    • 2013-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-15
    • 2013-07-01
    相关资源
    最近更新 更多