Celery 导致 Redis 服务器内存不断增长问题的排查

celery占用大内存问题记录 celery worker占用大内存记录 定位 原因 celery worker占用大内存记录 定位 命令参考 top命令下,M键开启按MEM列排序的进程列表,按H则查看线程列表,由于worker没有子线程,所以只显示一条记录; 按c命令,开始COMMAND列详细情况,可以找到对应的进程启动者; 按o键,开启筛选功能,输入COMMAND=celery只显示celery... 阅读详情

最近上线了一个Django + Celery的项目,使用Redis做broker,但发现Redis所在的服务器内存使用量会缓慢增长,大概2个星期左右内存耗尽,Redis进程挂掉,所有的Worker也都停止工作。
我的服务器内存是8GB,正常情况 Redis 服务器的内存只使用1GB左右。
查了下内存监控,历史数据如下:
服务器内存使用
最一开始怀疑是 Django settings 中的 DEBUG 设置成了 True 导致的内存泄漏,因为 Celery Worker 启动时候会提示:

UserWarning: Using settings.DEBUG leads to a memory leak, never use this setting in production environments!

但查了一遍后发现并不是。

后来发现是因为我的定时任务设置的是每秒执行一次, Celery Worker消费任务的速度赶不上 Beat 产生任务的速度,导致了任务积压

以下是发现事件真相的详细过程:

登录 Redis:

127.0.0.1:6379> KEYS * 
1) "_kombu.binding.celery"
2) "unacked_index"
3) "_kombu.binding.celery.pidbox"
4) "unacked"
5) "unacked_mutex"
6) "celery"
7) "_kombu.binding.celeryev"

127.0.0.1:6379> TYPE celery
list
# 查看 “celery” 长度
127.0.0.1:6379> LLEN celery
(integer) 2017633

在 Redis 中,“celery” 这个key记录的是由任务队列中还未被消费的任务,居然有200多万!

顺便查了下 “celery” 里面存了些什么:

127.0.0.1:6379> LRANGE celery 0 0 
"{\"body\": \"W1sxMDcwXSwge30sIHsiY2FsbGJhY2tzIjogbnVsbCwgImVycmJhY2tzIjogbnVsbCwgImNoYWluIjogbnVsbCwgImNob3JkIjogbnVsbH1d\", \"content-encoding\": \"utf-8\", \"content-type\": \"application/json\", \"headers\": {\"lang\": \"py\", \"task\": \"screen.tasks.flush_cluster_status\", \"id\": \"0c5b8e80-9d8d-4a27-aa2c-98c20a43dbbf\", \"shadow\": null, \"eta\": null, \"expires\": null, \"group\": null, \"retries\": 0, \"timelimit\": [null, null], \"root_id\": \"2b52932d-2ad6-4c30-bd0d-61dcb1066a45\", \"parent_id\": \"2b52932d-2ad6-4c30-bd0d-61dcb1066a45\", \"argsrepr\": \"(1070,)\", \"kwargsrepr\": \"{}\", \"origin\": \"gen15149@HC-24-93-72.h.chinabank.com.cn\"}, \"properties\": {\"correlation_id\": \"0c5b8e80-9d8d-4a27-aa2c-98c20a43dbbf\", \"reply_to\": \"8d7eb4dc-bcdc-3442-be4d-03a32f078c36\", \"delivery_mode\": 2, \"delivery_info\": {\"exchange\": \"\", \"routing_key\": \"celery\"}, \"priority\": 0, \"body_encoding\": \"base64\", \"delivery_tag\": \"3407cf25-862a-45cc-8898-679b0197b09b\"}}"
# 进入 Python
In [1]: import json

