首页/数据/Redis 进阶速查/activedefrag:在线碎片整理
内存与管理99 条

activedefrag:在线碎片整理

activedefrag yes 让 Redis 在空闲周期自动搬迁内存页降低碎片;开启条件与力度由 thresholds 与 cycle 系列参数控制。

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

activedefrag 在线碎片整理

activedefrag 设为 yes 后,Redis 会在空闲周期主动搬迁内存页,把碎片化的小块拼成连续空间并交还给分配器,从而降低 mem_fragmentation_ratio。它依赖 jemalloc 这类支持该能力的分配器(Linux 上的默认构建即是)。整理力度由启动阈值与 CPU 周期上限控制:数据量太小时不启动,碎片比例超过上限时才允许占用更多 CPU 周期。整理本质是搬运,有明显 CPU 成本。

基本信息

开关activedefrag yes|no
引入版本Redis 4.0 起
分配器要求jemalloc(Linux 默认)
启动门槛active-defrag-ignore-bytes(默认 100mb)
碎片区间active-defrag-threshold-lower 10 / upper 100
CPU 周期范围active-defrag-cycle-min 5 / cycle-max 75
观测碎片率变化与主线程 CPU 占用

典型使用场景

  • 碎片率长期高于经验值,考虑用整理替代重启或迁移
  • 大键反复删除与重建导致碎片累积,作为缓解手段
  • 实例无法重启(数据重、窗口有限)时,寻求在线改善内存利用率
  • 评估整理对延迟的影响,先在低峰试运行再决定是否长期开启
  • 配合扩容决策:整理后腾出的空间能推迟一次扩容
  • 排查开启整理后 CPU 上升与延迟抖动的关系
  • 容器实例内存逼近限额,希望在不扩容的前提下回收一部分空间
  • 升级或迁移后的实例做一次碎片基线对比

开启与观察

开启与观察
redis-cli CONFIG SET activedefrag yes              # 开启在线整理
redis-cli CONFIG GET active-defrag-*               # 查看各项门槛与力度
redis-cli INFO memory | grep -E 'mem_fragmentation_ratio'
redis-cli INFO stats | grep -E 'active_defrag'     # 整理命中情况
redis-cli MEMORY DOCTOR                            # 官方体检建议
redis-cli INFO cpu                                 # 观察主线程 CPU 变化

力度参数对照

参数作用取舍
ignore-bytes低于该数据量不整理太小会无意义搬页
threshold-lower碎片率下限未达阈值不启动
threshold-upper碎片率上限超过则允许更激进
cycle-min 到 maxCPU 周期占比区间越高整理越快、抖动风险越大
整理是把双刃剑:CPU 空闲时收益明显,业务高峰开启可能把碎片问题换成延迟问题,低峰试运行更稳妥。
整理解决的是空间利用率,不解决产生碎片的原因;分配模式与大键设计不改的话,碎片会重新累积。
判断整理是否有效要看碎片率曲线与 active_defrag 统计,单看某一时刻的比值容易得出错误结论。

易错点

  • 碎片未达阈值就开启整理,白耗 CPU 且看不出收益
  • 把整理当长期解法,根因(分配模式、大键反复重建)始终未处理
  • 业务高峰期开启整理,用延迟抖动换来内存回落
  • 只调开关不动力度参数,期望落空后误判功能无效
  • 整理期间没同步监控内存水位,回落与淘汰同时发生导致误判

数据来源与参考

  • Redis 官方文档:主动碎片整理
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