【问题标题】:Celery randomly fails silently when handling tasksCelery 在处理任务时随机无声地失败
【发布时间】:2020-11-18 05:04:08
【问题描述】:

我有一个 Django 项目,它使用 Celery 运行后台任务和计划任务(通过 Celery Beat)。它在本地运行良好,但在生产中存在一些间歇性问题。这是困难的部分,50% 的时间任务按预期完成,但另外 50% 的时间,它默默地“失败”。大量计划任务顺利完成。

版本详情

django = "==2.2.4"
celery = "==4.4.6"

python_version = "3.6"

这是代码的简化示例:

models.py

class Task(models.Model):
    is_actioned = models.BooleanField(default=False...)
    # Other fields...

    def create_lead(self):
        Lead.objects.create(....)

    def create_something_else(self):
        # Add M2M records, for example: lead.add(obj)

    def handle_task(self):
        self.create_lead()
        self.create_something_else()
        # Make various API calls
    
    def action(self):
        self.handle_task()
        self.is_actioned = True
        self.save()

tasks.py

@shared_task
def action_task(task_id):
    tasks = Task.objects.get(id=task_id)
    task.action()

views.py

# Call the task
action_task.delay(task.id)

Procfile

web: daphne -b 0.0.0.0 -p 5000 myproj.asgi:application
worker: celery worker --app=myproj.celery -l debug
beat: celery beat --app=myproj.celery -l info

查看日志时,工作人员似乎没有收到失败的任务。

奇怪的是 Celery 似乎“选择”了哪些方法会失败/跳过。例如,Task.create_lead 将被成功调用,但 Task.create_something_else 将不会被调用。但是,self.is_actioned = True 将始终运行而不会失败。我希望这会“停止”它失败的代码中的任何一点,而不是运行self.is_actioned = True

我检查了服务器内存使用情况,它大约在 73% 左右,奇数峰值高达 81%(这似乎有点高?)。 CPU 平均在 1% 到 5% 之间,奇数峰值高达 30%。当action_task 成功完成时,执行需要 5 到 7 秒(根据工作人员日志)。

action_task 将失败,但随后,如果没有我自己的干预/服务器重新启动,下次调用它 (action_task.delay(task.id)) 将按预期工作。任何有关如何修复或更好地调试此问题的帮助或指示将不胜感激。

【问题讨论】:

    标签: python django celery


    【解决方案1】:

    这毕竟是一个内存问题。在将服务器上的可用 RAM 增加一倍之后(以及 CPU 内核在负载下现在几乎没有超过 5% 的使用率),内存使用率现在大约是 40% 或 10%。有了额外的内存,Celery 进程已经运行了大约 2 周而没有问题。

    希望这对遇到类似问题的人有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-02
      • 2016-05-24
      • 2017-02-02
      • 2018-06-03
      • 2017-05-12
      • 1970-01-01
      • 2012-06-06
      • 1970-01-01
      相关资源
      最近更新 更多