Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 芹菜:为什么从接受任务到开始执行任务之间有几秒钟的时间间隔?_Python_Django_Performance_Celery_Django Celery - Fatal编程技术网

Python 芹菜:为什么从接受任务到开始执行任务之间有几秒钟的时间间隔?

Python 芹菜:为什么从接受任务到开始执行任务之间有几秒钟的时间间隔?,python,django,performance,celery,django-celery,Python,Django,Performance,Celery,Django 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" ... 由具有以下配置的(远程)工作程序处理的:

我有一个芹菜任务:

@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店发生了什么事?我假设我有一个芹菜配置问题,并且在某些地方缺乏资源来更快地处理这些任务。有什么想法会让他们慢下来吗?

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


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

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



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

这可能需要几分钟甚至几小时,这取决于员工的利用率,对吧。如果您发送10000个任务,而您只有10个可用的辅助进程,谁知道其他9990个任务何时开始…我想您是指线程,而不是辅助进程,对吗?如果是这样的话,你是说芹菜在这里等待传递给线程,因为没有线程可用?这意味着如果我增加自动缩放,我应该看到这里的改进吗?您使用预工作并发,所以这些都是简单的过程。我们的集群也使用这个功能,我们每天运行多达500万个任务……信不信由你,自动缩放是芹菜不推荐的功能,因为没有人对维护它感兴趣。因此,我建议您修复并发性
N*
,因为您的任务是IO绑定的,因此您的工作进程数可以是内核数的2-3倍。它甚至可能是分钟,甚至是小时,这取决于工作进程的利用率,对吧。如果您发送10000个任务,而您只有10个可用的辅助进程,谁知道其他9990个任务何时开始…我想您是指线程,而不是辅助进程,对吗?如果是这样的话,你是说芹菜在这里等待传递给线程,因为没有线程可用?这意味着如果我增加自动缩放,我应该看到这里的改进吗?您使用预工作并发,所以这些都是简单的过程。我们的集群也使用这个功能,我们每天运行多达500万个任务……信不信由你,自动缩放是芹菜不推荐的功能,因为没有人对维护它感兴趣。因此,我建议您修复并发性
N*
,因为您的任务是IO绑定的,因此您的工作进程数可以是内核数的2-3倍。如前所述,此工作进程在任何给定时间都面临数千个任务。由于线程有限,队列中几乎总是有任务(数千个)。但这不是问题所在。在任务被接受后,我看到了一个缺口。我假设这意味着已经有一个线程分配给它。然而,线程实际开始执行它还有几秒钟的时间间隔。我的问题是为什么会有这样的差距——这就是为什么你们会看到延迟。我认为你们可能会混淆任务接收和任务接受。接收的任务是队列时间。这是接受任务后的一个间隙。所以在线程已经开始执行之后,请参见。。。每个辅助进程有N个由其控制的辅助进程。它预取M个任务(您不能禁用预取),但如果其所有工作进程都很忙,则可能需要一些时间来启动接收到的任务。同样,我不关心任务开始执行前的分钟或小时。我关心的是任务开始执行后的执行时间。请看我的问题。任务完成时间不考虑队列中的时间。现在是执行时间。早些时候,我的任务耗时1-3秒。现在他们要5-8秒。这不是4秒的额外排队时间。如前所述,这是额外的4s执行时间,这个工人在任何给定的时间都要面对成千上万的任务。由于线程有限,队列中几乎总是有任务(数千个)。但这不是问题所在。在任务被接受后,我看到了一个缺口。我假设这意味着已经有一个线程分配给它。然而,线程实际开始执行它还有几秒钟的时间间隔。我的问题是为什么会有这样的差距——这就是为什么你们会看到延迟。我认为你们可能会混淆任务接收和任务接受。接收的任务是队列时间。这是接受任务后的一个间隙。所以在线程已经开始执行之后,请参见。。。每个辅助进程有N个由其控制的辅助进程。它预取M个任务(您不能禁用预取),但如果其所有工作进程都很忙,则可能需要一些时间来启动接收到的任务。同样,我不关心任务开始执行前的分钟或小时。我关心的是任务开始执行后的执行时间。请看我的简历