Celery: Decenas de miles de tareas backend_cleanup ejecutadas todas las noches desde las 10:42 p.m. Todas las funciones asincrónicas dejan de funcionar

Creado en 21 oct. 2017  ·  3Comentarios  ·  Fuente: celery/celery

Lista de Verificación

  • [x] He incluido el resultado de celery -A proj report en la edición.
    (si no puede hacer esto, al menos especifique el Apio
    versión afectada).
  • [x] He verificado que el problema existe en la sucursal 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.

pasos para reproducir

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?

Comportamiento esperado

Necesito que toda la aplicación funcione normalmente después de que finalicen las tareas backend_cleanup.

Comportamiento real

Descrito en los ## Pasos para reproducir

celery-sqs-worker-report.txt

Question

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}} ,

Todos 3 comentarios

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}} ,

¿Fue útil esta página
0 / 5 - 0 calificaciones