博客
关于我
Redis从库不能同步报Can’t save in background: fork: Cannot allocate memory错误
阅读量:794 次
发布时间:2023-02-28

本文共 675 字,大约阅读时间需要 2 分钟。

在进行Redis主从同步时,最近遇到了一个棘手的问题。几天前一切运行正常,但随着网络环境的升级,测试人员反馈新增数据无法读取。经过一番排查,终于找到了问题的根源。

最初怀疑可能与网络升级导致主从同步端口未开发,但经过核实,这并非根本原因。随后,尝试重启Redis服务器后发现,同步在短期内恢复,但随着时间推移问题又次出现。进一步查看Redis日志,发现频繁出现Can't save in background: fork: Cannot allocate memory错误。这一错误提示系统在尝试进行背景保存时,因无法分配内存而失败。

深入分析源码(src/rdb.c),定位到rdbSaveBackground函数。在该函数中,Redis通过fork创建子进程来执行背景保存。然而,由于内存分配过于保守,导致在fork操作时无法分配所需的内存,从而引发问题。

了解到Redis的数据回写机制分为同步和异步两种模式。同步回写通过SAVE命令直接进行磁盘写入,适用于小规模数据;而异步回写则采用BGSAVE命令,通过fork创建子进程进行数据复制和保存。尽管BGSAVE避免了主进程的阻塞,但fork操作本身存在诸多问题,尤其是在内存容量较大的环境中。

经过多番调试,决定通过调整系统内核参数来解决内存分配问题。修改vm.overcommit_memory参数为1,允许系统预先分配内存。这一更改需要编辑sysctl.conf文件并重启系统。

通过上述方法,问题得以有效解决。值得注意的是,在实际操作中应谨慎调整内核参数,并根据具体环境进行测试和验证。

转载地址:http://uutfk.baihongyu.com/

你可能感兴趣的文章
Photoshop脚本入门
查看>>
PHP
查看>>
Regular Expression Notes
查看>>
PHP $FILES error码对应错误信息
查看>>
PHP $_FILES函数详解
查看>>
PHP $_SERVER['HTTP_REFERER'] 获取前一页面的 URL 地址
查看>>
php & 和 & (主要是url 问题)
查看>>
php -- 魔术方法 之 判断属性是否存在或为空:__isset()
查看>>
php -- 魔术方法 之 获取属性:__get()
查看>>
php -树-二叉树的实现
查看>>
PHP -算法-二路归并
查看>>
php 2条不一样 的json数据 怎么放在一个json里面_如果你是PHP开发者,请务必了解一下Composer...
查看>>
php 360 不记住密码,JavaScript_多种方法实现360浏览器下禁止自动填写用户名密码,目前开发一个项目遇到一个很 - phpStudy...
查看>>
regExp的match、exec、test区别
查看>>
php 404 自定义,APACHE 自定义404错误页面设置方法
查看>>
PHP 5.3.0以上推荐使用mysqlnd驱动
查看>>
php aes sha1解密,PHP AES加密/解密
查看>>
php CI框架单个file表单多文件上传例子
查看>>
php composer
查看>>
reflow和repaint引发的性能问题
查看>>