celery -A proj report
in die Ausgabe aufgenommen.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.
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?
Ich muss die gesamte App normal ausführen, nachdem die backend_cleanup-Aufgaben abgeschlossen sind.
Beschrieben in den ## Schritten zur Reproduktion
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}}
,
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}} ,