celery -A proj report
en la edición.master
de Apio.Mi aplicación está desarrollada usando django1.11 y celery4.1 [sqs]. Se implementa en Amazon AWS a través de Elastic Beanstalk. AWS SQS es el intermediario.
El problema aparece todas las noches alrededor de las 10:42 p.m. y dura aproximadamente 1 hora. Empiezan a ejecutarse decenas de miles de tareas backend_cleanup. Según la lista de resultados de la tarea en el Administrador, cada tarea se ejecuta correctamente. El uso de la CPU a veces se mantiene al 100%. Cada página de la aplicación es difícil de abrir. 1 hora después del problema, el uso de la CPU vuelve a la normalidad. Sin embargo, las colas se están acumulando. No se puede ejecutar ninguna tarea de delay (). Tengo que purgar la cola en SQS, reiniciar la aplicación y volver a cargar el código completo en AWS Elastic Beanstalk. Entonces las tareas de delay () se ejecutarán normalmente. Si no purgo, reinicio o vuelvo a cargar, no se ejecutará ninguna de las tareas asíncronas. Incluso la tarea de limpieza de backend incorporada no puede iniciarse. Mi aplicación no tiene tareas periódicas o crontab, excepto la tarea incorporada celery.backend_cleanup. ¿Alguien podría ayudarme con este problema?
Necesito que toda la aplicación funcione normalmente después de que finalicen las tareas backend_cleanup.
Descrito en los ## Pasos para reproducir
Acabo de descubrir que el problema probablemente esté relacionado con la tarea incorporada, celery.backend_cleanup. Acabo de ejecutar la aplicación en el entorno de desarrollo local. Cuando eran las 10:42 pm, se iniciaron y ejecutaron con éxito tareas tremendas de backend_cleanup. Sin embargo, después de un par de segundos, ocurrió un error. Aquí está el error.
[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)
Mientras tanto, la cola desapareció de AWS SQS. Luego, algunas de las tareas backend_cleanup continuaron ejecutándose. Y finalmente, apareció una advertencia.
[2017-10-23 22: 51: 28,967: WARNING / MainProcess] Restaurando 10 mensajes no reconocidos
Y finalmente, se detuvo la conexión HTTPS a la cola de SQS. La aplicación no se pudo volver a conectar a SQS a menos que la volviera a implementar en AWS Elastic Beanstalk.
¿Alguien podría ayudarme con este problema? Cualquier respuesta será apreciada significativamente.
Creo que resolví el problema. El problema nunca ocurre después de cambiar CELERY_RESULT_BACKEND a "redis" de "django-db" y cambiar CELERY_TIMEZONE a "UTC". Aunque los Resultados de tareas en Django Admin dejaron de agregar resultados de tareas, mi problema se resolvió en gran medida.
Simplemente puede sobrescribir el programa y evitar usar 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}}
,
Comentario más útil
Simplemente puede sobrescribir el programa y evitar usar 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}} ,