Redis内存碎片率通过INFO memory中的mem_fragmentation_ratio(used_memory_rss/used_memory)反映,>1.5需关注,长期≥2.0且used_memory稳定时可能存在外部碎片;可用redis-cli INFO memory | grep mem_fragmentation_ratio快速查看,并结合MEMORY PURGE(6.0+)、重启或调优jemalloc参数缓解。

如何查看 Redis 当前内存碎片率
Redis 自身不直接暴露“分配器碎片”,但通过 INFO memory 中的 mem_fragmentation_ratio 可间接反映:它是 used_memory_rss / used_memory 的比值。当该值 > 1.5,大概率说明 jemalloc(或系统 malloc)在堆上产生了显著外部碎片,或存在大量未归还的内存页。
注意:mem_fragmentation_ratio 高 ≠ 一定可优化——比如进程刚启动后 RSS 偏高是正常现象;但若长期稳定在 2.0+,且 used_memory 没明显增长,就该怀疑是分配器无法有效合并空闲页导致的“假性内存压力”。
- 用
redis-cli INFO memory | grep mem_fragmentation_ratio快速检查 - 搭配
top -p $(pgrep redis-server) -o %mem看 RSS 是否持续高于预期 - 确认 Redis 是否启用了
activedefrag yes(4.0+ 默认关闭)
jemalloc 在 Redis 中的默认行为与关键调优参数
Redis 编译时若链接了 jemalloc(推荐且默认),它会接管所有 malloc/free 调用。jemalloc 本身不主动“压缩”已分配的 arena,但可通过运行时配置影响其碎片倾向:
-
arena.<n>.dirty_decay_ms</n>和arena.<n>.muzzy_decay_ms</n>控制脏/模糊内存延迟释放,默认值(10s / 0s)可能导致内存迟迟不归还给 OS - 设置
export MALLOC_CONF="dirty_decay_ms:1000,muzzy_decay_ms:1000"再启动 Redis,能加快小块空闲内存回收 - 避免使用
lg_chunk:21(2MB chunk)等过大配置——它会加剧小 key 场景下的内部碎片 - 不要手动替换为 glibc malloc:它在高并发小对象场景下碎片更严重,且无 decay 机制
启用 active defrag 并理解它的实际作用边界
active-defrag-cycle-min 和 active-defrag-cycle-max 控制后台线程扫描键空间、尝试合并相邻空闲内存块的强度,但它只对“内部碎片”(如 ziplist 编码的 list 被频繁修改后留下的空洞)有效,对 jemalloc 的 arena 外部碎片无直接影响。
换句话说:active defrag 不动 jemalloc 的 page 级管理,它只在 Redis 自己维护的数据结构里做整理。所以即使开了 activedefrag yes,mem_fragmentation_ratio 也可能纹丝不动。
- 建议设为
active-defrag-cycle-min 1+active-defrag-cycle-max 25,平衡 CPU 开销与效果 - 仅对使用 ziplist/lazyfree 的场景有可见收益;对纯 hashtable 或 string 类型几乎无效
- 触发条件需满足:当前内存碎片率 >
active-defrag-threshold-lower(默认 100,即 1.0)且内存使用率 >active-defrag-ignore-bytes(默认 100mb)
真正降低 RSS 的可行操作与常见误判
如果 mem_fragmentation_ratio 长期偏高,优先排查是否因业务模式导致 jemalloc 无法复用内存,而不是迷信“一键 defrag”。真实有效的手段有限且需谨慎:
- 重启实例是最彻底的方式——但需配合集群 failover 或 proxy 流量切换,不能直接 kill
- 执行
MEMORY PURGE(6.0+,仅对 jemalloc 有效):强制调用mallctl("arena.<n>.purge", ...)</n>,让各 arena 主动释放脏页;需先用INFO memory确认 arena 数量 - 避免长期运行超大 hash/set:它们容易造成 jemalloc arena 分配不均;考虑拆分为多个 key 或启用
hash-max-ziplist-entries - 警惕 client output buffer 积压:
client-output-buffer-limit设置过松会导致 RSS 暴涨,且这部分内存不会计入used_memory,但会拉高mem_fragmentation_ratio
碎片问题没有银弹。jemalloc 的设计目标是吞吐与响应,不是零碎片;追求极致低 ratio 往往意味着牺牲并发性能或增加延迟毛刺。观察 72 小时趋势比单次快照更有意义,尤其注意凌晨定时任务或批量导入后的 spike 是否回落。


