In [2]: s = "{\"body\": \"W1sxMDcwXSwge30sIHsiY2FsbGJhY2tzIjogbnVsbCwgImVycmJhY2tzIjogbnVsbCwgImNoYWluIjogbnVsbCwgImNob3JkIjogbnVsbH1d\", \"content-encoding\": \"utf-8\", \"content-type\": \"application/json\", \"headers\": {\"lang\": \"py\", \"task\": \"screen.tas
   ...: ks.flush_cluster_status\", \"id\": \"0c5b8e80-9d8d-4a27-aa2c-98c20a43dbbf\", \"shadow\": null, \"eta\": null, \"expires\": null, \"group\": null, \"retries\": 0, \"timelimit\": [null, null], \"root_id\": \"2b52932d-2ad6-4c30-bd0d-61dcb1066a45\", \"parent_id
   ...: \": \"2b52932d-2ad6-4c30-bd0d-61dcb1066a45\", \"argsrepr\": \"(1070,)\", \"kwargsrepr\": \"{}\", \"origin\": \"gen15149@HC-24-93-72.h.chinabank.com.cn\"}, \"properties\": {\"correlation_id\": \"0c5b8e80-9d8d-4a27-aa2c-98c20a43dbbf\", \"reply_to\": \"8d7eb4d
   ...: c-bcdc-3442-be4d-03a32f078c36\", \"delivery_mode\": 2, \"delivery_info\": {\"exchange\": \"\", \"routing_key\": \"celery\"}, \"priority\": 0, \"body_encoding\": \"base64\", \"delivery_tag\": \"3407cf25-862a-45cc-8898-679b0197b09b\"}}"

In [3]: json.loads(s)
Out[3]:
{'body': 'W1sxMDcwXSwge30sIHsiY2FsbGJhY2tzIjogbnVsbCwgImVycmJhY2tzIjogbnVsbCwgImNoYWluIjogbnVsbCwgImNob3JkIjogbnVsbH1d',
 'content-encoding': 'utf-8',
 'content-type': 'application/json',
 'headers': {'lang': 'py',
  'task': 'screen.tasks.flush_cluster_status',
  'id': '0c5b8e80-9d8d-4a27-aa2c-98c20a43dbbf',
  'shadow': None,
  'eta': None,
  'expires': None,
  'group': None,
  'retries': 0,
  'timelimit': [None, None],
  'root_id': '2b52932d-2ad6-4c30-bd0d-61dcb1066a45',
  'parent_id': '2b52932d-2ad6-4c30-bd0d-61dcb1066a45',
  'argsrepr': '(1070,)',
  'kwargsrepr': '{}',
  'origin': 'gen15149@HC-24-93-72.h.chinabank.com.cn'},
 'properties': {'correlation_id': '0c5b8e80-9d8d-4a27-aa2c-98c20a43dbbf',
  'reply_to': '8d7eb4dc-bcdc-3442-be4d-03a32f078c36',
  'delivery_mode': 2,
  'delivery_info': {'exchange': '', 'routing_key': 'celery'},
  'priority': 0,
  'body_encoding': 'base64',
  'delivery_tag': '3407cf25-862a-45cc-8898-679b0197b09b'}}

可以看出,这里面的每一条是一个任务的id、函数名、参数等详细信息。

因为我的程序逻辑是每秒刷新一次缓存,所以过期的任务就不再有意义,所以我简单粗暴地使用 DEL celery把 “celery”的值清空,然后把程序里面周期任务的间隔改成了1.2 秒一次,重启了 Celery Beat进程,一切就正常了。

由此我总结了以下几点:

  1. 周期性任务的时间间隔要综合考虑时效性和Worker消费任务的速度,不能单方面为了提高时效性而改小时间间隔
  2. 项目上线后要关注 Redis 中 “celery” 值的长度,一旦发现这个长度在增加就说明 Worker 的消费能力不足,需要增加 Worker 或增大周期任务的周期
  3. 在周期任务需要考虑时效性的情况下,我们要通过缩小时间间隔尽量压榨服务器集群的资源,此时周期任务的时间间隔有一个“最小安全值”(我自己起的名字 ? ),这个值需要通过衡量 Worker 的消费能力来确定,比如上面说的1.2秒,如果小于这个值就会出现“压爆内存的最后0.1秒”的情况。另外,如果一台Worker所在的服务器挂掉导致消费能力不足就需要考虑任务积压的问题了。
  4. 可以通过设置 Redis 将内存中的数据持久化到磁盘来避免内存爆掉的情况,但这只是一个安全策略,并没有从根本上解决问题,实际上在正常的情况下 Celery 是不需要占用很多 Redis 空间的
Python异步任务队列实战:Celery与Redis的黄金组合配置指南 在分布式系统架构中,异步任务队列是解耦耗时操作、提升系统响应能力的关键技术。其核心原理是通过消息代理将任务生产者与消费者分离,实现任务的异步执行与调度。这一架构为系统带来了可扩展性、可靠性和资源利用率提升等显著技术价值,广泛应用于邮件发送、文件处理、数据清洗等后台作业场景。在Python生态中,Celery作为分布式任务队列的事实标准,配合高性能键值数据库Redis作为消息代理和结果后端,构成了处理异步任务和定时任务的黄金组合。本文聚焦于Celery与Redis的实战配置,涵盖从环境搭建、任务定义到生产环境 阅读详情

相关推荐

Python异步任务队列:Celery与Flower监控的入门与实践指南

在Web开发与分布式系统中,异步任务处理是提升应用性能和响应能力的关键技术。其核心原理是将耗时操作从主请求流程中解耦,通过消息队列进行任务调度,由后台Worker进程异步执行,从而避免阻塞并提高系统吞吐量。这项技术的核心价值在于优化资源利用、改善用户体验,并支撑高并发场景。典型的应用场景包括用户注册后的邮件发送、报表生成、图像处理及数据清洗等后台作业。本文聚焦于Python生态中广泛使用的Celery分布式任务队列及其配套的Flower监控工具,通过一个模拟发送欢迎邮件的完整示例,详细演示了从环境搭建、任务

weixin_30338497的博客 416

celery占用大内存-内存泄漏

问题发现 本来top命令查看服务器实时内存情况, 突然发现32G内存 celery 占用到12%, 内存占用都快4G了. top命令下,M键开启按MEM列排序的进程列表,按H则查看线程列表,由于worker没有子线程,所以只显示一条记录; 按c命令,开始COMMAND列详细情况,可以找到对应的进程启动者; 按o键,开启筛选功能,输入COMMAND=celery只显示celery名的进...

Ch3nnn的博客 4401

Python分布式任务队列Celery与Flower监控实战指南

在Web开发与后端工程中,异步编程是提升系统响应能力和吞吐量的核心技术。其核心原理是将耗时操作从主请求流程中解耦,通过消息队列实现任务的异步调度与执行,从而避免阻塞、优化资源利用。这一技术价值在于构建高并发、可扩展的分布式系统,广泛应用于数据处理、邮件发送、报表生成等场景。Celery作为Python生态中最成熟的分布式任务队列框架,结合Redis或RabbitMQ等消息中间件,提供了强大的异步任务处理能力。而Flower作为其官方监控工具,为任务执行状态、Worker节点健康度及队列情况提供了可视化仪表盘

weixin_30279671的博客 388

Celery在Django下使用的内存泄漏问题

在django下使用celery作为异步任务系统,十分方便。 同时celery也提供定时任务机制,celery beat。使用celery beat 可以为我们提供 cron,schedule 形式的定时任务。 在django下使用celery beat的过程中,发现了 celery beat进程 占用内存非常大,而且一直不释放。 怀疑其有内存占用不释放的可能。 因为之前使用dja

Mind In Chaos 4万+

分布式任务监控体系构建:从核心维度到Celery+Prometheus实战

在微服务与分布式架构中,任务的可观测性是保障系统稳定性的基石。其核心原理在于对任务生命周期进行多维度数据采集与关联分析,涵盖状态、性能、链路与资源监控。这一技术体系的价值在于,它能将原本黑盒的异步执行过程透明化,实现快速故障定位与性能瓶颈发现,从而提升系统的可维护性与韧性。典型的应用场景包括电商订单处理、报表生成、数据同步等需要异步、可靠执行的业务链路。本文以广泛使用的Celery任务队列和Prometheus监控系统为例,深入探讨如何实现全链路可观测性,其中**链路监控**通过TraceID串联子任务,而

weixin_30832405的博客 370

西安电子科技大学841学长经验分享(总成绩第三名)

西安电子科技大学841学长经验分享(总成绩第三名)

qq_30953547的博客 1082

Celery内存泄露问题分析

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

大明的博客 1万+

python特征选择pso_【来点干货】机器学习中常用的特征选择方法及非常详细的Python实例...

花费了很长时间整理编辑,转载请联系作者授权,违者必究。特征选择(Feature selection)是在构建预测模型的过程中减少输入变量的一个过程。它是机器学习中非常重要的一步并在很大程度上可以提高模型预测精度。这里我总结了一些机器学习中常见的比较有用的特征选择方法并附上相关python实现code。希望可以给大家一些启发。首先,我们为什么要进行特征选择呢?它有以下几个优点:减少过拟合:冗余数据常...

weixin_39927158的博客 1161

基于Celery与Redis的后台任务流系统设计与实践

