Django芹菜WorkerLostError:工人过早退出:信号9(SIGKILL)错误

时间:2018-05-23 09:38:07

标签: django celery virtualenv production-environment

在生产virtualenv中将芹菜作为守护进程运行的最佳做法是什么?我在本地环境中使用以下内容,它完美地工作并且接收任务按预期工作。但在生产中始终坚持

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

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

的/ etc /默认/ 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: [not for negotiating a change of password]

套餐&操作系统版本信息:

  1. Ubuntu == 16.04.2
  2. 芹菜== 4.1.0
  3. rabbitmq == 3.5.7
  4. django == 2.0.1
  5. 我也使用这些命令,同时让芹菜作为守护进程运行:

    1. sudo chown -R root:root / var / log / celery /
    2. sudo chown -R root:root / var / run / celery /
    3. sudo update-rc.d celeryd defaults
    4. sudo update-rc.d celeryd enable
    5. sudo /etc/init.d/celeryd start
    6. 以下是我对芹菜的django settings.py 配置:

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

      需要专家建议让芹菜守护进程在生产virtualenv中正常工作。提前谢谢!

3 个答案:

答案 0 :(得分:0)

除非你创建了一个单独的vhost&用户为rabbitmq,将CELERY_BROKER_URL设置为amqp://guest@localhost//

此外,您应该将/var/log/celery//var/run/celery/的所有者设置为“myuser”,而不是root用户,因为您已经在celeryd配置中设置了

答案 1 :(得分:0)

由于

中捕获的内存不足错误导致此错误
  

/var/log/kern.log

我在一个我的任务中运行Tensorflow,这需要额外的计算能力,但我的物理内存(RAM)不足以处理那么多的负载。我很奇怪除了SigKill 9错误之外没有芹菜登录。但内核日志帮助我解决了这个问题。

答案 2 :(得分:0)

我想这可能是OOM的症状。我在Docker容器中部署了Celery后端-“它在我的机器上工作”,但不在集群中。我为任务分配了更多的内存,不再遇到问题。