您的位置:首页 > 编程语言 > Go语言

ongodb内存管理和使用情况情况查询

2016-03-17 10:10 357 查看

overview

MongoDB使用的是内存映射存储引擎,即Memory Mapped Storage Engine,简称MMAP。MMAP可以把磁盘文件的一部分或全部内容直接映射到内存,这样文件中的信息位置就会在内存中有对应的地址空间,这时对文件的读写可以直接用指针来做,而不需要read/write函数了,但这并不代表将文件map到物理内存,只有访问到这块数据时才会被操作系统以Page的方式换到物理内存。MongoDB将内存管理工作交给操作系统的虚拟内存管理器来完成,这样就大大简化了MongoDB的工作,同时操作系统会将数据刷新保存到磁盘上,下图就是MMAP的简要工作原理图

内存使用情况

查看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

Mongodb内存大小配置建议

MongoDB应该分配的内存大小最好满足内存大小>索引+热数据+连接占用内存,通过db.stats()命令可查看到当前数据库的索引大小情况

bj1-farm1:PRIMARY> db.stats()

{

"db" : "yc_driver", //当前数据库

"collections" : 5, //当前数据库多少表

"objects" : 2911281, //当前数据库所有表多少条数据

"avgObjSize" : 240.28991086741541, //每条数据的平均大小

"dataSize" : 699551452, //所有数据的总大小

"storageSize" : 858513408, //所有数据占的磁盘大小

"numExtents" : 21,

"indexes" : 5, //索引数

"indexSize" : 569229472, //索引大小

"fileSize" : 2080374784, //预分配给数据库的文件大小

"nsSizeMB" : 16,

"dataFileVersion" : {

"major" : 4,

"minor" : 5

},

"extentFreeList" : {

"num" : 0,

"totalSize" : 0

},

"ok" : 1

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: