首页/数据/Redis 进阶速查/MEMORY PURGE:请求分配器归还
内存与管理99 条

MEMORY PURGE:请求分配器归还

MEMORY PURGE 要求分配器将未使用的内存页归还操作系统,是缓解 rss 高企的即时手段之一,但可能带来短暂阻塞。

Redis 进阶速查数据更新于 2026-10-13

MEMORY PURGE 是什么

MEMORY PURGE 要求底层内存分配器把已经空闲、但尚未归还操作系统的内存页交还内核,是压低进程 rss 的即时手段,Redis 4.0 起提供。它不改动任何数据,归还的只是分配器手里的空闲页;实际的清理动作由分配器完成,使用 jemalloc 构建时效果最明显。

基本信息

命令MEMORY PURGE
起始版本Redis 4.0
依赖分配器能力(默认构建使用 jemalloc)
返回OK
代价短暂阻塞与 CPU 抖动
副作用不改变键空间,不改变 used_memory 口径的数据量

典型使用场景

  • rss 明显高于 used_memory、碎片率高,希望在不动数据的前提下回收内存
  • 容器内存接近 limit,需要临时腾出空间换取调度余量
  • 大批量删除之后 rss 迟迟不回落,想确认是分配器未归还还是别的原因
  • 低峰维护窗口做 rss 收敛,降低被 OOM Killer 选中的概率
  • 换机迁移前压降内存占用,缩短导出等待时间

执行与效果核对

执行与效果核对
redis-cli INFO memory | grep -E 'used_memory_human|used_memory_rss_human|mem_fragmentation_ratio'  # 执行前采样
redis-cli MEMORY PURGE                     # 尝试归还空闲页
sleep 5                                    # 留出分配器整理的时间
redis-cli INFO memory | grep -E 'used_memory_human|used_memory_rss_human|mem_fragmentation_ratio'  # 执行后对比
redis-cli INFO memory | grep mem_allocator # 先确认分配器是不是 jemalloc

效果怎么看

指标含义期望变化
used_memory_rss_human进程实际占用的物理内存执行后应明显下降
mem_fragmentation_ratiorss 与 used_memory 的比值从高位向 1.x 靠拢即算见效
mem_allocator当前分配器名称非 jemalloc 时 PURGE 基本没有实际效果
used_memory_humanRedis 视角的数据占用不应变化,变了说明另有进程或另有原因
PURGE 只归还分配器里已经空闲的页,不会释放仍在使用的数据。因此它解决的是「碎片与未归还」,不是「数据太多」。
执行时会有短暂停顿和 CPU 抖动,高峰或大实例上慎用;如果 rss 很快又回到高位,说明问题在分配模式(大量小对象反复分配)而不是未归还。

执行前后的检查清单

  • 确认构建使用 jemalloc,其他分配器上执行收益很小
  • 确认当前不在压测或业务高峰窗口,避免抖动叠加
  • 先记录 rss 与碎片率基线,否则事后无法判断是否见效
  • 执行后间隔几十秒再采样,给分配器留出整理时间
  • 若 rss 很快回弹,转向键设计、编码与淘汰策略排查

易错点

  • 在高负载或延迟敏感时段执行,造成额外抖动,收益远小于代价
  • 误以为 PURGE 能释放所有碎片,实际效果完全取决于分配器当前状态
  • 使用 libc malloc 构建时执行只会返回 OK,没有实际效果却以为已经修好
  • 把 PURGE 当容量方案定期跑,掩盖了键膨胀或 value 膨胀的真实根因

数据来源与参考

  • Redis 官方文档:MEMORY PURGE 说明
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