今天服务器提示不可用,查了了redis日志发现:

cat /data/redis/redis-server.log
[1316] 17 Jun 13:49:28.032 * 1 changes in 900 seconds. Saving...
[1316] 17 Jun 13:49:28.032 # Can't save in background: fork: Cannot allocate memory
[1316] 17 Jun 13:49:34.059 * 1 changes in 900 seconds. Saving...
[1316] 17 Jun 13:49:34.059 # Can't save in background: fork: Cannot allocate memory
[1316] 17 Jun 13:49:40.069 * 1 changes in 900 seconds. Saving...
[1316] 17 Jun 13:49:40.069 # Can't save in background: fork: Cannot allocate memory
[1316] 17 Jun 13:49:46.098 * 1 changes in 900 seconds. Saving...
[1316] 17 Jun 13:49:46.098 # Can't save in background: fork: Cannot allocate memory
[1316] 17 Jun 13:49:52.026 * 1 changes in 900 seconds. Saving...
[1316] 17 Jun 13:49:52.026 # Can't save in background: fork: Cannot allocate memory

因为Redis默认fork出一个进程来进行持久化到磁盘的工作,以防止主进程假死(大数据量时)。但是当主进程占用内存很大时,fork进程就不一定能够成功,所以出现这个错误。


修改方法:

# vim /etc/sysctl.conf 
vm.overcommit_memory = 1
sysctl -p


Linux内核会根据参数vm.overcommit_memory参数的设置决定是否放行。

overcommit_memory文件指定了内核针对内存分配的策略,其值可以是0、1、2。                               
0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。 
1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2, 表示内核允许分配超过所有物理内存和交换空间总和的内存


或者修改配置文件,设置最大使用内存,最大使用内存会导致数据被踢出:

maxmemory 1294967296(byte)


所以不建议使用第二个方法