我有一个生产设置,用于运行芹菜工作者对远程服务发出POST / GET请求并存储结果,它每15分钟处理大约20k个任务的负载。
问题是工人无缘无故麻木,没有错误,没有警告。
我也试过添加多处理,结果相同。
在日志中,我看到执行任务的时间增加,就像s
中的成功一样答案 0 :(得分:19)
如果您的芹菜工作者有时会卡住,您可以使用strace & lsof
找出卡住的系统调用。
例如:
$ strace -p 10268 -s 10000
Process 10268 attached - interrupt to quit
recvfrom(5,
10268是芹菜工人的pid,recvfrom(5
表示工人停止从文件描述符接收数据。
然后,您可以使用lsof
查看此工作进程中的5
。
lsof -p 10268
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
......
celery 10268 root 5u IPv4 828871825 0t0 TCP 172.16.201.40:36162->10.13.244.205:wap-wsp (ESTABLISHED)
......
它表示工作人员陷入了tcp连接(您可以在5u
列中看到FD
)。
某些python软件包如requests
阻止等待来自对等方的数据,这可能导致芹菜工作者挂起,如果您使用requests
,请确保设置timeout
参数。< / p>
您是否看过此页:
https://www.caktusgroup.com/blog/2013/10/30/using-strace-debug-stuck-celery-tasks/
答案 1 :(得分:1)
当我使用延迟shared_task与 芹菜,海带,amqp,台球。使用完后调用API @shared_task的delay(),所有功能都很好,但是要延迟 它挂断了。
因此,问题出在主应用程序 init .py中,以下设置 失踪了
这将确保在#Django启动时始终导入应用程序,以便shared_task将使用此应用程序。
在 init .py
中from __future__ import absolute_import, unicode_literals
# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .celery import app as celeryApp
#__all__ = ('celeryApp',)
__all__ = ['celeryApp']
注意1:代替celery_app放置Aplication名称,表示celery.py中提到的应用程序将应用程序导入并放在此处
注意2:**如果上述解决方案仅在共享任务中面临挂起问题,则可能会解决您的问题并忽略以下问题。
也想提到A =另一个问题,如果有人遇到错误111 连接问题,然后请检查amqp == 2.2.2的版本, 台球== 3.5.0.3,芹菜== 4.1.0,海带== 4.1.0 支持与否。提到的版本只是一个例子。并且 检查系统中是否安装了redis(如果有的话,请使用redis)。
还要确保您正在使用Kombu 4.1.0。在最新版本中 Kombu将async重命名为异步。
答案 2 :(得分:0)
遵循本教程
在设置中添加以下内容
NB为传输和结果安装redis
# TRANSPORT
CELERY_BROKER_TRANSPORT = 'redis'
CELERY_BROKER_HOST = 'localhost'
CELERY_BROKER_PORT = '6379'
CELERY_BROKER_VHOST = '0'
# RESULT
CELERY_RESULT_BACKEND = 'redis'
CELERY_REDIS_HOST = 'localhost'
CELERY_REDIS_PORT = '6379'
CELERY_REDIS_DB = '1'