celery占用大内存-内存泄漏

问题发现

本来top命令查看服务器实时内存情况,  突然发现32G内存 celery 占用到12%,  内存占用都快4G了.

  1. top命令下,M键开启按MEM列排序的进程列表,按H则查看线程列表,由于worker没有子线程,所以只显示一条记录;
  2. c命令,开始COMMAND列详细情况,可以找到对应的进程启动者;
  3. o键,开启筛选功能,输入COMMAND=celery只显示celery名的进程列表;

原因

默认情况下,celery的worker是工作进程可以被新任务替换之前执行的最大任务数, 默认值是没有限制

官网说明

"""
celery配置
"""

from celery.schedules import crontab

# 中间人
BROKER_URL = 'redis://:[email protected]/x'

worker_prefetch_multiplier = 4  # celery worker并发数
worker_max_tasks_per_child = 2  # 每个worker最大执行任务数


# 指定时区,不指定默认为 'UTC'
CELERY_TIMEZONE = 'Asia/Shanghai'

# 指定导入的任务模块
CELERY_IMPORTS = (
    'celery_app.tasks',
)

需要配置celery设置 但是官网写的参数在执行执行过程中发生错误 "无法将新设置名称与旧设置名称混合使用"

Cannot mix new setting names with old setting names, please
rename the following settings to use the old format:

worker_max_tasks_per_child           -> CELERYD_MAX_TASKS_PER_CHILD
worker_prefetch_multiplier           -> CELERYD_PREFETCH_MULTIPLIER

需要修改配置名称:

"""
celery配置
"""

from celery.schedules import crontab

# 中间人
BROKER_URL = 'redis://:[email protected]/x'

CELERYD_PREFETCH_MULTIPLIER = 4  # celery worker并发数
CELERYD_MAX_TASKS_PER_CHILD = 2  # 每个worker最大执行任务数

# 指定时区,不指定默认为 'UTC'
CELERY_TIMEZONE = 'Asia/Shanghai'

# 指定导入的任务模块
CELERY_IMPORTS = (
    'celery_app.tasks',
)

重新启动

执行

celery beat -A celery_app -l info --detach

启动celery,通过ps -ef | grep celery可以看到两个celery worker进程(8226,8228)

利用celery worker进行某个任务,当worker没有执行到最大任务时(即销毁重建),每执行一次任务占用内存必然有所增加,任务数为9,10时(celery均匀调度,并发数*最大任务数),分别有原8228 worker被销毁,重新创建9386 worker及原8226 worker被销毁,重新创建9564 worker,此时,运行第9次时,占用总内存有所下降,运行第10次时,总内存回到初如值,同样任务执行第19、20次情况类似。

celery并发计算规则
celery任务并发只与celery配置项CELERYD_CONCURRENCY 有关,与CELERYD_MAX_TASKS_PER_CHILD没有关系,即CELERYD_CONCURRENCY=2,只能并发2个worker,此时任务处理较大的文件时,执行两次可以看到两个task任务并行执行,而执行第三个任务时,开始排队,直到两个worker执行完毕。

结论
celery执行完任务不释放内存与原worker一直没有被销毁有关,因此CELERYD_MAX_TASKS_PER_CHILD可以适当配置小点,而任务并发数与CELERYD_CONCURRENCY配置项有关,每增加一个worker必然增加内存消耗,同时也影响到一个worker何时被销毁,因为celery是均匀调度任务至每个worker,因此也不宜配置过大,适当配置。

发布了160 篇原创文章 · 获赞 21 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/weixin_43064185/article/details/105043314