使用django-crontab解决Celery Worker Gevent模式占用内存高的问题

1. 介绍

django-crontab是django连接linux中crontab定时任务

  • 可以直接在django中编写crontab表达式,然后启动django时直接将任务部署到系统中
2. 需求来源

我是因为celery启动时选择了协程gevent启动,而celery在选择这种方式启动时,自带的两个以运行时间/占用内存为指标然后重启的参数不支持,因此随着时间celeryworker占用内存会越来越多,浪费服务器资源。
因此只能自己想办法重启,且要能在系统层面重启。当然,直接在后台添加crontab任务是可以的,但是作为一个成熟Django应用程序的话,最好是能够自动完成这些部署,省去每次发布都要手动添加这些任务,而且也方便docker容器化部署。

3. 使用
3.1 配置setting.py文件
#`INSTALLED_APPS`中添加`django_crontab`;
INSTALLED_APPS += ['django_crontab']
# 配置django-crontab jobs
CRONJOBS = [
    #第一个参数是crontab时间格式
    #第二个参数是被执行任务的路径
    ('00 2 * * *', 'schedule.tasks.restart_celery_worker')
]
3.2 书写任务

根据上面的路径,或者说写好函数再改上面的路径

# _*_ coding: utf-8 _*_
import os

def restart_celery_worker():
    # Linux, Darwin
    # 执行命令位置在项目的根目录
    os.chdir('/app/TesterUnchained')
    # 找到celery的环境变量位置,否则会报错
    os.system('/usr/local/bin/celery multi restart 2 --pool=gevent -c:1-2 100 -A config.celery_app -l info')
3.3 书写启动脚本start.sh

执行命令:bash start.sh
也可以单独执行每个命令

#!/usr/bin/env bash
# delete celery pid file
rm celerybeat.pid celery2.pid celery1.pid
# start celery worker
celery multi start 2 -c:1-2 100 -A config.celery_app --pool=gevent -l info
# start celery beat
nohup python3 manage.py celery beat -l info > ./TesterUnchained/logs/beat.log 2>&1 &
# crontab add
python3 manage.py crontab add
env >> /etc/default/locale
/etc/init.d/cron restart
# start app
uwsgi --ini ./config/uwsgi.ini
3.4 修改uwsgi.ini`,以gevent方式启动app

一旦服务器安装了gevent,就不得不以gevent方式启动app了,否则会报错。
也不得不以gevent方式启动celery。

# 添加参数
gevent=1000
gevent-early-monkey-patch=true       ;
3.5 服务器安装crontab
  • apt-get update && apt-get upgrade -y && apt-get install cron
4 完成

至此就可以完美解决celery,gevent模式内存高的问题。
celery启动的两个worker将会在每天凌晨两点重启,释放内存。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容