两天前将引入redis的项目第一次部署到服务器中,今天发现网站页面都是500,服务器中redis是在运行的,看了SLF4J日志发现报了redis有关的错误,发现RDB持久化出现问题。网上查了下发现RDB持久化过程是有两种,同步回写SAVE 和 异步回写BGSAVE,BGSAVE是fork主进程,默认需要当前主线程的内存大小才能成功(比如主线程 1G,则需要向操作系统申请成功1G内存给子进程才可以进行),解决办法是 进入 /etc/sysctl.conf ,添加 vm.overcommit_memory=1,表示允许使用内存直到用光为止。
redis的子进程创建出来时是和父进程共享相同的物理页,父进程如果要进行数据操作,将把对应的数据页创建一个副本进行修改,而子进程在fork过程中共享整个父进程的内存快照。这个就是COW
参考:https://www.freesion.com/article/7439956888/
Redis 持久化内存不足分析 - 简书 (jianshu.com)