首页 > 解决方案 > Celery:为什么从接受任务到开始执行任务有几秒钟的时间间隔?

问题描述

我有一个芹菜任务:

@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 配置问题,并且在某个地方缺乏资源来让这些任务更快地处理。有什么想法可能会减慢他们的速度吗?

标签: pythondjangoperformancecelerydjango-celery

解决方案


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

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


推荐阅读