接到告警,一台部署了多实例MongoDB的机器内存和swap快用完了,排查发现下午某一个实例导入大量数据。
为什么会用了这么多内存和swap?
因为WiredTiger引擎使用内存的方式是:
50% of (RAM – 1 GB)或256 MB,哪个更大就以哪个为上限。
一个机器部署了多个实例,按照50% of (RAM – 1 GB)的比例分配,那当然是会把内存用完的。
解决方式只能是重启实例了,还好是复制集+分片集的架构,可以通过主库切换的方式来轮流重启从库;
当然最后别忘了在配置文件里设置wiredTigerCacheSizeGB。
可为什么导完数据以后,内存和swap还不释放?
因为MongoDB只顾着索要内存,但是用完以后,并不负责释放,而是交给Linux内核来管理这些用过内存。而Linux也比较懒,只有在需要内存的时候,再把这部分内存重用,所以看起来内存和swap都没有释放。
还发现即使swap都快用完了,内存却一直保持着2g的空闲空间?
跟vm.extra_free_kbytes有关
版权声明:本文为weixin_39004901原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。