后台任务(Background Tasks)与任务流(Task Flow)是现代分布式系统中的核心概念,用于处理异步、耗时的操作,确保主业务流程的响应速度与可靠性。其原理是通过消息队列(如Redis)解耦任务生产者与消费者,由独立的工作进程异步执行任务,并通过工作流引擎编排具有依赖关系的任务序列。该技术能显著提升系统吞吐量、实现业务逻辑的可靠执行与追溯,是构建高可用应用架构的关键。在物联网数据采集、电商订单处理、报表生成等场景中尤为关键。本文以生态养殖管理系统的“智能活动账本”为例,深入探讨了使用Celer

weixin_33726313的博客 481

RT-2(robotics-transformer2)论文--阅读笔记

谷歌RT-2机器人论文的阅读笔记。

weixin_61255639的博客 1828

Mongodb操作与Java(四)MongoTemplate的使用

MongoTemplate的使用

A乐神的博客 3437

【python】【celery】

Celery 是一个强大的异步任务队列框架,常与 Django 结合使用,用于处理耗时任务、定时任务及分布式任务,提升系统响应速度与扩展性。

shengnan970116的博客 241

贴片二极管SOD封装详解:SOD-123/323/523尺寸焊盘设计要点

表面贴装技术中,二极管封装尺寸直接决定PCB布局与焊接可靠性。SOD封装作为小外形二极管的主流形态,其SOD-123、SOD-323、SOD-523三种规格分别对应不同的功耗与占板面积权衡。理解封装尺寸、焊盘设计计算逻辑和钢网开窗原理,是避免立碑、虚焊等工艺缺陷的关键。在可穿戴设备、电源保护等空间受限场景中,合理选择封装不仅能优化散热路径,还能提升量产良率。本文从焊盘计算、工艺要点到选型策略,全面解析SOD封装的工程实践。

weixin_42520780的博客 302

Celery 5.6(Recovery)升级指南:新特性、关键修复与迁移实战

