目录
- MongoDB的内存用在哪儿?
- 怎样限定MongoDB对内存的使用?
- cacheSizeGB参数设置的注意事项
- 怎样查看内存使用情况?
MongoDB的内存用在哪儿?
在MongoDB中,加载各种依靠的lib到内存、管理客户端请求、元数据管理存储等工作都需要占用内存,但实在内存使用的大部分还是在存储引擎和客户端连接请求处理惩罚方面。
一方面是存储引擎的cache,通常情况下,我们可以使用参数cacheSizeGB参数(下面会讲到)来控制内存使用率,一旦高出这个内存使用率,则MongoDB的存储引擎会镌汰掉部分内存中的数据页。
正常运行的MongoDB实例,内存使用率约莫为80%的cacheSizeGB参数值,由于高出80%之后,内存镌汰计谋就开始镌汰逾期的数据页了,如果出现使用率过大,则多半表示当前实例内存镌汰的压力比力大。请求就有延时的大概。
另一方面,如果客户端的连接数过多,建立过多的tcp链接,这些连接的维护,需要有read buffer和write buffer以用来收发网络包,以是也会产生开销。每个连接占用的内存巨细约为2MB左右。
怎样限定MongoDB对内存的使用?
最近在线上发现了一些故意思的现象,比如某一台服务器上摆设了MySQL和MongoDB的服务,然后内存报警,说是内存已经使用了高出85%了,这个时候,通常我们会想到迁移服务。将MySQL大概MongoDB的服务切换到其他的机器上,如许,服务器的内存就可以节流下来。
但是实际的现象就是,如果我们迁移了MySQL的服务之后,服务器的内存临时会降下来,但是一段时间过后,又会报警,由于MongoDB已经将MySQL腾出来的内存空间也占用完了。
我们知道,在MySQL中,占用内存比力多的就是innodb_buffer_pool,尚有一堆其他的buffer,除此之外,连接数也是一个需要考虑的因素。
在MongoDB中,如果我们不限定MongoDB的内存使用,那么MongoDB就会尽大概的占用更多的内存来进步读写性能。详细的计谋如下:
从MongoDB3.4开始, WiredTiger存储引擎默认的cache size是下面2个值中较大的一个。
公式一:0.5*(物理内存-1GB)
公式二:256MB
例如,物理内存4G,则cache size=1.5GB,如果物理内存1.5G,则cache size=0.5*(1.5-1)=250MB < 256MB ,以是取值为256MB
MongoDB中可以通过设置文件的内容限定MongoDB所使用的内存,关键参数如下:
- storage:
- wiredTiger:
- engineConfig:
- cacheSizeGB: <number> # 单位是GB,浮点型
- journalCompressor: <string>
- directoryForIndexes: <boolean>
- maxCacheOverflowFileSizeGB: <number>
- collectionConfig:
- blockCompressor: <string>
- indexConfig:
- prefixCompression: <boolean>
复制代码
上面的参数,一样平常情况下,单机单实例,建议设置在内存的60%左右。
cacheSizeGB参数设置的注意事项
几点建议:
1、不要增加WiredTiger的内部cache size高出默认值
2、WiredTiger存储引擎使用WiredTiger内部缓存和文件系统缓存
3、WiredTiger会自动使用全部剩余的文件系统缓存
4、单机多实例请务必镌汰mongod的内存分配值
怎样查看内存使用情况?
db.hostInfo()
这个命令可以查看MongoDB的内存限定情况,查看结果如下:- SECONDARY> db.hostInfo()
- {
- "system" : {
- "currentTime" : ISODate("2020-12-31T03:51:28.278Z"),
- "hostname" : "localhost.localdomain:24204",
- "cpuAddrSize" : 64,
- "memSizeMB" : 64393,
- "numCores" : 8,
- "cpuArch" : "x86_64",
- "numaEnabled" : false
- },
复制代码
以上就是MongoDB 内存管理相干总结的详细内容,更多关于MongoDB 内存管理的资料请关注草根技能分享其它相干文章! |