在ELK日志系统中,用redis作为日志的缓存。但今天发现,redis数据不变,而且从redis读数据的logstash报错:
Redis "MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk"
查看redis的日志,报下面的错:
Can’t save in background: fork: Cannot allocate memory
原因:
redis异步回写即BGSAVE命令实现数据的持久化。主进程fork后,复制自身并通过这个新的进程回写磁盘,回写结束后新进程自行关闭。
在小内存的进程上做一个fork,不需要太多资源,但当这个进程的内存空间以G为单位时,fork就成为一件很恐怖的操作。何况在16G内存的主机上fork 14G内存的进程呢?肯定会报内存无法分配的。更可气的是,越是改动频繁的主机上fork也越频繁,fork操作本身的代价恐怕也不会比假死好多少。
解决方法:
1、立即生效:
sysctl vm.overcommit_memory=1
2、持久生效:
修改/etc/sysctl.cnf:
vm.overcommit_memory=1
解释:
vm.overcommit_memory = 1,直接放行
vm.overcommit_memory = 0:则比较 此次请求分配的虚拟内存大小和系统当前空闲的物理内存加上swap,决定是否放行。
vm.overcommit_memory = 2:则会比较 进程所有已分配的虚拟内存加上此次请求分配的虚拟内存和系统当前的空闲物理内存加上swap,决定是否放行。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/9736.html