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 到 max | CPU 周期占比区间 | 越高整理越快、抖动风险越大 |
整理是把双刃剑:CPU 空闲时收益明显,业务高峰开启可能把碎片问题换成延迟问题,低峰试运行更稳妥。
整理解决的是空间利用率,不解决产生碎片的原因;分配模式与大键设计不改的话,碎片会重新累积。
判断整理是否有效要看碎片率曲线与 active_defrag 统计,单看某一时刻的比值容易得出错误结论。