码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-06-17 17:28:17      阅读:884      评论:0      收藏:0      [点我收藏+]

标签:redis

今天服务器提示不可用,查了了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)


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

本文出自 “深呼吸再出击” 博客,请务必保留此出处http://ckl893.blog.51cto.com/8827818/1790322

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

标签:redis

原文地址:http://ckl893.blog.51cto.com/8827818/1790322

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!