Celery: Zehntausende backend_cleanup-Aufgaben werden seit 22:42 Uhr jede Nacht ausgeführt. Alle asynchronen Funktionen funktionieren nicht mehr

Erstellt am 21. Okt. 2017  ·  3Kommentare  ·  Quelle: celery/celery

Checkliste

  • [x] Ich habe die Ausgabe von celery -A proj report in die Ausgabe aufgenommen.
    (wenn Sie dies nicht können, dann geben Sie zumindest den Sellerie an
    betroffene Version).
  • [x] Ich habe überprüft, dass das Problem für den master Zweig von Celery besteht.

Meine App wird mit django1.11 und celery4.1[sqs] entwickelt. Es wird auf Amazon AWS über Elastic Beanstalk bereitgestellt. AWS SQS ist der Broker.

Schritte zum Reproduzieren

Die Ausgabe erscheint jeden Abend gegen 22:42 Uhr und dauert etwa 1 Stunde. Zehntausende von backend_cleanup-Aufgaben werden ausgeführt. Gemäß der Liste der Aufgabenergebnisse im Admin wird jede Aufgabe erfolgreich ausgeführt. Die CPU-Auslastung bleibt manchmal bei 100%. Jede Seite der App ist schwer zu öffnen. 1 Stunde nach dem Problem ist die CPU-Auslastung wieder normal. Die Warteschlangen verkeilen jedoch. Alle delay()-Aufgaben können nicht ausgeführt werden. Ich muss die Warteschlange in SQS bereinigen, die App neu starten und den gesamten Code erneut in AWS Elastic Beanstalk hochladen. Dann werden die delay()-Aufgaben normal ausgeführt. Wenn ich das Löschen, Neustarten oder Hochladen nicht durchführe, wird keine der asynchronen Aufgaben ausgeführt. Auch die eingebaute Backendcleaup-Aufgabe kann nicht gestartet werden. Meine App hat keine periodischen oder crontab-Aufgaben außer der integrierten celery.backend_cleanup-Aufgabe. Könnte mir jemand bei diesem Problem helfen?

Erwartetes Verhalten

Ich muss die gesamte App normal ausführen, nachdem die backend_cleanup-Aufgaben abgeschlossen sind.

Tatsächliches Verhalten

Beschrieben in den ## Schritten zur Reproduktion

sellerie-sqs-worker-report.txt

Question

Hilfreichster Kommentar

Sie können den Zeitplan einfach überschreiben und die Verwendung von crontab vermeiden:
'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}} ,

Alle 3 Kommentare

Ich habe gerade festgestellt, dass das Problem wahrscheinlich bei der integrierten Aufgabe celery.backend_cleanup liegt. Ich habe die App gerade in der lokalen Entwicklungsumgebung ausgeführt. Als es 22:42 Uhr war, wurden gewaltige Backend_Cleanup-Aufgaben gestartet und erfolgreich ausgeführt. Nach ein paar Sekunden ist jedoch ein Fehler aufgetreten. Hier ist der Fehler.

[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)

Inzwischen ist die Warteschlange aus AWS SQS verschwunden. Dann wurden einige der backend_cleanup-Aufgaben weiter ausgeführt. Und schließlich tauchte eine Warnung auf.

[2017-10-23 22:51:28,967: WARNING/MainProcess] Wiederherstellen von 10 unbestätigten Meldung(en)

Und schließlich wurde die HTTPS-Verbindung zur SQS-Warteschlange gestoppt. Die App konnte sich nicht erneut mit SQS verbinden, es sei denn, ich habe die App erneut in AWS Elastic Beanstalk bereitgestellt.

Könnte mir jemand bei diesem Problem helfen? Jede Antwort wird sehr geschätzt.

Ich glaube, ich habe das Problem gelöst. Das Problem tritt nie auf, nachdem ich CELERY_RESULT_BACKEND von "django-db" in "redis" und CELERY_TIMEZONE in "UTC" geändert habe. Obwohl die Aufgabenergebnisse in Django Admin keine Aufgabenergebnisse mehr hinzugefügt haben, war mein Problem weitgehend gelöst.

Sie können den Zeitplan einfach überschreiben und die Verwendung von crontab vermeiden:
'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}} ,

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen