文章目录
一、MongoDB内存使用概览
MongoDB内存消耗主要有两部分:
1、存储引擎
2、client建立的连接的请求处理
1.1 存储引擎对内存的消耗
MongoDB 3.2版本之后默认存储引擎位wiredtiger,wiredtiger存储引擎可以通过cacheSizeGB来进行控制,一般建议该参数设置为系统可用内存的60%。
MongoDB 使用 Google tcmalloc 作为内存分配器。当内存接近一定的阈值时,就会开始做淘汰,避免内存使用满了阻塞用户请求。
tcmalloc内存淘汰机制:
参数 | 默认值 | 含义 |
---|---|---|
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 |
在这个规则下,一个正常运行的mongodb实例的内存使用大约在cacheSizeGB的0.8左右,偶尔超出问题不大。
如果持续出现used>90%或者dirty>20%,说明内存淘汰压力很大,用户的请求线程会阻塞参与page淘汰,请求延时增加。这时可以考虑【增加内存】或者【更换IO能力更强的磁盘】
1.2 TCP 连接及请求处理
1、tcp协议栈
socket元数据、每个线程的read buffer\write buffer、用户收发网络包
buffer的大小通过如下sysctl系统参数配置
2、请求线程栈
MongoDB为每个连接单独建立一个线程
mongod 为处理连接请求的线程配置了最大1MB的线程栈,一般在几十KB左右
可通过proc文件系统来看这些线程栈的实际开销
3、后台线程栈
主备同步、定期刷新 Journal、TTL、evict 等线程
默认每个线程最大ulimit -s(一般10MB)的线程栈
4、MongoDB客户端创建连接如何消耗内存?
1)每个线程会有自己的 local free page cache,还有 central free page cache
2)申请内存时会先从local free page cache中查询可用内存,如果没有继续在central free page cache中寻找可用内存
3)如果上述还是找不到可用内存,再去堆上申请内存
4)释放内存时,内存会先归还到cache,tcmalloc再慢慢归还至OS
二、如何控制MongoDB内存使用率
2.1 合理配置cacheSizeGB
通过cacheSizeGB参数与实际服务器RAM配置合理设置内存限制,一般建议设置cacheSizeGB参数为可用内存的60%。当然我们也需要考虑当前服务器上是否还有其他内存消耗较大的服务。
2.2 控制并发连接数
-
应用层面
MongoDB driver 在连接 mongod 时,会维护一个连接池(通常默认100),当有大量的客户端同时访问同一个mongod时,就需要考虑减小每个客户端连接池的大小 -
数据库层面
通过net.maxIncomingConnections限制MongoDB并发连接数,防止数据库过载。
从数据库层面进行并发连接控制是我们的最后一道防线,更重要的还是需要我们进一步分析,大量的并发请求是真实的业务压力过大,还是查询执行效率过低导致的会话积压。
2.3 配置swap
如果配置了swap,可以有效的防止MongoDB服务出现OOM,但是当内存不足时,频繁的使用swap会严重影响数据库性能。
最优的场景是为MongoDB服务配置充足的内存,内存不足及时扩容
2.4 其他
1)尽量减少内存排序的场景,内存排序一般需要更多的临时内存
2)主备节点配置差距不要过大,备节点会维护一个buffer(默认最大256MB)用于存储拉取到oplog,后台从buffer里取oplog不断重放,当备同步慢的时候,这个buffer会持续使用最大内存。
3)控制集合及索引的数量,减少databse管理元数据的内存开销;集合、索引太多,元数据内存开销是一方面的影响,更多的会影响启动加载的效率、以及运行时的性能。
参考文档:
https://yq.aliyun.com/articles/685044?spm=a2c4e.11155435.0.0.155a135eYaJeyU