2017-02-28 64 views
4

我有两台运行在同一台机器上的redis服务器。第二个的日志文件与通知几个实例,如这些:无法在后台保存(redis-server)

[50818] 19 Feb 06:41:05.007 * 10 changes in 300 seconds. Saving... 
[50818] 19 Feb 06:41:05.007 # Can't save in background: fork: Cannot allocate memory 

相比之下,第一个日志文件仅包含成功DB扑救。如果我内存不足,我认为两者都会有类似的日志。它让我困惑,只有一个人有这个问题,另一个没有。任何线索?

此外,研究导致我到this blog post,它争辩说,如果我在命令行上执行sysctl vm.overcommit_memory=1,问题可以改善。没有解释如何帮助。有人可以在redis的背景下解释这里发生了什么吗?

+4

可能重复[redis bgsave失败,因为fork无法分配内存](http://stackoverflow.com/questions/11752544/redis-bgsave-failed-because-fork-cannot-allocate-memory) – kennytm

回答

14

Redis FAQs

背景节约用叉子失败()Linux下的错误,即使我有很多的空闲内存!

简短的回答:echo 1 > /proc/sys/vm/overcommit_memory :)

现在长一个:

Redis的背景节能模式依赖于写入时复制语义在现代操作系统 叉:Redis的叉子(创建一个孩子 进程),这是父母的确切副本。子进程在磁盘上转储数据库 并最终退出。从理论上讲,孩子应该使用大量内存作为副本,但实际上要感谢大多数现代操作系统 实现的写入时复制语义,父进程和子进程将共享公用内存页面。一个 页面仅在其子代或 父级中发生更改时才会被复制。由于理论上所有页面可能会改变,而子进程正在保存,Linux无法预先告知子进程需要多少内存,所以如果overcommit_memory设置为零, fork将会失败,除非有这么多根据需要释放内存以真正地 复制所有父内存页面,结果如果您的 具有3 GB的Redis数据集并且只有2 GB的空闲内存,则会导致 失败。将overcommit_memory设置为1表示Linux将以更乐观的分配方式放松并执行 分叉,而这的确是 Redis所需的。

的良好来源,了解Linux虚拟内存的工作和其他 替代品overcommit_memoryovercommit_ratio是如何从红帽杂志这个 经典,“了解虚拟内存”。当心, 这篇文章有1和2配置值为overcommit_memory 颠倒过来:请参阅proc(5)手册页的正确含义为 的可用值。