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_ratio | rss 与 used_memory 的比值 | 从高位向 1.x 靠拢即算见效 |
| mem_allocator | 当前分配器名称 | 非 jemalloc 时 PURGE 基本没有实际效果 |
| used_memory_human | Redis 视角的数据占用 | 不应变化,变了说明另有进程或另有原因 |
PURGE 只归还分配器里已经空闲的页,不会释放仍在使用的数据。因此它解决的是「碎片与未归还」,不是「数据太多」。
执行时会有短暂停顿和 CPU 抖动,高峰或大实例上慎用;如果 rss 很快又回到高位,说明问题在分配模式(大量小对象反复分配)而不是未归还。
执行前后的检查清单
- 确认构建使用 jemalloc,其他分配器上执行收益很小
- 确认当前不在压测或业务高峰窗口,避免抖动叠加
- 先记录 rss 与碎片率基线,否则事后无法判断是否见效
- 执行后间隔几十秒再采样,给分配器留出整理时间
- 若 rss 很快回弹,转向键设计、编码与淘汰策略排查