我有一个芹菜任务:
@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 秒的任务,在线程接受任务和执行任务第一行之间的时间内花费了 ~4s:
[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
那4秒发生了什么?我假设我有一个 Celery 配置问题,并且某处缺乏资源来更快地处理这些任务。有什么想法可以减慢他们的速度吗?
发生这种情况有几个可能的原因。自动缩放程序可能需要一些时间才能启动。因此,根据您的负载,您可能没有足够的工作进程在发送任务时运行任务,因此它们在队列中等待一段时间(甚至可能是几分钟或几小时(,直到有可用的工作进程。
您可以通过查看队列中正在等待的任务数来轻松监控这一点。如果队列始终为空,则意味着您的任务将立即执行。如果没有,这意味着您可能希望向群集添加新辅助角色。