对MongoDB内存使用进行限制

在实际使用时,在写入数据后发现机器的内存使用暴涨,由于机器上本身有其他的服务存在,再加上MongoDB的占用,有的机器内存使用近乎达到100%的状态,用top查看了一下,仅mongod就占了33%,那么对MongoDB使用内存进行限制在一定条件下就是必要的。

WiredTiger

WiredTiger是用于数据管理的高性能,可扩展,生产质量的NoSQL,开源可扩展平台。WiredTiger使用MVCC体系结构。MongoDB于2014年12月16日收购了WiredTiger Inc. MongoDB在3.2及以后,默认使用WiredTiger存储引擎,它提供了文档级并发模型,检查点和压缩等功能。

解决方案

官方文档中有提到storage.wiredTiger Options的配置,定义WiredTiger将用于所有数据的内部缓存的最大大小,从MongoDB在3.4以后,默认的WiredTiger内部缓存大小是以下两者中的较大者:

  • 50 % (RAM-1 GB)
  • 256 MB

例如,在总共有4GB RAM的系统上,WiredTiger缓存将使用1.5GB RAM(0.5 * (4 GB - 1 GB) = 1.5 GB)。相反,总内存为1.25 GB的系统将为WiredTiger缓存分配256 MB,因为这是总RAM的一半以上减去1 GB(0.5 * (1.25 GB - 1 GB) = 128 MB < 256 MB)。

/etc/mongod.conf进行修改:

1
2
3
4
5
6
7
storage:
dbPath: /var/lib/mongodb
journal:
enabled: true
wiredTiger:
engineConfig:
cacheSizeGB: 3

重启mongod服务

1
$ systemctl restart mongod

可以看到内存使用已经下降

WiredTiger eviction

WiredTiger在内存使用接近一定阈值就会开始做淘汰,避免内存使用满了阻塞用户请求,目前有4个可配置的参数来支持WiredTiger存储引擎的eviction策略(一般不需要修改),在WiredTiger开发文档中可以看到其含义:

  • eviction_target,默认为80%,当cache used超过eviction_target,后台evict线程开始淘汰CLEAN PAGE
  • eviction_trigger,默认为95%,当cache used超过 eviction_trigger,用户线程也开始淘汰 CLEAN PAGE
  • eviction_dirty_target,默认为5%,当cache dirty超过eviction_dirty_target,后台evict线程开始淘汰 DIRTY PAGE
  • eviction_dirty_trigger,默认为20%,当cache dirty超过eviction_dirty_trigger, 用户线程也开始淘汰 DIRTY PAGE

如果持续出现cache used>=95%或者cache dirty dirty>=20%,说明内存淘汰压力很大,用户的请求线程会阻塞参与page淘汰,请求延时就会增加,这时可以考虑扩大内存或者换更快的磁盘提升IO能力。

参考

1、https://stackoverflow.com/questions/6861184/is-there-any-option-to-limit-mongodb-memory-usage
2、http://mongoing.com/archives/2540
3、http://www.mongoing.com/archives/8781
4、http://caosiyang.github.io/2016/08/23/mongodb-wiredtiger-performance-tuning/

0%