MongoDB 占用大量内存和Swap不释放

  • Post author:
  • Post category:其他


接到告警,一台部署了多实例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 版权协议,转载请附上原文出处链接和本声明。