NestJS运行时Redis内存占用异常增长问题排查求助
Redis内存异常暴涨排查问题
我的应用仅使用Redis缓存少量Key,总数据量不大:
- 未运行应用时,Redis保留旧Key,内存占用仅为可用内存的0.4%
- 应用仅更新现有Key,不会新增Key,Key的总大小始终保持不变
- 但启动应用后,Redis内存开始暴涨,最终导致应用崩溃;应用退出后,内存占用恢复至初始水平
- 已通过DI(依赖注入)为所有模块提供同一个Redis工厂实例
排查思路
- 实时监控Redis核心指标
- 执行
INFO memory命令,重点对比应用启动前后的used_memory、used_memory_rss、mem_fragmentation_ratio数值,确认内存增长的具体类型(是Redis自身数据占用,还是内存碎片、RSS膨胀) - 用
CLIENT LIST查看连接状态,关注每个连接的omem(输出缓冲区占用)、idle(空闲时间)字段,排查是否存在大量活跃连接的缓冲区堆积
- 执行
- 验证Key操作的真实性
- 运行
MONITOR命令实时捕获所有Redis操作,确认是否真的只有更新操作,是否存在隐性的DEL+SET组合操作(这类操作会产生临时内存占用,或导致过期Key的内存碎片) - 用
DEBUG OBJECT [key]查看单个Key的内存占用,对比应用启动前后的数值,确认Key本身的内存是否未发生变化
- 运行
- 排查Redis内存管理配置
- 检查
maxmemory-policy和maxmemory配置,确认是否在应用启动后触发了不合理的内存清理策略,导致内存波动 - 查看是否开启了透明大页(THP),THP会加剧内存碎片问题,建议执行
echo never > /sys/kernel/mm/transparent_hugepage/enabled关闭
- 检查
- 检查客户端与连接池配置
- 确认Redis客户端的连接池参数(如最大连接数、空闲超时),排查是否存在连接泄漏或连接池过载
- 检查客户端是否开启了自动流水线、批量操作,是否存在大量未处理的请求堆积在客户端或Redis的输出缓冲区
- 排查持久化相关影响
- 查看Redis的RDB/AOF持久化触发时机,应用启动时是否刚好触发持久化:fork子进程会通过写时复制占用内存,若此时应用频繁更新Key,会导致大量内存被复制,表现为内存暴涨,直到持久化完成
- 系统层面内存排查
- 用
top、free -h命令查看系统整体内存状态,确认Redis的内存增长是真实数据占用,还是系统缓存、swap导致的统计异常
- 用
内容的提问来源于stack exchange,提问作者Denis Hyrin
相关产品推荐
相关产品推荐

