Redis从节点内存碎片需逐节点单独配置activedefrag相关参数,否则因CONFIG SET不持久、不跨节点,导致碎片率持续高于2.0;必须在redis.conf中显式设置activedefrag yes、active-defrag-ignore-bytes 100mb、active-defrag-threshold-lower 12、active-defrag-cycle-min 100(及max 500),并确保mem_allocator为jemalloc。
Redis 从节点的内存碎片不会自动继承主节点配置,必须单独配、逐节点生效;否则即使主节点碎片率已下降,从节点仍可能持续膨胀到 mem_fragmentation_ratio > 2.0。
Redis Cluster 或哨兵模式下,CONFIG SET 命令只作用于当前连接的节点,且不持久化。运维常只在主节点上执行 CONFIG SET activedefrag yes,但从节点配置仍为默认值——active-defrag-threshold-lower 是 10(即 10%),active-defrag-cycle-min 仅 5,实际几乎不触发整理。
activedefrag 更难抢到空闲时间片INFO memory 中的 active_defrag_running 在从节点长期为 0,但 mem_fragmentation_ratio 持续缓慢爬升不能只开 activedefrag yes,否则等于没开。以下参数需同时写入每个从节点的 redis.conf 并重启(或 CONFIG REWRITE + CONFIG SET 双保险):
activedefrag yes:总开关,必须设为 yes(不是 on 或 1)active-defrag-ignore-bytes 100mb:避免小碎片反复触发整理;低于该值直接跳过active-defrag-threshold-lower 12:注意单位是「占 used_memory_rss 的百分比 ×10」,填 12 表示 ≥12% 才启动(比默认 10 更敏感)active-defrag-cycle-min 100 和 active-defrag-cycle-max 500:提高单次整理时长上限,弥补从节点 CPU 空闲时间少的问题别只看 CONFIG GET activedefrag 返回 yes 就以为好了。真正要看的是运行时状态:
redis-cli -h <em>slave-ip</em> -p <em>port</em> INFO memory | grep -E "(mem_fragmentation_ratio|active_defrag)"
active_defrag_running:1 偶尔出现(不是一直为 1,而是间歇性为 1)active_defrag_hits 是否随时间缓慢增长;若 10 分钟内无变化,说明仍未触发used_memory_rss 和 used_memory 差值:若差值从 3GB 缓慢降到 2.2GB,说明整理生效MEMORY PURGE 无效从节点即使配对了所有 activedefrag 参数,也可能毫无反应——最常被忽略的前提是:
redis-cli INFO memory | grep mem_allocator 必须返回 jemalloc;若为 libc,activedefrag 完全不工作(MEMORY PURGE 也无效)libc,需重编译 Redis 并指定 --with-jemalloc
MEMORY PURGE 命令只对 jemalloc 生效,且仅释放「脏页」,无法合并已分配页内的空隙;它不能替代 activedefrag,只是辅助手段redis.conf 中全部 active-defrag-* 行,就会成为“碎片黑洞”真正起效的点不在参数多华丽,而在每个从节点的 redis.conf 里是否完整、显式、持久地写了那四行 active-defrag-* 配置——少一行,就可能让碎片率卡死在 1.8 不动。