2014-04-20 44 views
1

随着我不断写入数据到redis,写时复制使用的内存不断增加。即使我编写我的程序进行足够长的睡眠时间,以便redis能够完成所有后台保存(最后一条记录消息是写入时复制使用的0 MB内存),但下一个后台保存将返回到高位数。什么是写时复制内存

实施例,

的由牛

的存储器1400MB由牛使用用于存储器1300MB

的存储器0MB使用牛

的存储器1500MB由牛使用

所有这些意味着什么?据我所知,如果写入时复制内存不断增加,那么就没有足够的内存。另外,除了每个背景都使用高内存外,redis似乎不起作用。 Jedis总是遇到套接字超时异常。

+0

您是否检出[this](http://blog.sensible.io/2013/08/20/setting-up-redis-for-production-environment.html)博客?你是否设置了'vm.overcommit_memory = 1'? –

+0

是的,我确实设置了overcommit = 1,appendonly是的,appendfsync否 – twb

+0

有趣,但不能帮助我害怕。你也可以在[redis google group](https://groups.google.com/forum/?fromgroups#!forum/redis-db)上询问,这有助于技术方面的改进。新用户需要一到两天的等待时间/批准方案。如果你在你的问题中提供redis版本和os规格,它会有所帮助。 –

回答

0

从Redis的常见问题解答:

Redis的背景节能模式依赖于写入时复制语义在现代操作系统的叉:Redis的叉子(创建一个子进程),它的精确副本父母。子进程将磁盘上的数据库转储并最终退出。从理论上讲,孩子应该尽可能多地使用父母作为副本的内存,但实际上要感谢大多数现代操作系统实现的写入时复制语义,父进程和子进程将共享公用内存页面。只有当它在孩子或父母中发生变化时,页面才会被复制。因为从理论上讲,当子进程正在保存时,所有的页面都可能会改变。

保存过程中增加的内存使用量取决于由于写入时复制(COW)机制而进行转储时执行的写入次数。

你可以做的是,配置一个Redis slave并将持久性任务委托给它。