事出有因
最近新部署了一台服务器,在启动了一个MongoDB的docker容器后,系统内存直接消耗掉近一半,于是排查问题。
原因
由于MongoDB会将数据缓存到内存中,以提高查询效率,那么问题来了,MongoDB会缓存多少数据到内存中?
在使用默认配置时,答案是:(系统内存 - 1G) × 0.5 或者 256M,两者取大。
即,如果你的系统内存为8G,则MongoDB实例最多会缓存 (8 - 1) × 0.5 = 3.5G 的数据到内存中。
而且启动实例后就会缓存,如果是多个实例部署在同一个台机器上,那问题就很大。
解决方案
修改mongodb配置
在配置文件中指定该项配置的值 storage.wiredTiger.engineConfig.cacheSizeGB,eg:
storage:
wiredTiger:
engineConfig:
cacheSizeGB: 1
这里表示可以最多缓存1G的数据。之后再重启实例即可生效。
有关更多的缓存限制相关配置请阅读MongoDB文档。
修改容器配置
如果同我一样是使用了docker的容器,也可以通过限制容器可使用的内存来达到目的,本人就是因为没有添加相关限制才导致了这种情况。
docker run -d -m 512M --memory-swap 1G
建立容器时通过 -m 和 –memory-swap 参数可以设置容器可使用的RAM和swap空间,这里表示可使用的RMA为512M,而swap空间为1G - 512M = 512M。
docker update --memory 512m --memory-swap 1G containerName
也可通过上述命令来更新已有容器的内存限制。
有关更多的内存限制相关配置请阅读docker文档。