【问题标题】:Celery: why is there a multi-second time gap from when a task is accepted and when it starts to execute?Celery:为什么从接受任务到开始执行任务有几秒钟的时间间隔?
【发布时间】:2019-09-24 08:58:05
【问题描述】:

我有一个芹菜任务:

@app.task(bind=True, soft_time_limit=FreeSWITCHConstants.EXECUTE_ATTEMPTS_LOCAL_SOFT_TIME_LIMIT)
def execute_attempt_local(self, attempt_id, provider_id, **kwargs):
  print "PERF - entering execute_attempt_local"
  ...

由具有以下配置的(远程)工作人员处理:

celery -A mycompany.web.taskapp worker n -Q execute_attempts-2 --autoscale=4,60

此任务一次生成数千个,历来在 1-3 秒内完成(它主要是 I/O 绑定任务)。

最近随着我们应用程序的整体使用量增加,此任务的完成时间平均增加到 5-8 秒,我试图了解是什么占用了额外的时间。我注意到对于需要 5-8 秒的许多任务,从线程接受任务到执行任务的第一行之间的时间大约需要 4 秒:

[2019-09-24 13:15:16,627: DEBUG/MainProcess] Task accepted: mycompany.ivr.freeswitch.tasks.execute_attempt_local[d7585570-e0c9-4bbf-b3b1-63c8c5cd88cc] pid:7086
...
[2019-09-24 13:15:22,180: WARNING/ForkPoolWorker-60] PERF - entering execute_attempt_local

在那个 4s 中发生了什么?我假设我有一个 Celery 配置问题,并且在某个地方缺乏资源来让这些任务更快地处理。有什么想法可能会减慢他们的速度吗?

【问题讨论】:

  • 它甚至可能是几分钟,甚至几个小时 - 取决于您的工人的利用率,对吧。如果你发送了 10000 个任务,而你只有 10 个可用的工作进程,谁知道其他 9990 个任务什么时候开始......
  • 我认为你的意思是线程,而不是工人,对吧?如果是这样,您是说 celery 在这里等待移交给线程,因为没有线程可用?这意味着如果我增加自动缩放,我应该在这里看到改进吗?
  • 你使用 prefork 并发,所以这些都是简单的过程。我们的集群也使用它,我们每天运行多达 500 万个任务......
  • Autoscaling 是,不管你信不信,Celery 的弃用功能,因为没有人有兴趣维护它。所以我建议你修复并发 N * <number of cores>,因为你的任务是 IO 绑定的,所以你可以拥有比核心数量多 2-3 倍的工作进程。

标签: python django performance celery django-celery


【解决方案1】:

发生这种情况有几个可能的原因。自动缩放器可能需要一些时间才能启动。因此,根据您的负载,您可能没有足够的工作进程在发送任务时运行它们,因此它们会在队列中等待一段时间(甚至可能是几分钟或几小时),直到有可用的工作进程。

您可以通过查看队列中等待的任务数量来轻松监控这一点。如果队列始终为空,则意味着您的任务会立即执行。如果没有,这意味着您可能需要向集群中添加新的工作人员。

【讨论】:

  • 如前所述,这个工人在任何时候都面临着成千上万的任务。而且由于线程有限,队列中几乎总是有任务(数千个)。但这不是这里的问题。任务被接受后,我看到了差距。我假设这意味着已经分配了一个线程。然而,线程实际开始执行它还有几秒钟的间隙。我的问题是为什么会有这个差距
  • 正是 - 这就是您看到延迟的原因。
  • 我认为您可能会混淆收到的任务和接受的任务。收到的任务是排队时间。这是接受任务后的差距。所以它是在线程已经开始执行之后
  • 看... 每个工人都有 N 个它控制的工人进程。它预取 M 个任务(您不能禁用预取),但如果它的所有工作进程都忙,它可能需要一些时间来启动它收到的任务。
  • 再一次,我不关心任务开始执行前的几分钟或几小时。我担心它开始执行后的任务执行时间。请看我的问题。任务完成时间不考虑队列中的时间。这是执行时间。早些时候,我的任务需要 1-3 秒。现在他们正在采取5-8s。这不是 4 秒的额外排队时间。执行时间增加了 4 秒
猜你喜欢
  • 1970-01-01
  • 2023-03-09
  • 2015-10-24
  • 2019-04-21
  • 2011-12-07
  • 2017-09-11
  • 2011-12-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多