INFO memory CONFIG SET repl-backlog-size 64mb CONFIG SET activedefrag yes
dmesg 里出现 Out of memory: Killed process 2187,服务每两天挂一次。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,maxmemory 只管数据集,复制缓冲区、客户端输出缓冲、fork 时的写时复制都不在里面,加上碎片,进程实际占用远高于配置值。
「Redis 内存超限被杀」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。
一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。
别只看报错的最后一行,往上看几行,真正的起因通常在上面。同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。
处理上按这个顺序:对比 used_memory_rss 与 used_memory 的差值;限制输出缓冲区与复制积压的上限 别让它无限涨;给实例留三成余量 或者直接开 activedefrag。
改完只确认一件事:跑满一天后 RSS 稳定在 11G 以下,dmesg 里不再有 OOM 记录。
