版权声明:本文为博主原创文章,转载请说明出处。 https://blog.csdn.net/weixin_43549578/article/details/86544141 </div>
<link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-f57960eb32.css">
<link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-f57960eb32.css">
<div class="htmledit_views" id="content_views">
<p>线上项目报错,根据设置的报错发送邮件发时,通过查看邮件发现线上redis发生了异常:</p>
Can't save in background: fork: Out of memory
根据分析发现:
redis在fork的时候,当这个进程的内存空间以G为单位时,fork就成为一件很恐怖的操作。何况在16G内存的主机上fork 14G内存的进程呢?肯定会报内存无法分配的。更可气的是,越是改动频繁的主机上fork也越频繁,fork操作本身的代价恐怕也不会比假死好多少。
根据原因,我们可以有如下解决方案:
在redis配置中:stop-writes-on-bgsave-error yes
stop-writes-on-bgsave-error yes:在RDB snapshots持久化过程中出现问题,设置该参数后,Redis是不允许用户进行任何更新操作。
不彻底的解决方案:stop-writes-on-bgsave-error false
这种方式:当redis写硬盘快照出错时,可以让用户继续做更新操作,但是写硬盘仍然是失败的。
彻底解决方案:
编辑文件 /etc/sysctl.conf 添加:
vm.overcommit_memory=1
执行sysctl -p使其生效;
Overcommit:Linux对大部分申请内存的请求都回复"yes",以便能跑更多更大的程序。因为申请内存后,并不会马上使用内存,将这些不会使用的空闲内存分配给其它程序使用,以提高内存利用率。
具体可以查看:点击
版权声明:本文为博主原创文章,转载请说明出处。 https://blog.csdn.net/weixin_43549578/article/details/86544141 </div>
<link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-f57960eb32.css">
<link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-f57960eb32.css">
<div class="htmledit_views" id="content_views">
<p>线上项目报错,根据设置的报错发送邮件发时,通过查看邮件发现线上redis发生了异常:</p>