celery -A proj report
的输出。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.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}}
,
最有用的评论
您可以简单地覆盖计划并避免使用 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}} ,