参考:https://enterprisezine.jp/dbonline/detail/7098
mongodb有两种存储引擎
■ mmap
在版本3.2之前,该方式一直都是mongodb的默认存储引擎
■ wired tiger
出生在版本2.8,版本3.2以后成了mongodb的默认存储引擎
关于mmap.
mongodb没有对内存的使用进行管理,它将这些任务都交给OS,其实就是利用的linux系统的mmap.
什么是mmap?
mmap就是文件系统上,将文件映射到内存中,进程可以快速的读取存在于内存上的文件的内容。
进程刚启动时,文件是不会映射到内存中。进程初次读取文件是从内存中,读完之后才会将文件放置于内存中。
那之后文件就留在内存上,第二回及之后的访问就有内存应答。
那之后当内存满了的时候会有溢出的现象,mmap的算法将会使一部分文件从内存中退出。这也就是所谓的页故障。
mongodb和mmap
在mongodb里,是将数据目录下的数据文件加载到内存中。
数据目录中存在着,数据库名.0,数据库名.1...这样的文件。
如下:
[db]# ls -lh
合計 545M
drwxr-xr-x 2 root root 4.0K 11月 27 22:40 2014 journal
-rw------- 1 root root 64M 11月 27 22:40 2014 local.0
-rw------- 1 root root 16M 11月 27 22:40 2014 local.ns
-rwxr-xr-x 1 root root 6 11月 27 22:40 2014 mongod.lock
-rw------- 1 root root 64M 11月 27 21:15 2014 test.0 ★
-rw------- 1 root root 128M 11月 27 21:15 2014 test.1 ★
-rw------- 1 root root 256M 11月 27 21:15 2014 test.2 ★
-rw------- 1 root root 16M 11月 27 21:15 2014 test.ns
数据文件中的内容
数据文件中的内容就是数据本身(BSON)和索引。
数据文件中的数据用的extent和索引用的extend以可变长度保存着。
http://blog.mongolab.com/2014/01/how-big-is-your-mongodb/
mongodb加载到内存的时间
刚启动时数据和Index都不会加载到内存
那是因为使用的是mmap
举个例子,看一下hoge Collection
> db.hoge.stats()
{
"ns" : "test.hoge",
"count" : 1740681,
"size" : 83552848,
"avgObjSize" : 48,
"storageSize" : 123936768,
"numExtents" : 11,
"nindexes" : 4,
"lastExtentSize" : 37625856,
"paddingFactor" : 1,
"systemFlags" : 0,
"userFlags" : 1,
"totalIndexSize" : 228331152,
"indexSizes" : {
"_id_" : 50846544,
"a_1" : 43807008,
"_id_1_a_1" : 66838800,
"a_1__id_1" : 66838800
},
"ok" : 1
}
数据大小83552848约80M,索引大小是228331152约220M,看一下serverStatus().
db.serverStatus().mem
{
"bits" : 64,
"resident" : 47,
"virtual" : 1482,
"supported" : true,
"mapped" : 544,
"mappedWithJournal" : 1088
}
现在实际占用了47M的内存,也就是说hoge collection的数据和索引还没有全被加载到内存中。
随着查询的别执行,渐渐的都会被加载到内存。
刚启动的时候内存中啥也没有,随着检索的进行,必要的数据和索引就会渐渐的被加载到内存。
因此,Mongodb刚启动的时候应答的速度会有些慢。
预加热
预加热的话,就可以将常用的数据加入到内存中。
语法如下
db.runCommand({ touch: "collectionName", data: [true|false], index: [true|false] })
> db.serverStatus().mem
{
"bits" : 64,
"resident" : 48, ←启动后48M
"virtual" : 1482,
"supported" : true,
"mapped" : 544,
"mappedWithJournal" : 1088
}
举个例子,刚才的例子,只将索引加载到内存中
db.runCommand({ touch: "hoge", data: false, index: true })
{
"indexes" : {
"num" : 4,
"numRanges" : 30,
"millis" : 48
},
"ok" : 1
}
> db.serverStatus().mem
{
"bits" : 64,
"resident" : 324,←只将索引加载到内存
"virtual" : 1482,
"supported" : true,
"mapped" : 544,
"mappedWithJournal" : 1088
}
清空内存
查看mongodb的内存使用率
top -p (pidof mongod)
或者
top
shift+m
有时候,出于某些原因,你可能想释放掉MongoDB占用的内存,不过前面说了,内存管理工作是由虚拟内存管理器控制的,所以通常你只能通过重启服务来释放内存,你一定不齿于这样的方法,幸好可以使用MongoDB内置的closeAllDatabases命令达到目的:
use admin <--必须切换到admin collection
db.runCommand({closeAllDatabases:1})
另外,通过调整内核参数drop_caches也可以释放缓存:
sysctl -w vm.drop_caches=1
平时可以通过mongo命令行来监控MongoDB的内存使用情况,如下所示:
db.serverStatus().mem:
mongostat
使用top命令记录mongodb进程的内存使用状况
n 设置退出前屏幕刷新的次数
d 指定每两次屏幕信息刷新之间的时间间隔。
b 将top输出编排成适合输出到文件的格式,可以使用这个选项创建进程日志
p 通过指定监控进程ID来仅仅监控某个进程的状态
top -d 300 -b -n 2016 -p 2793 > plog &
以间隔为5分钟一次,将进程2793(mongodb)的状况刷新2016次(一周),导入到plog文件里。
相关推荐
首先,理解MongoDB内存管理的基础至关重要。MongoDB使用一种名为MMAPv1或WiredTiger的存储引擎来处理数据。MMEPv1(Memory-Mapped Files)是早期版本的默认引擎,它将数据文件映射到操作系统内存,从而实现快速的...
默认情况下,mongodb占用的内存大小为: Starting in 3.4, the WiredTiger internal cache, by default, will use the larger of either: 50% of RAM minus 1 GB, or 256 MB. 即 (总内存 × 50% - 1GB) 和 (256...
- MongoDB定期执行内存压缩操作,以释放未使用的内存区域,减少内存碎片。 - 通过移动数据、合并空闲块等方式,整理内存布局,提高内存利用率。 综上所述,《MongoDB开发使用手册》不仅详细介绍了NoSQL数据库的...
要准确评估MongoDB的实际内存使用,可以使用`free`命令查看系统级别的内存使用情况,特别是`-/+ buffers/cache`行,它显示了除去缓冲区和缓存后的内存使用情况。然而,这种方法仍无法明确区分哪些内存是MongoDB使用...
MongoDB与内存.pdf MongoDB与内存.pdf MongoDB与内存.pdf MongoDB与内存.pdf MongoDB与内存.pdf MongoDB与内存.pdf MongoDB与内存.pdf
10. 性能优化:根据你的具体需求,可以调整MongoDB的性能设置,如内存使用、索引策略和复制集配置。 MongoDB 7.0.0版本可能引入了新的特性、改进和修复,因此在升级前,建议阅读官方文档,了解新版本的详细信息和...
MongoDB限制内存批处理.bat,这个仅仅是个批处理,实际可以参考我的博客里的dos命令,上次批处理只是为了方便他人
1. 高性能:MongoDB的内存映射文件系统(MMAPv1或 WiredTiger)提供快速的读写性能。 2. 易于开发:JSON格式的数据模型和动态模式适应快速迭代的开发环境。 3. 分布式特性:天然支持分布式架构,适合大数据和云计算...
MongoDB的32位版本虽然在内存使用和性能上可能受限,但它仍然是一个可靠的数据库解决方案,尤其适合小型项目或测试环境。 MongoDB 32位版的主要特点: 1. 内存限制:32位系统最大可使用的物理内存有限,因此MongoDB...
描述:本文档旨在介绍 MongoDB 的开发使用手册,涵盖 MongoDB 的基本概念、NOSQL 的历史和产生原因、MongoDB 的特点和优势、MongoDB 的安装和配置、MongoDB 的数据模型、MongoDB 的查询语言、MongoDB 的索引和优化、...
- 性能指标:使用`top`命令或者第三方工具(如MongoDB Compass)监控数据库的性能,如内存使用、磁盘I/O等。 7. **集群和复制集** - 集群:MongoDB支持分片集群,可以水平扩展存储和处理能力。这需要多个MongoDB...
Jest-Mongodb 开玩笑预设以运行MongoDB内存服务器用法0.安装$ yarn add @shelf/jest-mongodb --dev确保mongodb也已安装在项目中,这是对等依赖项所必需的。1.创建jest.config.js module . exports = { preset : '@...
在32位系统中,由于内存限制,MongoDB的最大数据存储容量被限制在2GB以内;而在64位系统中,则没有这样的限制。 安装MongoDB后,需要创建数据文件夹并运行服务程序(mongod.exe),这样才能启动数据库服务。为了...
MongoDB是一个基于文档的NoSQL数据库,由C++语言编写,旨在为大量分布式数据提供高性能、高可用性和高灵活性的数据存储解决方案。MongoDB的主要特点包括: 1. **文档导向**:MongoDB存储BSON(二进制JSON)格式的...
9. **实时统计**:实时监控MongoDB服务器的性能指标,如内存使用、CPU占用、网络流量等,帮助用户及时发现和解决问题。 10. **版本兼容性**:NoSQLBooster持续更新以保持与最新版本的MongoDB兼容,确保用户始终能够...
MongoDB是一款流行且功能强大的NoSQL数据库,以其灵活性和高性能而受到广泛应用。然而,当MongoDB占用过多内存时,可能导致系统...更多关于MongoDB内存管理的问题,可以通过查阅官方文档或在线社区获取更多解决方案。
### MongoDB介绍与使用文档 #### mongoDB概述 MongoDB是一个介于关系数据库和非关系数据库之间的产品,它属于NoSQL数据库...这表明在高负载情况下,需要密切关注系统的内存使用情况,以避免因内存不足而引起的问题。
2. **连接MongoDB**:使用C++驱动,开发者可以通过`mongoclient`对象建立到MongoDB服务器的连接。例如: ```cpp mongoclient conn("mongodb://localhost:27017"); ``` 3. **数据库操作**:连接建立后,可以创建...