我有一个芹菜任务:
@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"
...它由具有以下配置的(远程) worker处理:
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秒里发生了什么?我假设我有一个芹菜配置问题,并且在某些地方缺乏资源来更快地处理这些任务。你知道是什么让他们慢下来的吗?
发布于 2019-09-24 17:37:41
发生这种情况有几个可能的原因。自动缩放器可能需要一段时间才能启动。因此,根据负载情况,发送任务时可能没有足够的工作进程来运行任务,因此它们会在队列中等待一段时间(甚至可能是几分钟或几个小时),直到有可用的工作进程。
通过查看队列中有多少任务在等待,您可以很容易地监控这一点。如果队列总是空的,这意味着你的任务会被立即执行。如果不是,这意味着您可能想要向集群中添加新的工作进程。
https://stackoverflow.com/questions/58076605
复制相似问题