|
MongoDB使用的是内存映射存储引擎,即Memory Mapped Storage Engine,简称MMAP。
MMAP可以把磁盘文件的一部分或全部内容直接映射到内存,这样文件中的信息位置就会在内存中有对应的地址空间,这时对文件的读写可以直接用指针来做,而不需要read/write函数了,但这并不代表将文件map到物理内存,只有访问到这块数据时才会被操作系统以Page的方式换到物理内存。MongoDB将内存管理工作交给操作系统的虚拟内存管理器来完成,这样就大大简化了MongoDB的工作,同时操作系统会将数据刷新保存到磁盘上。
其实,从数据存储原理来看,我更倾向于将mongodb归类为硬盘数据库,但是使用了mmap作为加速的手段而已。
MongoDB应该分配的内存大小最好满足内存大小>索引+热数据+连接占用内存,通过db.stats()命令可查看到当前数据库的索引大小情况 db.stats()
下面是公司的MongoDB存储了14亿数据,占1.4T存储空间
shard1:SECONDARY> db.stats()
{
"db" : "database", // 当前使用的数据库
"collections" : 662, // 多少张表
"objects" : 1405948982, // 所有表的多少条数据 -- 14.05亿
"avgObjSize" : 1134.649427176014, // 平均每条数据大小
"dataSize" : 1595259207065, // 总数据大小 -- 1.485TB
"storageSize" : 768647647232, // 所有数据占磁盘的大小 -- 715.85G
"numExtents" : 0,
"indexes" : 1098, // 索引数量
"indexSize" : 173431967744, // 索引大小 -- 160G
"ok" : 1
}
2、 修改MongoDB使用的内存大小
从3.4版本开始,默认情况下,WieldGigd内部缓存将使用下面2种中更大的一种:50% of (RAM - 1 GB) 和256 MB。通过文件系统缓存,MongoDB的自动使用未被wiredtiger缓存或由其他进程使用所有可用内存。调整WiredTiger内部缓存的方法: storage.wiredTiger.engineConfig.cacheSizeGB 和 --wiredTigerCacheSizeGB
看来不设置的话,默认会使用50% of (RAM - 1 GB)的内存。于是在配置文件设置了storage.wiredTiger.engineConfig.cacheSizeGB为0.5,也就是500M,再看测试结果:
vim /etc/mongod.conf
storage:
dbPath: /var/lib/mongodb
journal:
enabled: true
# engine:
# mmapv1:
wiredTiger:
engineConfig:
cacheSizeGB: 0.5
可以看到,MongoDB所占的物理内存稳定在了630M左右,说明设置确实生效了。
3、内存使用情况 查看Linux虚拟内存管理器是否对内存做了限制,如果显示为unlimited表示无限制 [jiangjianjian@f1-mongo1 ~]$ ulimit -a | grep memory max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited virtual memory (kbytes, -v) unlimited 修改虚拟内存限制 [jiangjianjian@f1-mongo1 ~]$ ulimit -m unlimited [jiangjianjian@f1-mongo1 ~]$ ulimit -v unlimited
查看当前MongoDB的连接数 mongo中每一个连接都是一个线程,需要一个stack,从结果中可看到当前连接数为2372,最大连接数为51200 bj1-farm1:PRIMARY> db.serverStatus().connections { "current" : 2372, "available" : 48828, "totalCreated" : NumberLong(185449264) }
Linux下缺省的Stack大小查看 [jiangjianjian@f1-mongo1 ~]$ ulimit -a | grep stack stack size (kbytes, -s) 10240
MongoDB实际使用的Stack大小查看 可以用如下命令确认(单位:K) [root@f1-mongo1 journal]# cat /proc/$(pidof mongod)/limits | grep stack | awk -F 'size' '{print int($NF)/1024}' 10240
调整stack大小的方法 如果Stack过大,比如上述的10240K,我们可以通过以下命令调整stack大小 [root@f1-mongo1 journal]# ulimit -s 1024 MongoDB释放内存的命令 mongo> use admin mongo> db.runCommand({closeAllDatabases:1}) Mongodb自带命令查看其内存使用情况 其中resident代表物理内存使用情况,单位为M;而virtual为虚拟内存使用情况,mapped是映射到内存的数据大小。这里虚拟内存是mapped的两倍,是因为我们开启了Journal日志,需要在内存中多映射一次,大概就是它的两倍了。如果关闭Journal日志,虚拟内存大小将和mapped大小相当。 bj1-farm1:PRIMARY> db.serverStatus().mem { "bits" : 64, "resident" : 46662, "virtual" : 326198, "supported" : true, "mapped" : 161399, "mappedWithJournal" : 322798 }
top命令查看 这里还可以通过top命令观察mongodb的内存使用情况,如下图,可看到其中的VIRT和RES与上述命令的结果一样 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 12603 mongod 20 0 318g 45g 44g S 28.0 72.1 27230:21 mongod free命令查看 而再通过free命令可查看到内存占用中有多少是因为数据缓存和cache,关于如何查看free命令,参见http://blog.csdn.net/cug_jiang126com/article/details/42266653 [jiangjianjian@f1-mongo1 ~]$ free total used free shared buffers cached Mem: 65921032 65262376 658656 0 274264 61742808 -/+ buffers/cache: 3245304 62675728 Swap: 100663288 11884 100651404
来源:https://www.cnblogs.com/lemon-flm/p/10876492.html |