WangScaler: 一个用心创作的作者。
声明:才疏学浅,如有错误,恳请指正。
前言
晚上十点,躺在床上追剧的小王那是相当自在。
滴,微信弹窗:”小王,网页点击没反应了“。
小王内心十万个XX马飞奔而过。
“唉,肯定是内存又爆表了。”
不出所料,内存不足,mongo直接被kill了。
systemctl restart mongod
先恢复服务,明天再排查。加班?去TM见鬼吧,重启完mongo的小王,躺下继续刷剧了。
刺探军情
要想解决问题,首先得知道问题出在哪里,写程序不像玄学,不知所踪。程序就像是因果,有果必有因。内存不足,当然是我服务器配置有局限性,但是资金限制在这没办法,又得节省资金,还能保证程序在一定性能下运行。有得也有失,熊掌和鱼各取一半。
首先排查mongo宕机的原因。tail -n 1000 /var/log/message.log
确实和我预期的一样,内存不足。再一看mongo占用的内存,好家伙直接吃我接近一半的内存,怪不得不够用。
粮食储备
既然已经刺探到这么重要的军情(mongo占用的内存太高),那势必要解决这一痛处。
首先定位mongo默认内存是多少?
官网显示,默认为(系统最大内存-1G)/2或者256MB,两者选择其中最大的。
这就印证了我们的预期结果,那么继续看看能不能改这个值,根据我们的配置来配置合适的值。
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的时候,也是因为内存不足导致运行失败,后来减小了内存的配置,来勉强运行。道理是一样的,给足内存,性能自然好。当鱼和熊掌二者不可兼得的时候,自然得有所取舍,舍得舍得