Celery 5.6.0(代号 *Recovery*)是 Celery 5.x 系列的一个重要功能版本,也是**最后一个支持 Python 3.9 的版本**。它重点修复了长年存在的稳定性问题与内存泄漏,引入了 ETA 任务内存上限、自动建队列类型选择、Redis 后端凭据提供方等新配置项。本文以 [docs/history/whatsnew-5.6.rst](https://link.gitco

gitblog_00659的博客 1073

以LAN8720A为例的以太网硬件设计方案

输入时钟(XTAL1/CLKIN,XTAL2):推荐外加25MHz(性价比较高)晶振为PHY芯片提供时钟,PHY芯片内部PLL将其倍频为50MHz来使用,亦可使用直接使用50MHz晶振。三位MODE通过高低电平组合分别对应以上8种模式 ,包含10M半双工,10M全双工,100M半双工,100M全双工,是否启用自协商协议,CRS是否有效等。VDDCR:1.2V电源,可由芯片内部稳压电源提供,亦可由外部电源提供,由外部电源提供可降低芯片功耗。REF_CLK:参考时钟,由MAC或外部时钟晶振向PHY芯片提供。

weixin_46154042的博客 5884

lammps模拟石墨烯吸附水分子(gcmc)

本文分享lammps gcmc吸附的一个案例代码,上下壁面的通道材料为石墨烯,吸附的分子为tip4p水分子。大家好,我是小马老师。

lammps_jiayou的博客 2590

NewsBlur 慢加载时间排查指南:从 `feed_loadtimes_1min` 指标到 MongoDB/Redis 根因定位

当 NewsBlur 站点没有宕机、但用户感知页面加载变慢时,运维人员需要一套快速、可执行的定位方法。本文以 [SLOW_LOAD_TIMES.md](https://link.gitcode.com/i/7a120f126b56e69cfc74d2a22f6b06bc) 为骨架,结合 NewsBlur 仓库中 `apps/statistics/rstats.py`、`apps/reader/vi

gitblog_00952的博客 215

C#联合Halcon机器视觉框架源码

本软件参考EV开发,共用模块,基于WPF+Halcon,是非常不错的学习框架,需要什么功能可以自己添加,插件式开发非常方便。

Z's Palace 4827

Celery异步任务队列与Flower监控实战:从原理到Python分布式系统搭建

在分布式系统与高并发Web开发中,异步任务处理是提升应用响应能力和系统可扩展性的核心技术。其核心原理是将耗时操作从主请求流程中解耦,通过消息队列实现生产者和消费者的分离,从而避免阻塞、提高吞吐量。这一技术价值在于能够构建松耦合、高可用的服务架构,广泛应用于后台作业处理、定时任务、数据处理等场景。具体到Python生态,Celery作为成熟的分布式任务队列框架,结合Redis或RabbitMQ等消息代理,提供了强大的异步执行能力。而为了有效监控和管理这些后台任务,Flower作为Celery的实时监控工具,提

weixin_34212762的博客 379

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Ubuntu VPS上用Celery+RabbitMQ搭建生产级任务队列

任务队列是Web应用解耦耗时操作、提升响应性能的基础架构模式。其核心原理在于将同步阻塞的业务逻辑(如图片处理、邮件发送)异步化,通过消息中间件实现可靠传递与延迟执行。Celery作为Python生态最成熟的分布式任务调度框架,配合RabbitMQ这一AMQP协议标杆实现,可提供消息持久化、手动ACK、死信队列等关键能力,显著增强系统可靠性与可观测性。相比Redis方案,RabbitMQ在VPS资源受限场景下更适配强一致性需求;而Ubuntu原生apt部署方式则规避了Docker权限、网络与运维黑盒问题,契合

weixin_30263073的博客 445

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Celery 配 RabbitMQ 实战:构建可靠异步任务队列与生产部署

消息队列与异步任务是构建高并发、高可靠后端系统的关键基础设施。消息队列通过中间件解耦服务,实现削峰填谷;异步任务则能避免耗操作阻塞 HTTP 请求,提升系统响应速度。Python 生态中,Celery 是最常用的分布式任务队列框架,而 RabbitMQ 作为经典 AMQP 消息中间件,承担着消息的可靠传递与路由分发职责,二者结合能稳定覆盖延迟执行、定时调度、失败重试、多队列隔离等真实生产场景。文章从环境搭建讲起,逐步解析任务函数幂等写法、多队列路由配置、重试与超时控制、Celery Beat 定时任务、结果

weixin_34288121的博客 217

Python任务队列终极对决:rq vs Celery 性能测试与选型指南

在Python异步任务处理领域,rq和Celery是两个最受欢迎的任务队列框架。本文将通过深度对比分析,帮助您在这两个优秀的Python任务队列解决方案中做出最佳选择。 ## 框架概述与定位差异 **RQ(Redis Queue)** 是一个轻量级的Python任务队列库,基于Redis实现,设计理念是简单易用、低门槛入门。它专门为那些需要快速集成后台任务处理但又不想引入复杂架构的项目而生。

gitblog_00616的博客 940

服务器性能排查与优化:告别‘土豆服务器’的完整指南

服务器性能优化是运维和开发者常面对的基础课题。当系统出现卡顿、超时或连接失败时,通常源于CPU、内存、磁盘IO、网络链路或连接数等资源瓶颈,而量化性能基线是定位问题的第一步。通过掌握top、iostat、ss等常用工具,可以系统化诊断异常,避免盲目重启或升级配置。这在Web服务、游戏服务器、批量任务等场景中尤为重要,例如SSH连接失败或数据库无法访问均可按统一流程排查。本文从‘土豆服务器’的调侃出发,梳理了从建立性能基线到优化部署的完整路径,提供可直接落地的命令清单与最佳实践,帮助读者快速提升服务器稳定性。

weixin_33922672的博客 465

Dify部署在云服务器上的性能调优策略

本文基于企业级部署案例,系统性介绍Dify在云服务器上的性能优化策略,涵盖Gunicorn配置、Celery异步任务控制、数据库连接池管理、Redis缓存设计及向量数据库调优,显著提升响应速度与系统稳定性。

weixin_35006125的博客 581

如何快速上手FerrumPix:Windows、Linux、macOS三大平台安装与入门教程

FerrumPix 是一款免费开源的桌面**照片管理与图片编辑工具**,横跨 Windows、Linux 与 macOS 三大平台。它把"整理照片 + 无损编辑 + 像素级修图 + RAW 冲洗"合并在一个原生应用里完成,全程在本机运行,不依赖任何云端生态。本文带你从下载安装到上手三大核心界面(图库、查看器、编辑器),20 分钟即可完成第一次完整工作流。 [![FerrumPix照片管理软件图库

gitblog_00696的博客 93
上一篇: Django 的 ForeignKey 与数据库的 FOREIGN KEY约束
下一篇: 使用 curl 发送需要登录的 HTTP POST 请求
唯美落叶
博客等级 码龄15年 2粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值