Celery: Dezenas de milhares de tarefas backend_cleanup executadas todas as noites desde 22h42. Todas as funções assíncronas param de funcionar

Criado em 21 out. 2017  ·  3Comentários  ·  Fonte: celery/celery

Lista de controle

  • [x] Incluí a saída de celery -A proj report na edição.
    (se você não for capaz de fazer isso, pelo menos especifique o aipo
    versão afetada).
  • [x] Eu verifiquei que o problema existe no ramo master do aipo.

Meu aplicativo foi desenvolvido usando django1.11 e celery4.1 [sqs]. Ele é implantado no Amazon AWS por meio do Elastic Beanstalk. AWS SQS é o corretor.

Passos para reproduzir

O problema aparece todas as noites por volta das 22h42, durando cerca de 1 hora. Dezenas de milhares de tarefas backend_cleanup começam a ser executadas. De acordo com a lista de resultados da tarefa no Admin, cada tarefa é executada com sucesso. O uso da CPU às vezes fica em 100%. Todas as páginas do aplicativo são difíceis de abrir. 1 hora após o problema, o uso da CPU voltou ao normal. No entanto, as filas estão diminuindo. Qualquer tarefa delay () não pode ser executada. Tenho que limpar a fila no SQS, reiniciar o aplicativo e reenviar o código inteiro para o AWS Elastic Beanstalk. Então as tarefas delay () serão executadas normalmente. Se eu não limpar, reiniciar ou reenviar, nenhuma das tarefas assíncronas será executada. Mesmo a tarefa backendcleaup integrada não pode ser iniciada. Meu aplicativo não tem nenhuma tarefa periódica ou crontab, exceto a tarefa interna celery.backend_cleanup. Alguém poderia me ajudar com esse problema?

Comportamento esperado

Preciso que o aplicativo inteiro funcione normalmente depois que as tarefas backend_cleanup forem concluídas.

Comportamento real

Descrito nas ## etapas para reproduzir

celery-sqs-worker-report.txt

Question

Comentários muito úteis

Você pode simplesmente substituir a programação e evitar o uso do 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 comentários

Acabei de descobrir que o problema provavelmente é sobre a tarefa interna, celery.backend_cleanup. Acabei de executar o aplicativo no ambiente de desenvolvimento local. Quando eram 22h42, enormes tarefas de backend_cleanup foram iniciadas e executadas com sucesso. No entanto, após alguns segundos, ocorreu um erro. Aqui está o erro.

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

Enquanto isso, a fila desapareceu do AWS SQS. Em seguida, algumas das tarefas backend_cleanup continuaram a ser executadas. E, finalmente, um aviso apareceu.

[2017-10-23 22: 51: 28,967: WARNING / MainProcess] Restaurando 10 mensagens não confirmadas

E, finalmente, a conexão HTTPS com a fila SQS foi interrompida. O aplicativo não pôde se reconectar ao SQS, a menos que eu reimplante o aplicativo no AWS Elastic Beanstalk.

Alguém poderia me ajudar com esse problema? Qualquer resposta será apreciada significativamente.

Acho que resolvi o problema. O problema nunca acontece depois que eu mudei CELERY_RESULT_BACKEND para "redis" de "django-db", e mudei CELERY_TIMEZONE para "UTC". Embora os resultados de tarefas no Django Admin parassem de adicionar quaisquer resultados de tarefas, meu problema foi amplamente resolvido.

Você pode simplesmente substituir a programação e evitar o uso do 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}} ,

Esta página foi útil?
0 / 5 - 0 avaliações