web-dev-qa-db-ja.com

Celery:WorkerLostError:ワーカーが途中で終了しました:シグナル9(SIGKILL)

私はバックグラウンドタスクを管理するために、(Elastic Beanstalkの)Djangoアプリ)でRabbitMQを使用してCeleryを使用し、Supervisorを使用してデーモン化しました。 (正常に機能する1週間後)、私が持っているエラーは次のとおりです。

[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

編集:セロリビートを再起動した後、問題は残ります:(

編集2:killasgroup = trueをkillasgroup = falseに変更しましたが、問題は残ります

33
daveoncode

ワーカーが受け取ったSIGKILLは、別のプロセスによって開始されました。スーパーバイザーの設定は問題なく、killasgroupはスーパーバイザーが開始したキル(例:ctlまたはプラグイン)にのみ影響します。その設定がなければ、子ではなくディスパッチャにシグナルを送信します。

ほとんどの場合、メモリリークが発生しており、OSのoomkillerは、悪い動作のためにプロセスを暗殺しています。

_grep oom /var/log/messages_。メッセージが表示される場合、それが問題です。

何も見つからない場合は、シェルで定期的なプロセスを手動で実行してみてください。

MyPeriodicTask().run()

そして何が起こるかを見てください。このホスト用のサボテン、神経節などの優れた計測器がない場合は、システムとプロセスのメトリックを別の端末で上から監視します。

42
Nino Walker