sysctl vm.overcommit_memory=1 INFO persistence CONFIG GET save
定时快照报 Can't save in background: fork: Cannot allocate memory,备份链路直接断掉。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。
追下去是这么回事:fork 需要和主进程等量的虚拟内存,overcommit 策略偏严或者容器内存上限贴着实际用量时,内核会拒绝这次 fork,命令直接返回失败。
这次卡住的地方就在「Redis bgsave fork 失败」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。
把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。改完隔一天再看一次,当场正常不代表能稳住。
测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。
处理上按这个顺序:确认 vm.overcommit_memory 是否设成 1;容器内存上限留到实例用量的一点五倍以上再跑;先拿从库或 AOF 顶上 别让备份窗口空着。
确认没问题再收工,手动 BGSAVE 返回 started,持久化状态位回到 ok。
