celery -A proj report
dans le numéro.master
de Celery.Mon application est développée en utilisant django1.11 et celery4.1[sqs]. Il est déployé sur Amazon AWS via Elastic Beanstalk. AWS SQS est le courtier.
Le problĂšme apparaĂźt tous les soirs vers 22h42, pendant environ 1 heure. Des dizaines de milliers de tĂąches backend_cleanup commencent Ă ĂȘtre exĂ©cutĂ©es. Selon la liste des rĂ©sultats de la tĂąche dans l'administrateur, chaque tĂąche est exĂ©cutĂ©e avec succĂšs. L'utilisation du processeur reste parfois Ă 100 %. Chaque page de l'application est difficile Ă ouvrir. 1 heure aprĂšs le problĂšme, l'utilisation du processeur est revenue Ă la normale. Cependant, les files d'attente se coincent. Aucune tĂąche delay() ne peut ĂȘtre exĂ©cutĂ©e. Je dois purger la file d'attente dans SQS, redĂ©marrer l'application et recharger l'intĂ©gralitĂ© du code sur AWS Elastic Beanstalk. Ensuite, les tĂąches delay() seront exĂ©cutĂ©es normalement. Si je ne fais pas la purge, le redĂ©marrage ou le re-tĂ©lĂ©chargement, aucune des tĂąches asynchrones ne sera exĂ©cutĂ©e. MĂȘme la tĂąche backendcleaup intĂ©grĂ©e ne peut pas dĂ©marrer. Mon application n'a pas de tĂąches pĂ©riodiques ou crontab, Ă l'exception de la tĂąche celery.backend_cleanup intĂ©grĂ©e. Quelqu'un pourrait-il m'aider avec ce problĂšme?
J'ai besoin que l'ensemble de l'application s'exécute normalement une fois les tùches backend_cleanup terminées.
DĂ©crit dans les ## Ătapes pour reproduire
Je viens de découvrir que le problÚme concerne probablement la tùche intégrée, celery.backend_cleanup. Je viens d'exécuter l'application dans l'environnement de développement local. Quand il était 22h42, d'énormes tùches backend_cleanup ont démarré et exécutées avec succÚs. Cependant, aprÚs quelques secondes, une erreur s'est produite. Voici l'erreur.
[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)
Pendant ce temps, la file d'attente a disparu d'AWS SQS. Ensuite, quelques-unes des tùches backend_cleanup ont continué à s'exécuter. Et enfin, un avertissement est apparu.
[2017-10-23 22:51:28,967: WARNING/MainProcess] Restauration de 10 message(s) non acquittés
Et enfin, la connexion HTTPS Ă la file d'attente SQS s'est arrĂȘtĂ©e. L'application n'a pas pu se reconnecter Ă SQS Ă moins que je ne redĂ©ploye l'application sur AWS Elastic Beanstalk.
Quelqu'un pourrait-il m'aider avec ce problÚme? Toute réponse sera grandement appréciée.
Je pense avoir résolu le problÚme. Le problÚme ne se produit jamais aprÚs avoir changé CELERY_RESULT_BACKEND en "redis" de "django-db", et changé CELERY_TIMEZONE en "UTC". Bien que les résultats de tùche dans Django Admin aient cessé d'ajouter des résultats de tùche, mon problÚme avait été en grande partie résolu.
Vous pouvez simplement écraser le planning et éviter d'utiliser 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}}
,
Commentaire le plus utile
Vous pouvez simplement écraser le planning et éviter d'utiliser 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}} ,