Django celery WorkerLostError: Worker exited prematurely: signal 9 (SIGKILL) error

Django celery WorkerLostError: Worker exited prematurely: signal 9 (SIGKILL) error

将 celery 作为生产 virtualenv 中的守护进程的最佳实践是什么?我在本地环境中使用以下内容,效果完美,接收任务按预期工作。但是在生产中总是停留在

WorkerLostError: Worker exited prematurely: signal 9 (SIGKILL) error

我在本地和生产中使用以下配置:

/etc/default/celeryd:

CELERY_BIN="path/to/celery/bin"
CELERY_APP="myproj"
CELERYD_CHDIR="home/myuser/project/myproj"
CELERYD_OPTS="--time-limit=300 --concurrency=4"
CELERYD_LOG_FILE="/var/log/celery/%n%I.log"
CELERYD_PID_FILE="/var/run/celery/%n.pid"
CELERYD_USER="myuser"
CELERYD_GROUP="myuser"
CELERY_CREATE_DIRS=1

/etc/init.d/celeryd:[celeryd]

包 & OS 版本信息:

  1. Ubuntu == 16.04.2
  2. 芹菜 == 4.1.0
  3. rabbitmq == 3.5.7
  4. django == 2.0.1

我在将 celery 作为守护程序 运行 时也使用了这些命令:

  1. sudo chown -R root:root /var/log/celery/
  2. sudo chown -R root:root /var/run/celery/
  3. sudo update-rc.d celeryd 默认值
  4. sudo 更新-rc.d celeryd 启用
  5. sudo /etc/init.d/celeryd 开始

这是我的 django settings.py 芹菜配置:

CELERY_BROKER_URL = 'amqp://localhost'
CELERY_ACCEPT_CONTENT = ['json']
CELERY_RESULT_BACKEND = 'db+sqlite:///results.sqlite'
CELERY_TASK_SERIALIZER = 'json'

需要专家建议才能使 celery 守护进程在生产 virtualenv 中正常工作。提前致谢!

除非您为 rabbitmq 创建了单独的虚拟主机和用户,否则请将 CELERY_BROKER_URL 设置为 amqp://guest@localhost//

此外,您应该将 /var/log/celery//var/run/celery/ 的所有者设置为 "myuser",而不是 root,就像您在 celeryd 配置中设置的那样

由于

中出现内存不足错误,我收到了这个错误

/var/log/kern.log

我的一项任务中使用了 Tensorflow 运行,这需要额外的计算能力,但我的物理内存 (RAM) 不足以处理那么大的负载。我很奇怪除了 SigKill 9 错误之外没有登录 celery。但是内核日志帮助我修复了它。

我想这可能是 OOM 的症状。我在 Docker 容器中部署 Celery 后端 - "it worked on my machine" 但不在集群中。我为任务分配了更多的 ram,并且不再有问题。