在Celery worker上使用可变数量CPU的子进程作业

时间:2016-03-03 20:57:42

标签: celery

我们有一个应用程序,我们处理各种处理节点以运行用户定义的作业(python parlance 中的子进程)。这些节点可以有1个或多个核心(比如说这个讨论的2个)。用户定义他们想要使用的核心数(1或2)来运行他们的子进程。调度应用程序调度相关节点上的作业。例如,如果我们有两个节点有1个核心(A和B),一个节点有2个核心(C):

  • 如果安排了1个核心的四个作业,则调度程序在A中为1个核心执行一个作业,在B中执行一个作业,为C中的1个核心执行两个作业
  • 如果安排了1个核心的3个作业和2个核心的1个作业,则调度程序为A中的1个核心执行一个作业,B中执行1个作业,C中的2个核心作业和1个核心的1个作业等待

因此,2核的作业优先于1核的两个作业。这样,如果节点未被占用,它仍然可以用于1核心作业。如果弹出2核的作业,则调度程序必须确保不再将任何1核作业安排到2核节点,以便尽快解除节点的负担。

使用Celery中的专用队列实现这一点相对简单:需要2个核心的作业,执行“2cores”队列(在这种情况下,我们每个处理节点只有一个工作者),其他工作转到在单核上运行的工人队列。

不幸的是,这种策略会限制我们处理场的有效使用,因为使用单核的用户作业会更多。让2核心队列大部分闲置将是一种浪费。我们正在寻找一种通过最大限度地利用农场来实现自动平衡的方法,同时仍然可以运行需要更多资源的工作。

如何在考虑这些要求的情况下设置基于芹菜的应用程序?

1 个答案:

答案 0 :(得分:0)

工作人员可以同时收听两个队列,但它会按循环原则选择它们。它将首先尝试在第一个队列上选择任务,如果没有任务,它将等到一个出现。之后,它将开始侦听第二个队列,并等到那里有任务。等等。你可能最终会有太多的工作人员在等待两个核心的任务。排队,什么都不做。

Celery不支持任务优先级,因为你不能同时拥有两个独立的队列,我只能想到一个选项。对于这两种任务,您仍然可以有两个单独的队列,但是您还需要一个逻辑来定期检查队列的大小,使用"两个核心"任务并动态添加或删除侦听该队列的工作人员,具体取决于其大小。