MongoDB内存管理
2017-04-06 00:00
197 查看
MongoDB使用的是内存映射存储引擎,即Memory Mapped Storage Engine,简称MMAP。MMAP可以把磁盘文件的一部分或全部内容直接映射到内存,这样文件中的信息位置就会在内存中有对应的地址空间,这时对文件的读写可以直接用指针来做,而不需要read/write函数了,但这并不代表将文件map到物理内存,只有访问到这块数据时才会被操作系统以Page的方式换到物理内存。MongoDB将内存管理工作交给操作系统的虚拟内存管理器来完成,这样就大大简化了MongoDB的工作,同时操作系统会将数据刷新保存到磁盘上。
多数操作系统缺省都是把它设置成unlimited的,如果操作系统不是,可以这样修改:
所有连接消耗的内存加起来会相当惊人,推荐把Stack设置小一点,比如说1024:
从
当前系统内存使用情况
【参考】
内存使用情况
查看Linux虚拟内存管理器是否对内存做了限制,如果显示为unlimited表示无限制[root@localhost bin]# ulimit -a | grep memory max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited virtual memory (kbytes, -v) unlimited
多数操作系统缺省都是把它设置成unlimited的,如果操作系统不是,可以这样修改:
[root@localhost bin]# ulimit -m unlimited [root@localhost bin]# ulimit -v unlimited
查看当前MongoDB的连接数
mongo中每一个连接都是一个线程,需要一个stack,从结果中可看到当前连接数为13,最大连接数为819replication:PRIMARY> db.serverStatus().connections { "current" : 13, "available" : 806, "totalCreated" : 36 }
Linux下缺省的Stack大小查看
[root@localhost bin]# ulimit -a | grep stack stack size (kbytes, -s) 10240
MongoDB实际使用的Stack大小查看
[root@localhost bin]# cat /proc/$(pidof mongod)/limits | grep stack | awk -F 'size' '{print int($NF)/1024}' 10240
调整stack大小
如果Stack过大(比如:10240K)的话没有意义,简单对照命令结果中的Size和Rss:[root@localhost bin]# cat /proc/$(pidof mongod)/smaps | grep 10240 -A 10
所有连接消耗的内存加起来会相当惊人,推荐把Stack设置小一点,比如说1024:
[root@localhost bin]# ulimit -s 1024
从
MongoDB1.8.3开始,MongoDB会在启动时自动设置Stack。
释放内存
有时候可能想释放掉MongoDB占用的内存,不过内存管理工作是由虚拟内存管理器控制的,但可以使用MongoDB内置的closeAllDatabases命令达到目的:replication:PRIMARY> use admin replication:PRIMARY> db.runCommand({closeAllDatabases:1})
监控MongoDB的内存使用情况
replication:PRIMARY> db.serverStatus().mem { "bits" : 64, "resident" : 6591, # 到现在总共使用的物理内存,单位:MB "virtual" : 7461, # 当前Mongodb实例使用的虚拟内存大小,单位:MB,一般情况下比mem.map的值要大一点,如果大很多很有可能发生内存泄露,如果使用journal,大约是2倍的map值 "supported" : true, # 本机是否支持内存扩展 "mapped" : 0, # Mongodb使所有数据都映射到内存中,所以这个值可以看成整个数据量的值。 "mappedWithJournal" : 0 }
Mongodb内存大小配置建议
MongoDB应该分配的内存大小最好满足内存 > 索引 + 热数据 + 连接占用内存,通过
db.stats()命令可查看到当前数据库的索引大小情况
replication:PRIMARY> db.stats() { "db" : "mydb", # 当前数据库 "collections" : 10, # 当前数据库多少表 "views" : 0, "objects" : 2777998, # 当前数据库所有表多少条数据 "avgObjSize" : 988.7910034492465, # 每条数据的平均大小 "dataSize" : 2746859430, # 所有数据的总大小 "storageSize" : 409530368, # 所有数据占的磁盘大小 "numExtents" : 0, "indexes" : 10, # 索引数 "indexSize" : 25239552, # 索引大小 "ok" : 1 }
当前系统内存使用情况
[root@localhost bin]# free -m total used free shared buffers cached Mem: 64519 11967 52551 0 248 2707 -/+ buffers/cache: 9011 55508 Swap: 32767 0 32767
总内存:64G mongodb: 2.58G "dataSize" : 2746859430 => 2.56G "indexSize" : 25239552 => 0.02G
【参考】
相关文章推荐
- Mongodb内存管理和使用情况情况查询
- mongodb 源码解析内存管理
- MongoDB源码概述——内存管理和存储引擎
- 记一次MongoDB性能问题+Linux内存管理学习笔记--物理内存分配
- mongodb内存管理
- Mongodb内存管理和使用情况情况查询
- Mongodb内存管理和使用情况情况查询
- Mongodb更新数组$push操作符
- 关于MongoDB,你可能不知道的十件事
- mongoDB 入门指南、示例
- 内存管理
- linux 内存管理 - 分配页面
- Mongodb更新数组$push操作符
- 内核比较: 2.6 内核中改进了内存管理
- MongoDB启动与停止以及Mongodump备份数据文件
- MongoDB -(2) replica sets
- MongoDB查询 之 数组、内嵌文档和$where
- Mongodb更新数组$sort操作符
- C#内存管理(七)
- Windows7下安装MongoDB