celery -A proj report
na edição.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.
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?
Preciso que o aplicativo inteiro funcione normalmente depois que as tarefas backend_cleanup forem concluídas.
Descrito nas ## etapas para reproduzir
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}}
,
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}} ,