redis数据库问题整理

一、数据无法持久化
1、背景介绍:
经开发人员告知redis有3万多条数据无法写入内存,数据持久化停滞状态。
2、排查过程:
经过排查redis日志,发现报错信息如下,经过查询得知为此报错为7月10日导入大量数据后导致的,判断为内存突增导致写入失败。
redis数据库持久化问题处理_第1张图片
3、解决办法:
从系统层面优化Centos系统,添加系统参数vm.overcommit_memory = 1 到/etc/sysctl.conf配置文件中,然后执行sysctl -p命令。

vm.overcommit_memory参数说明:
vm.overcommit_memory = 0   启发策略
比较 此次请求分配的虚拟内存大小和系统当前空闲的物理内存加上swap,决定是否放行。系统在为应用进程分配虚拟地址空间时,会判断当前申请的虚拟地址空间大小是否超过剩余内存大小,如果超过,则虚拟地址空间分配失败。因此,也就是如果进程本身占用的虚拟地址空间比较大或者剩余内存比较小时,fork、malloc等调用可能会失败。
 vm.overcommit_memory = 1 允许overcommit
直接放行,系统在为应用进程分配虚拟地址空间时,完全不进行限制,这种情况下,避免了fork可能产生的失败,但由于malloc是先分配虚拟地址空间,而后通过异常陷入内核分配真正的物理内存,在内存不足的情况下,这相当于完全屏蔽了应用进程对系统内存状态的感知,即malloc总是能成功,一旦内存不足,会引起系统OOM杀进程,应用程序对于这种后果是无法预测的。