今天服务器提示不可用,查了了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)
所以不建议使用第二个方法
Can't save in background: fork: Cannot allocate memory
时间: 2024-11-08 17:09:19