线上看 Redis 内存时,经常会遇到一个让人不安的问题:used_memory 已经降了,但进程 RSS 还高高挂着。这不是监控坏了,而是内存分配层的正常代价。

Redis 申请内存要经过分配器,小对象会进入 size class,对齐和复用都会产生碎片。数据删除后,内存也不一定立刻还给操作系统。

先把机制边界说清楚

这一篇讨论 Redis 进程内存和操作系统内存之间的差距,不把所有内存上涨都归因于碎片。先分清数据增长、复制缓冲、客户端输出缓冲和 allocator 碎片。

整体路径

used_memory 与 RSS 的三层账

上面这张图先把主线铺开:业务数据、分配器对齐、操作系统页不是同一件事。所以看 Redis 内存不能只盯 used_memory,RSS 和碎片率才是操作系统视角的真实账本。

底层机制

  • used_memory 主要反映 Redis 分配出去的对象和缓冲区。
  • RSS 是操作系统视角下进程占用的物理页,包含分配器(Redis 默认 jemalloc)保留但未归还的内存。
  • 小对象频繁创建删除、value 大小变化、embstr/raw 转换都会影响碎片。碎片来源是 jemalloc 的 size class 对齐 padding 和小对象 slab 分配——即使删除了对象,分配器也往往把内存留在自己的池里以便复用,而不是立刻归还给操作系统。
  • 判断碎片程度的核心指标是 INFO memory 里的 mem_fragmentation_ratio,等于 used_memory_rss / used_memory。经验阈值:大于 1.5 就要关注(碎片接近一半),严重时(如 >2)要干预;小于 1 是另一种异常,通常意味着 overcommit(Swap 使用)或内存超卖,同样需要排查。
  • 主动碎片整理 activedefrag(Redis 4.0+,依赖 jemalloc)能在运行时把碎片整理掉,但会消耗 CPU,不应无脑打开到激进参数。

内存碎片是性能和复用之间的代价。完全追求 RSS 下降,可能换来更多分配开销和延迟抖动。

取舍与边界

内存碎片是性能和复用之间的代价。完全追求 RSS 下降,可能换来更多分配开销和延迟抖动。

典型问题:用机制化例子排查

  • 先看 INFO memory 里的 mem_fragmentation_ratio(关注 >1.5 或 <1 的异常),再结合业务写入删除模式判断。
  • 大规模删除用 UNLINK 或分批处理,避免阻塞和瞬时碎片波动。
  • 容量规划预留碎片空间,不要按 payload 精确贴边部署。
  • 碎片率异常时同时排查大 key、输出缓冲和后台 fork,不要只怪 jemalloc。

收束:一句判断

Redis 内存治理要看两本账:对象账和操作系统账。


关于十三Tech

我是十三,All in AI Agent 方向的架构师,专注 AI 工程实践。

我相信 AI 是程序员的最佳搭档,也希望帮助每一位开发者更好地驾驭 AI。

如果你想继续跟完这套「图解 Redis」,欢迎关注公众号 「十三Tech」。后续会继续按数据结构、底层机制、持久化、高可用和实战排查这条线更新。

十三Tech公众号二维码