Mongo内存爆表被kill

1,033 阅读3分钟

WangScaler: 一个用心创作的作者。

声明:才疏学浅,如有错误,恳请指正。

前言

晚上十点,躺在床上追剧的小王那是相当自在。

滴,微信弹窗:”小王,网页点击没反应了“。

小王内心十万个XX马飞奔而过。

“唉,肯定是内存又爆表了。”

不出所料,内存不足,mongo直接被kill了。

systemctl restart mongod

先恢复服务,明天再排查。加班?去TM见鬼吧,重启完mongo的小王,躺下继续刷剧了。

刺探军情

要想解决问题,首先得知道问题出在哪里,写程序不像玄学,不知所踪。程序就像是因果,有果必有因。内存不足,当然是我服务器配置有局限性,但是资金限制在这没办法,又得节省资金,还能保证程序在一定性能下运行。有得也有失,熊掌和鱼各取一半。

首先排查mongo宕机的原因。tail -n 1000 /var/log/message.log

image.png

确实和我预期的一样,内存不足。再一看mongo占用的内存,好家伙直接吃我接近一半的内存,怪不得不够用。

粮食储备

既然已经刺探到这么重要的军情(mongo占用的内存太高),那势必要解决这一痛处。

首先定位mongo默认内存是多少?

官网显示,默认为(系统最大内存-1G)/2或者256MB,两者选择其中最大的。

image.png 这就印证了我们的预期结果,那么继续看看能不能改这个值,根据我们的配置来配置合适的值。

storage:
   wiredTiger:
      engineConfig:
         maxCacheOverflowFileSizeGB: <number>   

出征

按照上述的配置配置完成,怀着激动的心,重启mongo。

哇哦,虽然之前做了充足的准备还是失败了,配置有问题。原来是没指定引擎。

storage:
   engine: wiredTiger
   wiredTiger:
      engineConfig:
         maxCacheOverflowFileSizeGB: <number>   

成功。

这里需要注意的是,我之前看的好像低版本的mongo这里不能设置小数,好像4版本之上的才行。

可以使用mongo -version查看自己mongo的版本。

战绩

配置成功之后,最重要的就是战绩了,就怕一顿操作猛如虎,一看战绩0-5。

经过两个多月的观察,mongo的内存一直在设置的最高阈值没变过,mongo控制住了,其他服务的内存也是稳定的,那么服务器整体的内存也是相对稳定的,彻底解决了这个隐患。

军事答疑

  • 1、为什么默认的配置还觉得高啊

    因为服务器上配置了有多个服务,都比较占用内存。虽然mongo建议使用专门的服务器来搭建mongo,不要和其他服务混用。但是前边也说了,资金有限。

  • 2、看你重启的表现,不像是第一次遇到这个情况吧

    菜鸡后端,运维的事咱也不懂。一看日志oom就觉得内存不足,得提升内存。哈哈。

  • 3、这种情况其实早遇到过

    在自己的电脑上装es的时候,也是因为内存不足导致运行失败,后来减小了内存的配置,来勉强运行。道理是一样的,给足内存,性能自然好。当鱼和熊掌二者不可兼得的时候,自然得有所取舍,舍得舍得