BigKey导致AOF重写内存翻倍,这个现象很多运维都遇到过,但真正的原因往往被误判。问题不在于BigKey本身占了多少内存,而在于它在重写期间触发的大量COW(写时复制)页复制。当Redis fork子进程执行bgrewriteaof时,如果主线程正在修改一个100MB的hash(比如执行HSET big_hash key value),内核会为这个操作单独复制物理页。哪怕只改了一个字段,也可能拷贝整块4KB甚至更大粒度的内存页。多个BigKey并发更新,used_memory_rss在10秒内跳升80%以上,这并不罕见。

为什么BigKey会让AOF重写内存翻倍
常见的错误现象包括:mem_fragmentation_ratio没有明显变化,但used_memory_rss暴涨;INFO persistence里aof_rewrite_in_progress长期为1;甚至dmesg | tail中间出现Killed process (redis-server)。这些信号组合在一起,基本可以断定是BigKey在作祟。
应对这类问题的实操方案:
- 用
redis-cli --scan --pattern "*"配合MEMORY USAGE逐个排查疑似BigKey,重点关注hash、zset、list这些容易“膨胀”的类型 - 避免在重写启动前后30秒内执行
HSET、LPUSH或DEL等大批量操作,这些操作会迅速塞满aof_rewrite_buf - 对已知BigKey做分片处理,比如把
user:1001:profile拆成user:1001:profile:base和user:1001:profile:ext,这样即使单个key再大,影响范围也有限
jemalloc配置怎么影响AOF重写RSS
Redis默认使用jemalloc管理内存,但它在处理“大块匿名内存”(比如aof_rewrite_buf和COW复制页)时,归还不够激进。当used_memory_peak远高于当前used_memory,且mem_fragmentation_ratio > 1.5时,说明jemalloc缓存了大量未释放页,叠加COW后RSS更容易触顶。
这里有几个调优方向:
- 升级到jemalloc 5.3+,并启用
background_thread:true,让它异步回收脏页 - 启动Redis时加参数
--allocator jemalloc,并配置export MALLOC_CONF="lg_chunk:21,background_thread:true"(21对应2MB chunk,适配多数AOF缓冲区峰值) - 禁用
arena复用:避免aof_rewrite_buf分配和主线程key分配争抢同一arena,加MALLOC_CONF="narenas:1"可临时缓解(仅限单实例场景)
如何用CONFIG SET动态压低重写内存压力
不能等着OOM报警才动手脚。一旦发现redis-cli -i 0.5 --stat中used_memory_rss在重写启动后跳升超过50%,立刻干预:
- 停掉自动触发:
CONFIG SET auto-aof-rewrite-percentage 0,防止新的重写任务堆积 - 调高重写门槛:
CONFIG SET auto-aof-rewrite-min-size 128mb(原来64mb的设置,在10GB+的实例上很容易频繁触发) - 强制刷空缓冲区:
CONFIG SET no-appendfsync-on-rewrite yes——注意这会牺牲最后一次fsync前的数据,但能砍掉重写期间50%以上的IO等待,间接减少子进程阻塞时间 - 确认生效:
INFO persistence里检查aof_pending_rewrite是否为0、aof_rewrite_buffer_length是否不再增长
监控时最容易被忽略的三个指标
只盯used_memory等于没监控。AOF重写期真正致命的是三类内存:COW复制页、aof_rewrite_buf匿名内存、jemalloc元数据。它们全体现在used_memory_rss里,但不会反映在used_memory中。
必须交叉看:
used_memory_rss - used_memory差值超过2GB?说明COW或缓冲区已失控INFO memory中used_memory_peak持续高于当前used_memory?jemalloc没及时归还,需要查mem_allocator和allocator_statsINFO stats里aof_delayed_fsync非零?磁盘IO瓶颈正在拖慢子进程消费aof_rewrite_buf,缓冲区越积越多
BigKey数量和jemalloc行为并不显式暴露在INFO里,只能靠差值和日志联动判断——这一点最容易漏掉。
