mongodb – 内存占用过高,wiredTigerCacheSizeGB限制

问题

在使用 MongoDB 过程中,会遇到 内存占用随着数据操作而线性增加 的情况;
如果数据持续的大量写入的话,会大量占用服务器内存,出现 OOM 问题,在服务器内存保护机制作用下,MongoDB 会被 kill 掉。

内存增加的原因

mongo为了优化他的读写效率,将内存当做缓存,所以你读写次数越多,缓存就越大。默认值:
从3.4开始,WiredTiger内部缓存默认使用较大的一个, 我用的是4.1
50%(RAM – 1 GB),或256 MB。
例如,我是8G内存,那么最大缓存0.5*(8-1)=3.5G,看到了么。。。mongo默认3.5G都是他的缓存。

cacheSizeGB的介绍

storage.wiredTiger. engineConfig.cacheSizeGB

wiredtiger将使用所有数据的最大缓存大小,wiredTiger缓存工作集(working set)数据的内存大小,单位:GB,

此值决定了wiredTiger与mmapv1的内存模型不同,它可以限制mongod对内存的使用量,而mmapv1则不能(依赖于系统级的mmap)。

默认情况下,cacheSizeGB的值为假定当前节点只部署一个mongod实例,在MongoDB 3,默认情况下,wiredtiger缓存,使用1 GB或安装的物理内存的一半,以较大者为准。

如果当前节点部署了多个mongod进程,那么需要合理配置此值。

如果mongod部署在虚拟容器中(比如,lxc,cgroups,Docker)等,它将不能使用整个系统的物理内存,则需要适当调整此值。默认值为物理内存的一半。

解决

在配置中限制mongo的缓存大小, 引擎需要更换为wiredTiger 默认的mmapv1依赖于mmap不能指定
官方也声称wiredTiger更加优秀
修改(增加)cacheSizeGB配置。

配置如下:

# Where and how to store data.
  engine: wiredTiger
#  mmapv1:
  wiredTiger:
    engineConfig:
      cacheSizeGB: 1