Celery: 从晚上 10 点 42 分开始,每天晚上执行数以万计的 backend_cleanup 任务。 所有异步功能停止工作

创建于 2017-10-21  ·  3评论  ·  资料来源: celery/celery

清单

  • [x] 我在问题中包含了celery -A proj report的输出。
    (如果你不能这样做,那么至少指定芹菜
    版本受影响)。
  • [x] 我已经验证了 Celery 的master分支存在这个问题。

我的应用程序是使用 django1.11 和 celery4.1[sqs] 开发的。 它通过 Elastic Beanstalk 部署在 Amazon AWS 上。 AWS SQS 是代理。

重现步骤

该问题每天晚上 10:42 左右出现,持续约 1 小时。 数以万计的 backend_cleanup 任务开始执行。 根据Admin中的任务结果列表,每个任务都执行成功。 CPU 使用率有时会保持在 100%。 应用程序的每个页面都很难打开。 问题发生1小时后,CPU使用率恢复正常。 然而,队列正在楔入。 任何 delay() 任务都无法执行。 我必须清除 SQS 中的队列,重新启动应用程序,然后将整个代码重新上传到 AWS Elastic Beanstalk。 然后 delay() 任务将正常执行。 如果我不进行清除、重新启动或重新上传,则不会执行任何异步任务。 即使是内置的 backendcleaup 任务也无法启动。 除了内置的 celery.backend_cleanup 任务,我的应用程序没有任何定期或 crontab 任务。 有人可以帮我解决这个问题吗?

预期行为

backend_cleanup 任务完成后,我需要整个应用程序正常执行。

实际行为

在## 重现步骤中描述

celery-sqs-worker-report.txt

Question

最有用的评论

您可以简单地覆盖计划并避免使用 crontab:
'celery.backend_cleanup': { 'task': 'celery.backend_cleanup', 'schedule': 86400, # every 24 hours instead of crontab('0', '4', '*') which is used in celery beat 'options': {'expires': 12 * 3600}} ,

所有3条评论

我刚刚发现问题可能出在内置任务 celery.backend_cleanup 上。 我只是在本地开发环境中运行了该应用程序。 到了晚上 10 点 42 分,大量的 backend_cleanup 任务启动并成功执行。 但是,几秒钟后,出现了错误。 这是错误。

[2017-10-23 22:51:27,677: CRITICAL/MainProcess] Unrecoverable error: Exception('Request Empty body  HTTP 599  Server aborted the SSL handshake (None)',)
Traceback (most recent call last):
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/celery/worker/worker.py", line 203, in start
    self.blueprint.start(self)
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/celery/bootsteps.py", line 119, in start
    step.start(parent)
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/celery/bootsteps.py", line 370, in start
    return self.obj.start()
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/celery/worker/consumer/consumer.py", line 320, in start
    blueprint.start(self)
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/celery/bootsteps.py", line 119, in start
    step.start(parent)
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/celery/worker/consumer/consumer.py", line 596, in start
    c.loop(*c.loop_args())
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/celery/worker/loops.py", line 88, in asynloop
    next(loop)
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/kombu/async/hub.py", line 354, in create_loop
    cb(*cbargs)
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/kombu/async/http/curl.py", line 111, in on_readable
    return self._on_event(fd, _pycurl.CSELECT_IN)
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/kombu/async/http/curl.py", line 124, in _on_event
    self._process_pending_requests()
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/kombu/async/http/curl.py", line 132, in _process_pending_requests
    self._process(curl, errno, reason)
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/kombu/async/http/curl.py", line 178, in _process
    buffer=buffer, effective_url=effective_url, error=error,
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/vine/promises.py", line 150, in __call__
    svpending(*ca, **ck)
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/vine/promises.py", line 143, in __call__
    return self.throw()
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/vine/promises.py", line 140, in __call__
    retval = fun(*final_args, **final_kwargs)
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/vine/funtools.py", line 100, in _transback
    return callback(ret)
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/vine/promises.py", line 143, in __call__
    return self.throw()
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/vine/promises.py", line 140, in __call__
    retval = fun(*final_args, **final_kwargs)
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/vine/funtools.py", line 98, in _transback
    callback.throw()
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/vine/funtools.py", line 96, in _transback
    ret = filter_(*args + (ret,), **kwargs)
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/kombu/async/aws/connection.py", line 253, in _on_status_ready
    raise self._for_status(response, response.read())
Exception: Request Empty body  HTTP 599  Server aborted the SSL handshake (None)

同时,队列从 AWS SQS 中消失了。 然后一些 backend_cleanup 任务继续执行。 最后,一个警告出现了。

[2017-10-23 22:51:28,967: WARNING/MainProcess] 恢复 10 条未确认的消息

最后,与 SQS 队列的 HTTPS 连接停止了。 除非我将该应用程序重新部署到 AWS Elastic Beanstalk,否则该应用程序无法重新连接到 SQS。

有人可以帮我解决这个问题吗? 任何回应将不胜感激。

我想我解决了这个问题。 在我将 CELERY_RESULT_BACKEND 从“django-db”更改为“redis”并将 CELERY_TIMEZONE 更改为“UTC”后,问题永远不会发生。 虽然Django Admin中的任务结果停止添加任何任务结果,但我的问题已经主要解决了。

您可以简单地覆盖计划并避免使用 crontab:
'celery.backend_cleanup': { 'task': 'celery.backend_cleanup', 'schedule': 86400, # every 24 hours instead of crontab('0', '4', '*') which is used in celery beat 'options': {'expires': 12 * 3600}} ,

此页面是否有帮助?
0 / 5 - 0 等级