我有一个使用Celery运行后台任务和计划任务的Django项目(通过Celery Beat)。它在本地运行良好,但是在生产中存在一些间歇性问题。这是很困难的部分,任务有50%的时间完成了预期的任务,而其他50%的任务却无声地“失败”。众多预定任务可以毫无问题地完成。
django = "==2.2.4"
celery = "==4.4.6"
python_version = "3.6"
这是代码的简化示例:
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()
@shared_task
def action_task(task_id):
tasks = Task.objects.get(id=task_id)
task.action()
# Call the task
action_task.delay(task.id)
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)
)将会按预期工作。对于如何解决或更好地调试它的任何帮助或指示,将不胜感激。
答案 0 :(得分:0)
这毕竟是内存问题。将服务器上的可用RAM加倍(并且在负载下勉强达到5%以上的CPU核心)后,内存使用率现在为40%(约占10%)。有了额外的内存,Celery进程已经运行了大约2周,没有任何问题。
希望这对遇到类似问题的人有帮助!