文档章节

MongoDB内存管理

o00o
 o00o
发布于 2017/04/06 20:57
字数 899
阅读 10
收藏 0

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

内存使用情况

查看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,最大连接数为819

replication: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

【参考】

© 著作权归作者所有

共有 人打赏支持
o00o
粉丝 1
博文 89
码字总数 38862
作品 0
武汉
其他
MySQL、MongoDB、Redis 数据库之间的区别

MySQL、MongoDB、Redis 数据库之间的区别 NoSQL 的全称是 Not Only SQL,也可以理解非关系型的数据库,是一种新型的革命式的数据库设计方式,不过它不是为了取代传统的关系型数据库而被设计的...

推荐码发放
07/30
0
0
MongoDB 最佳实践及2.8版本特性与功能

主要流程 MongoDB 2.8 版本特性与功能 MongoDB 在赶集网的应用 MongoDB 最佳实践 MongoDB 2.8 版本特性与功能 TJ MongoDB 开发者 TJ 强调 MongoDB 没有实际意义上的锁,只有 Latch,门栓。 ...

eui988
2015/04/18
0
1
浅述MongoDB的管理操作

浅述MongoDB的管理操作 2011-08-22 21:49 不知不觉房产系统已经使用MongoDB一年多了,记得一年多以前,正是NOSQL被热炒时,MongoDB更是作为NOSQL中的佼佼者,被炒得火烫,也应该就在当时被这...

李长春
2011/09/02
0
0
#转帖#MongoDB的基本特性与内部构造

MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类...

Hochikong
2015/02/26
0
0
Zabbix监控mongodb配置

本文主要介绍zabbix监控mongodb的配置。 zabbix监控mongodb需要自定义脚本去监控,脚本可以传入多个参数。 原理:通过mongodb客户端连接命令,过滤出db.serverStatus()输出的信息。 一、创建...

hnr1017
07/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

[雪峰磁针石博客]软件测试专家工具包1web测试

web测试 本章主要涉及功能测试、自动化测试(参考: 软件自动化测试初学者忠告) 、接口测试(参考:10分钟学会API测试)、跨浏览器测试、可访问性测试和可用性测试的测试工具列表。 安全测试工具...

python测试开发人工智能安全
今天
2
0
JS:异步 - 面试惨案

为什么会写这篇文章,很明显不符合我的性格的东西,原因是前段时间参与了一个面试,对于很多程序员来说,面试时候多么的鸦雀无声,事后心里就有多么的千军万马。去掉最开始毕业干了一年的Jav...

xmqywx
今天
2
0
Win10 64位系统,PHP 扩展 curl插件

执行:1. 拷贝php安装目录下,libeay32.dll、ssleay32.dll 、 libssh2.dll 到 C:\windows\system32 目录。2. 拷贝php/ext目录下, php_curl.dll 到 C:\windows\system32 目录; 3. p...

放飞E梦想O
今天
0
0
谈谈神秘的ES6——(五)解构赋值【对象篇】

上一节课我们了解了有关数组的解构赋值相关内容,这节课,我们接着,来讲讲对象的解构赋值。 解构不仅可以用于数组,还可以用于对象。 let { foo, bar } = { foo: "aaa", bar: "bbb" };fo...

JandenMa
今天
1
0
OSChina 周一乱弹 —— 有人要给本汪介绍妹子啦

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子 :分享水木年华的单曲《中学时代》@小小编辑 手机党少年们想听歌,请使劲儿戳(这里) @须臾时光:夏天还在做最后的挣扎,但是晚上...

小小编辑
今天
68
8

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部