异步任务报错-Celery: WorkerLostError: Worker exited prematurely: signal 9 (SIGKILL)

异步任务报错-Celery: WorkerLostError: Worker exited prematurely: signal 9 (SIGKILL

发现问题

使用celery异步任务时,异步任务开始但是未执行结束,查看日志报错:

报错信息

分析原因

查找资料,有说是因为redis版本或者celery版本问题的,但是没有按照这个思路走下去,不能验证是否为这个原因,最后发现可能为内存问题, 因为之前mysql无法启动就是内存的问题,我使用的是运行内存为1G的服务器,运行django项目开了2个进程,安装有nginx redis celery supervisor进程管理工具,日常内存使用情况如下图
内存使用情况

查找原因

stackoverflow 找到一篇博客说是内存问题,然后顺着思路找下去

解决办法

查看系统的内存日志文件发现这个
日志在这个文件 /var/log/messages
首先说一下这个文件的存在,在Ubuntu系统中,这个文件你访问可能提示找不到这个文件
关于ubuntu 日志文件查看的地址可以参考这个链接
在这里插入图片描述
然后查看了 oom 这个问题
可以看到, 这里会有oom和oom-killer的具体时间。 经我对比发现, 上述时间, 与系统发生异常报警的时间一致。 所以, 系统发生异常确实是由oom引起的。

oom就是out of memory, 意思就是内存用完了(内存泄漏可能导致这种现象)。 在linux中, 如果linux机器的内存用完了, 会怎样呢? 很显然, 系统肯定无法正常工作。 linux当然要考虑这种问题, linux会杀死占用内存很大的进程(这些进程后续可能被重新拉取), 从而释放出一些内存, 来保证整个系统的的正常运行, 这就是linux oom-killer的机制。
在oom期间, 系统经常会遇到一些莫名其妙的异常, 这是能理解的, 因为内存吃紧啊。 过一会儿, 经历oom-killer后, 系统又暂时恢复正常了, 待到下次内存泄漏积累到一定阶段, 再次出现oom时, 系统又异常。 这种现象是很常见的, 如果不了解oom和oom-killer, 则不太容易查到问题的原因
参考链接

这样大致就找到问题的原因所在了,具体的解决办法可以根据原因解决了:
查看是否为代码问题,出现内存泄漏
或者是更换更加大内存的服务器
根据自身原因寻找解决办法

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
我想将frontend 也是用volumes,将其映射到/app/frontend目录,在/app/frontend下install以及build,如何实现 docker-compose.yml文件: version: '3' services: frontend: build: context: ./frontend dockerfile: Dockerfile ports: - 8010:80 restart: always backend: build: context: ./backend dockerfile: Dockerfile volumes: - /app/backend:/app environment: - CELERY_BROKER_URL=redis://redis:6379/0 command: python manage.py runserver 0.0.0.0:8000 ports: - 8011:8000 restart: always celery-worker: build: context: ./backend dockerfile: Dockerfile volumes: - /app/backend:/app environment: - CELERY_BROKER_URL=redis://redis:6379/0 command: celery -A server worker -l info --pool=solo --concurrency=1 depends_on: - redis - backend restart: always celery-beat: build: context: ./backend dockerfile: Dockerfile volumes: - /app/backend:/app environment: - CELERY_BROKER_URL=redis://redis:6379/0 command: celery -A server beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler depends_on: - redis - backend restart: always redis: image: redis:latest ports: - 6379:6379 restart: always mysql: image: mysql:latest environment: - MYSQL_ROOT_PASSWORD=sacfxSql258147@ ports: - 8016:3306 volumes: - ./mysql:/var/lib/mysql restart: always frontend:dockerfile文件 FROM node:16.18.1 WORKDIR /app/frontend COPY package*.json ./ RUN npm install COPY . . RUN npm run build:prod FROM nginx:latest COPY --from=0 /app/frontend/dist/ /usr/share/nginx/html EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]
最新发布
07-14
要将前端的代码映射到容器内的`/app/frontend`目录,并在容器内进行安装和构建,可以通过在`docker-compose.yml`文件中为`frontend`服务添加一个卷来实现。更新后的`docker-compose.yml`文件如下所示: ```yaml version: '3' services: frontend: build: context: ./frontend dockerfile: Dockerfile ports: - 8010:80 volumes: - ./frontend:/app/frontend restart: always backend: build: context: ./backend dockerfile: Dockerfile volumes: - /app/backend:/app environment: - CELERY_BROKER_URL=redis://redis:6379/0 command: python manage.py runserver 0.0.0.0:8000 ports: - 8011:8000 restart: always celery-worker: build: context: ./backend dockerfile: Dockerfile volumes: - /app/backend:/app environment: - CELERY_BROKER_URL=redis://redis:6379/0 command: celery -A server worker -l info --pool=solo --concurrency=1 depends_on: - redis - backend restart: always celery-beat: build: context: ./backend dockerfile: Dockerfile volumes: - /app/backend:/app environment: - CELERY_BROKER_URL=redis://redis:6379/0 command: celery -A server beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler depends_on: - redis - backend restart: always redis: image: redis:latest ports: - 6379:6379 restart: always mysql: image: mysql:latest environment: - MYSQL_ROOT_PASSWORD=sacfxSql258147@ ports: - 8016:3306 volumes: - ./mysql:/var/lib/mysql restart: always ``` 这样,将会把本地的`./frontend`目录映射到容器内的`/app/frontend`目录。然后,在容器内部构建过程中,使用`/app/frontend`目录中的代码进行安装和构建。 请注意,这里假设`docker-compose.yml`文件和`frontend`目录在同一级目录下。如果不是,请相应调整`volumes`中的路径。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值