【问题标题】:Celery worker hangs without any error芹菜工人挂起没有任何错误
【发布时间】:2023-04-06 22:12:02
【问题描述】:

我有一个生产设置,用于运行 celery worker 向远程服务发出 POST / GET 请求并存储结果,它每 15 分钟处理大约 20k 个任务的负载。

问题是工人无缘无故麻木了,没有错误,没有警告。

我也尝试添加多处理,结果相同。

在日志中我看到执行任务的时间增加了,就像在s中成功

更多详情请看https://github.com/celery/celery/issues/2621

【问题讨论】:

  • “在 MongoDB 中存储响应”部分是异步的吗?有相关的日志吗?

标签: python celery blocking gevent


【解决方案1】:

如果您的 celery worker 有时会卡住,您可以使用 strace & lsof 找出卡住的系统调用。

例如:

$ strace -p 10268 -s 10000
Process 10268 attached - interrupt to quit
recvfrom(5,

10268 是 celery worker 的 pid,recvfrom(5 表示 worker 停止从文件描述符接收数据。

那么你可以使用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)
......

表示worker卡在一个tcp连接上(你可以在FD列看到5u)。

requests这样的一些python包阻塞等待来自peer的数据,这可能会导致celery worker挂起,如果你使用requests,请确保设置timeout参数。


你看过这个页面吗:

https://www.caktusgroup.com/blog/2013/10/30/using-strace-debug-stuck-celery-tasks/

【讨论】:

    【解决方案2】:

    当我使用延迟 shared_task 时,我也遇到了这个问题 芹菜、昆布、amqp、台球。使用时调用API后 @shared_task 的延迟(),所有功能都很好,但是当它延迟时 挂断了。

    所以,问题出在主应用程序 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 中提到的Application 导入App 并放在这里

    注意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 重命名为 asynchronous。

    【讨论】:

      【解决方案3】:

      按照本教程进行操作

      Celery Django Link

      将以下内容添加到设置中

      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'
      

      【讨论】:

        猜你喜欢
        • 2016-07-12
        • 2011-09-23
        • 2016-09-12
        • 2013-05-06
        • 2019-08-01
        • 1970-01-01
        • 2021-09-23
        • 2021-02-21
        • 2017-04-23
        相关资源
        最近更新 更多