文档章节

MongoDB内存管理

o00o
 o00o
发布于 2017/04/06 20:57
字数 899
阅读 13
收藏 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
粉丝 2
博文 96
码字总数 46681
作品 0
武汉
其他
私信 提问
MongoDB与内存

但凡初次接触MongoDB的人,无不惊讶于它对内存的贪得无厌,至于个中缘由,我先讲讲Linux是如何管理内存的,再说说MongoDB是如何使用内存的,答案自然就清楚了。 据说带着问题学习更有效,那就...

Sephiroth
2012/03/14
14.2K
10
爬虫数据库MongoDB的介绍

MongoDB (名称来自「humongous (巨大无比的)」), 是一个可扩展的高性能,开源,模式自由,面向文档的NoSQL,基于 分布式 文件存储,由 C++ 语言编写,设计之初旨在为 WEB 应用提供可扩展的高...

张元江_erel
11/17
0
0
Windows下使用WSRM限制MongoDB内存

有个项目用到了MongoDB,我们是在WINDOWS 2008 64位环境下部署的,为啥不部署到linux下面呢,我们没那么多服务器,只能将就一下了。   大家都知道Mongodb吃内存太厉害了,如果不重启服务,...

Airship
10/23
0
0
MongoDB 最佳实践及2.8版本特性与功能

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

eui988
2015/04/18
0
1
MySQL、MongoDB、Redis 数据库之间的区别

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

推荐码发放
07/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

git常用命令

首先打开git bash方式可以直接鼠标右击 或者在开始菜单(windows系统,苹果暂时不要问我,等我有钱买苹果电脑告诉你们0.0) 打开界面如下 1.查看远程仓库地址 git remote -v 2.创建本地分支 ...

熊小熊会写代码哦
14分钟前
2
0
离屏Canvas — 使用Web Worker提高你的Canvas运行速度

现在因为有了离屏Canvas,你可以不用在你的主线程中绘制图像了! Canvas 是一个非常受欢迎的表现方式,同时也是WebGL的入口。它能绘制图形,图片,展示动画,甚至是处理视频内容。它经常被用...

嫣然丫丫丫
16分钟前
2
0
SpringBoot 整合 BeetlSQL

SpringBoot 整合 BeetlSQL 1. beetlsql介绍 BeetSql是一个全功能DAO工具, 同时具有Hibernate 优点 & Mybatis优点功能,适用于承认以SQL为中心,同时又需求工具能自动能生成大量常用的SQL的应...

Jeff_Regan
17分钟前
1
0
UNIGUI-DBGRID的统计行的使用

关键步骤: 1、设置DBGRID的summary.enabled:=true 2、打开DBGRID的columns字段,设置DBGRID对应的column的showsummary:=true; 3、写入uniDBGRID.onColumnSummary事件: procedure TframeCa......

dillonxiao
19分钟前
2
0
MySQL语法速查1:基础命令篇

[TOC] 1.1. 关于 SQL SQL 是 Structure Query Language(结构化查询语言)的缩写,是关系型数据库的基本语言,由 IBM 在 20 世纪 70 年代开发出来,作为 IBM 关系数据库原型 System R 的原型...

whoru
24分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部