Sellerie: WorkerLostError: Arbeiter vorzeitig verlassen: Signal 9 (SIGKILL)
Ich verwende Sellerie mit RabbitMQ in meinem Django-app (Elastic Beanstalk) zum verwalten von hintergrund-tasks und ich daemonisierte es mit Vorgesetzten.
Das problem jetzt ist, dass der Zeitraum Aufgabe, die ich definiert, ist nicht (nach einer Woche, in der es funktioniert), der Fehler, die ich habe ist:
[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).
alle Prozesse verwaltet von Oberaufsicht und läuft einwandfrei (supervisorctl status
sagt RUNNNING).
Habe ich versucht zu Lesen, mehrere Protokolle auf meiner ec2-Instanz, aber niemand scheint mir helfen, herauszufinden, was die Ursache des SIGKILL. Was soll ich tun? Wie kann ich untersuchen?
Diese sind meine Sellerie-Einstellungen:
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
Einen das ist mein 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
edit: nach einem Neustart Sellerie schlagen, das problem bleibt 🙁
edit 2: geändert killasgroup=true killasgroup=false und das problem bleibt
InformationsquelleAutor der Frage daveoncode | 2014-04-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dem SIGKILL Ihre Arbeiter erhalten wurde initiiert von einem anderen Prozess verwendet. Ihre supervisord config sieht gut aus, und die killasgroup würde nur auf einem Vorgesetzten initiiert töten (z.B. ctl oder ein plugin) - und ohne das wäre es geschickt haben, das signal an den dispatcher, wie auch immer, nicht das Kind.
Wahrscheinlich haben Sie ein memory-leak und dem Betriebssystem oomkiller ist die Ermordung Ihres Prozesses für schlechtes Verhalten.
grep oom /var/log/messages
. Wenn Sie die Nachrichten sehen, dann ist das dein problem.Wenn Sie etwas nicht finden, versuchen Sie, die periodische Prozess manuell in einer shell:
MyPeriodicTask().run()
Und sehen, was passiert. Ich würde-monitor-system-und Prozess-Metriken, die von oben in einem anderen terminal, wenn Sie nicht haben eine gute Instrumentierung wie Kaktus, Ganglien, etc.) für diesen host.
InformationsquelleAutor der Antwort Nino Walker