Py学习  »  Redis

Can't save in background: fork: Cannot allocate memory

Py站长 • 6 年前 • 1653 次点击  

今天服务器提示不可用,查了了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, 表示内核允许分配超过所有物理内存和交换空间总和的内存

https://stackoverflow.com/questions/11752544/redis-bgsave-failed-because-fork-cannot-allocate-memory

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/2755
 
1653 次点击