Подтвердить что ты не робот

Сельдерей: WorkerLostError: Работник вышел преждевременно: сигнал 9 (SIGKILL)

Я использую Celery с RabbitMQ в своем приложении Django (на Elastic Beanstalk) для управления фоновыми задачами, и я его демоннизировал с помощью Supervisor. Проблема в том, что одна из заданий периода, которые я определил, терпит неудачу (после недели, в которой она работала должным образом), у меня была ошибка:

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

все процессы, управляемые супервизором, работают правильно (supervisorctl status говорит RUNNNING).

Я попытался прочитать несколько журналов на моем экземпляре ec2, но никто не помогает мне узнать, в чем причина SIGKILL. Что мне делать? Как я могу исследовать?

Это мои настройки сельдерея:

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

Это мой файл 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: после перезапуска урожая сельдерея проблема остается: (

изменить 2: изменить killasgroup = true для killasgroup = false и проблема остается

4b9b3361

Ответ 1

SIGKILL, полученный вашим работником, был инициирован другим процессом. Конфигурация supervisord выглядит нормально, и killasgroup будет влиять только на инициированный супервизором kill (например, ctl или плагин) - и без этой настройки он все равно отправил сигнал диспетчеру, а не дочернему.

Скорее всего, у вас есть утечка памяти, а ОС oomkiller убивает ваш процесс для плохого поведения.

grep oom /var/log/messages. Если вы видите сообщения, это ваша проблема.

Если вы ничего не нашли, попробуйте запустить периодический процесс вручную в оболочке:

MyPeriodicTask().run()

И посмотрим, что произойдет. Я бы следил за метками системы и процессов сверху в другом терминале, если у вас нет хорошего инструментария, такого как кактус, ганглии и т.д. Для этого хоста.