Céleri: Travailleurlosterreur: travailleur sorti prématurément: signal 9 (SIGKILL)

J'utilise du céleri avec RabbitMQ dans mon application Django (sur Elastic Beanstalk) pour gérer les tâches de fond et je l'ai démonisé en utilisant le superviseur. Le problème maintenant, c'est que l'une des tâches de période que j'ai défini est l'échec (après une semaine dans laquelle il a fonctionné correctement), l'erreur que j'ai obtenu est:

[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 sont en place et fonctionne correctement (supervisorctl status dit RUNNNING).

j'ai essayé de lire plusieurs journaux sur mon instance ec2 mais personne ne semble m'aider en découvrant Quelle est la cause du SIGKILL. Que dois-je faire? Comment puis-je étudier?

ce sont mes céleri paramètres:

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 ceci est mon superviseur.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

edit: après redémarrage de céleri battre le problème reste le même :(

edit 2: modification de la killasgroup=true pour killasgroup=false et que le problème persiste

25
demandé sur daveoncode 2014-04-02 12:03:03

1 réponses

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

très probablement vous avez une fuite de mémoire et le tueur à gages de L'OS est en train d'assassiner 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 voir ce qui se passe. Je surveillerais les paramètres du système et du processus depuis le haut d'un autre terminal, si vous n'avez pas de bons instruments comme cactus, ganglia, etc. pour cet hôte.

32
répondu Nino Walker 2014-04-03 16:52:49