Celery: 午後10時42分以降、毎晩何万ものbackend_cleanupタスクが実行されました。 すべての非同期関数が機能しなくなります

作成日 2017年10月21日  ·  3コメント  ·  ソース: celery/celery

チェックリスト

  • [x] celery -A proj reportの出力を問題に含めました。
    (これができない場合は、少なくともセロリを指定してください
    影響を受けるバージョン)。
  • [x]この問題がCeleryのmasterブランチに対して存在することを確認しました。

私のアプリはdjango1.11とcelery4.1 [sqs]を使用して開発されています。 ElasticBeanstalkを介してAmazonAWSにデプロイされます。 AWSSQSはブローカーです。

再現する手順

この問題は毎晩午後10時42分頃に発生し、約1時間続きます。 何万ものbackend_cleanupタスクが実行され始めます。 管理者のタスク結果のリストに従って、各タスクは正常に実行されます。 CPU使用率が100%のままになる場合があります。 アプリのすべてのページを開くのは難しいです。 問題が発生してから1時間後、CPU使用率は通常に戻ります。 ただし、キューはくさびです。 delay()タスクは実行できません。 SQSでキューをパージし、アプリを再起動して、コード全体をAWS ElasticBeanstalkに再アップロードする必要があります。 その後、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)

その間、キューはAWSSQSから消えました。 その後、backend_cleanupタスクのいくつかが実行を続けました。 そして最後に、警告が表示されました。

[2017-10-23 22:51:28,967:警告/ MainProcess] 10個の未確認メッセージを復元しています

そして最後に、SQSキューへのHTTPS接続が停止しました。 アプリをAWSElastic 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 評価