【问题标题】:Unable to save in background (redis-server)无法在后台保存(redis-server)
【发布时间】:2017-02-28 07:27:50
【问题描述】:

我有两台 redis 服务器在同一台机器上运行。第二个的日志文件有几个实例,其中包含如下通知:

[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

相比之下,第一个日志文件仅包含成功的数据库保存。如果我内存不足,我认为两者都会有相似的日志。令我困惑的是,只有一个有这个问题,另一个没有。有线索吗?

此外,研究将我带到this blog post,它认为如果我在命令行上执行sysctl vm.overcommit_memory=1,这个问题可以得到改善。没有解释这有什么帮助。有人可以在redis的上下文中解释这里发生了什么吗?

【问题讨论】:

标签: redis


【解决方案1】:

根据Redis FAQs

即使我有很多可用 RAM,在 Linux 下后台保存也会失败并出现 fork() 错误!

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

现在是长篇:

Redis 后台保存模式依赖于写时复制语义 现代操作系统中的fork:Redis fork(创建一个子 过程)这是父级的精确副本。子进程转储 磁盘上的数据库并最终退出。理论上孩子应该使用 很多内存,因为父母是副本,但实际上要感谢 大多数现代操作系统实现的写时复制语义 父进程和子进程将共享公共内存页。一种 只有在子页面或 父母。因为理论上所有的页面都可能会改变,而孩子 进程正在保存,Linux 无法提前知道该进程有多少内存 孩子会接受,所以如果overcommit_memory 设置为零 除非有足够多的空闲 RAM,否则 fork 将失败 复制所有的父内存页,结果是如果你 有一个 3 GB 的 Redis 数据集和只有 2 GB 的可用内存 失败。将overcommit_memory 设置为 1 表示 Linux 放松并执行 以更乐观的分配方式进行分叉,这确实是 你对 Redis 的要求。

了解 Linux 虚拟内存如何工作以及其他方面的一个很好的来源 overcommit_memoryovercommit_ratio 的替代品是这个 来自 Red Hat 杂志的经典著作“理解虚拟内存”。谨防, 本文有overcommit_memory 的 1 和 2 个配置值 颠倒:参考proc(5)手册页的正确含义 可用的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-28
    • 1970-01-01
    • 2014-08-04
    • 2017-11-02
    • 1970-01-01
    • 2012-07-26
    • 2022-07-27
    • 2014-02-20
    相关资源
    最近更新 更多