web-dev-qa-db-fra.com

Céleri: WorkerLostError: Worker sorti prématurément: signal 9 (SIGKILL)

J'utilise Celery avec RabbitMQ dans mon Django (sur Elastic Beanstalk) pour gérer les tâches d'arrière-plan et je l'ai démonifié à l'aide de Supervisor. Le problème est que l'une des tâches de période que j'ai définies échoue (après une semaine où cela a fonctionné correctement), l'erreur que j'ai est la suivante:

[01/Apr/2014 23:04:03] [ERROR] [celery.worker.job:272] Task clean-dead-sessions[1bfb5a0a-7914-4623-8b5b-35fc68443d2e] raised unexpected: WorkerLostError('Worker exited prematurely: signal 9 (SIGKILL).',)
Traceback (most recent call last):
  File "/opt/python/run/venv/lib/python2.7/site-packages/billiard/pool.py", line 1168, in mark_as_worker_lost
    human_status(exitcode)),
WorkerLostError: Worker exited prematurely: signal 9 (SIGKILL).

tous les processus gérés par le superviseur fonctionnent correctement (supervisorctl status dit RUNNNING).

J'ai essayé de lire plusieurs journaux sur mon instance ec2 mais personne ne semble m'aider à trouver la cause du SIGKILL. Que devrais-je faire? Comment puis-je enquêter?

Ce sont mes paramètres de céleri:

CELERY_TIMEZONE = 'UTC'
CELERY_TASK_SERIALIZER = 'json'
CELERY_ACCEPT_CONTENT = ['json']
BROKER_URL = os.environ['RABBITMQ_URL']
CELERY_IGNORE_RESULT = True
CELERY_DISABLE_RATE_LIMITS = False
CELERYD_Hijack_ROOT_LOGGER = False

Et voici mon supervisord.conf:

[program:celery_worker]
environment=$env_variables
directory=/opt/python/current/app
command=/opt/python/run/venv/bin/celery worker -A com.cygora -l info --pidfile=/opt/python/run/celery_worker.pid
startsecs=10
stopwaitsecs=60
stopasgroup=true
killasgroup=true
autostart=true
autorestart=true
stdout_logfile=/opt/python/log/celery_worker.stdout.log
stdout_logfile_maxbytes=5MB
stdout_logfile_backups=10
stderr_logfile=/opt/python/log/celery_worker.stderr.log
stderr_logfile_maxbytes=5MB
stderr_logfile_backups=10
numprocs=1

[program:celery_beat]
environment=$env_variables
directory=/opt/python/current/app
command=/opt/python/run/venv/bin/celery beat -A com.cygora -l info --pidfile=/opt/python/run/celery_beat.pid --schedule=/opt/python/run/celery_beat_schedule
startsecs=10
stopwaitsecs=300
stopasgroup=true
killasgroup=true
autostart=false
autorestart=true
stdout_logfile=/opt/python/log/celery_beat.stdout.log
stdout_logfile_maxbytes=5MB
stdout_logfile_backups=10
stderr_logfile=/opt/python/log/celery_beat.stderr.log
stderr_logfile_maxbytes=5MB
stderr_logfile_backups=10
numprocs=1

modifier: après avoir redémarré le céleri, le problème persiste: (

modifier 2: killasgroup = true en killasgroup = false et le problème persiste

33
daveoncode

Le SIGKILL que votre travailleur a reçu a été lancé par un autre processus. Votre configuration de supervord semble correcte, et le killasgroup n'affecterait qu'un kill initié par un superviseur (par exemple, le ctl ou un plugin) - et sans ce paramètre, il aurait de toute façon envoyé le signal au répartiteur, pas à l'enfant.

Vous avez probablement une fuite de mémoire et le tueur à gages du système d'exploitation assassine votre processus pour mauvais comportement.

grep oom /var/log/messages. Si vous voyez des messages, c'est votre problème.

Si vous ne trouvez rien, essayez d'exécuter le processus périodique manuellement dans un shell:

MyPeriodicTask().run()

Et voyez ce qui se passe. Je surveillerais les métriques du système et des processus depuis le haut dans un autre terminal, si vous n'avez pas une bonne instrumentation comme les cactus, les ganglions, etc. pour cet hôte.

42
Nino Walker