我在Django应用中(在Elastic Beanstalk上)将Celery与RabbitMQ结合使用来管理后台任务,并使用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
说“正在运行”。
我试图读取我的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,问题仍然存在
您的员工收到的SIGKILL是由另一个过程发起的。您的超级用户配置看起来不错,并且killasgroup仅会影响超级用户启动的终止操作(例如ctl或插件),而没有进行此设置,它将无论如何都不会将信号发送给调度程序,而不是子进程。
[最有可能发生内存泄漏,并且操作系统的oomkiller会因不良行为而暗杀您的进程。
grep oom /var/log/messages
。如果您看到消息,那就是您的问题。
如果找不到任何内容,请尝试在外壳中手动运行定期过程:
MyPeriodicTask().run()
然后看看会发生什么。如果您没有该主机的仙人掌,神经节等良好的仪器,则可以从另一个终端的顶部监视系统和过程指标。
我在执行长任务时遇到错误。任务处理程序引发了错误:WorkerLostError('工人过早退出:信号9(SIGKILL)。')
我在以下工具中使用了-celery == 4.3.0,amqp == 2.5.0,RabbitMQ 3.3.5,作为服务器的AWS EC2实例
我执行了2个长任务。我在两个任务上都遇到了相同的错误。我为EC2实例将服务器类型从中型转换为大型,以解决OOM问题,并且成功完成了两项任务之一。但是由于workerLostError,仍然一项任务没有成功。
还有其他解决方案吗?