`

关于Mongodb的内存使用

阅读更多

参考: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内存管理的基础至关重要。MongoDB使用一种名为MMAPv1或WiredTiger的存储引擎来处理数据。MMEPv1(Memory-Mapped Files)是早期版本的默认引擎,它将数据文件映射到操作系统内存,从而实现快速的...

    限制mongodb内存的使用

    默认情况下,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定期执行内存压缩操作,以释放未使用的内存区域,减少内存碎片。 - 通过移动数据、合并空闲块等方式,整理内存布局,提高内存利用率。 综上所述,《MongoDB开发使用手册》不仅详细介绍了NoSQL数据库的...

    MongoDB 内存使用情况分析

    要准确评估MongoDB的实际内存使用,可以使用`free`命令查看系统级别的内存使用情况,特别是`-/+ buffers/cache`行,它显示了除去缓冲区和缓存后的内存使用情况。然而,这种方法仍无法明确区分哪些内存是MongoDB使用...

    MongoDB与内存.pdf

    MongoDB与内存.pdf MongoDB与内存.pdf MongoDB与内存.pdf MongoDB与内存.pdf MongoDB与内存.pdf MongoDB与内存.pdf MongoDB与内存.pdf

    mongodb7.0.0安装包

    10. 性能优化:根据你的具体需求,可以调整MongoDB的性能设置,如内存使用、索引策略和复制集配置。 MongoDB 7.0.0版本可能引入了新的特性、改进和修复,因此在升级前,建议阅读官方文档,了解新版本的详细信息和...

    MongoDB限制内存批处理.bat

    MongoDB限制内存批处理.bat,这个仅仅是个批处理,实际可以参考我的博客里的dos命令,上次批处理只是为了方便他人

    mongodb使用文档集

    1. 高性能:MongoDB的内存映射文件系统(MMAPv1或 WiredTiger)提供快速的读写性能。 2. 易于开发:JSON格式的数据模型和动态模式适应快速迭代的开发环境。 3. 分布式特性:天然支持分布式架构,适合大数据和云计算...

    windows mongodb 32位

    MongoDB的32位版本虽然在内存使用和性能上可能受限,但它仍然是一个可靠的数据库解决方案,尤其适合小型项目或测试环境。 MongoDB 32位版的主要特点: 1. 内存限制:32位系统最大可使用的物理内存有限,因此MongoDB...

    MongoDB开发使用手册.pdf

    描述:本文档旨在介绍 MongoDB 的开发使用手册,涵盖 MongoDB 的基本概念、NOSQL 的历史和产生原因、MongoDB 的特点和优势、MongoDB 的安装和配置、MongoDB 的数据模型、MongoDB 的查询语言、MongoDB 的索引和优化、...

    mongodb Windows7 64位

    - 性能指标:使用`top`命令或者第三方工具(如MongoDB Compass)监控数据库的性能,如内存使用、磁盘I/O等。 7. **集群和复制集** - 集群:MongoDB支持分片集群,可以水平扩展存储和处理能力。这需要多个MongoDB...

    jest-mongodb:MongoDB内存服务器的Jest预设

    Jest-Mongodb 开玩笑预设以运行MongoDB内存服务器用法0.安装$ yarn add @shelf/jest-mongodb --dev确保mongodb也已安装在项目中,这是对等依赖项所必需的。1.创建jest.config.js module . exports = { preset : '@...

    mongodb的安装和使用简介

    在32位系统中,由于内存限制,MongoDB的最大数据存储容量被限制在2GB以内;而在64位系统中,则没有这样的限制。 安装MongoDB后,需要创建数据文件夹并运行服务程序(mongod.exe),这样才能启动数据库服务。为了...

    MongoDB内存管理和缓存机制解析:优化性能的关键策略

    MongoDB是一个基于文档的NoSQL数据库,由C++语言编写,旨在为大量分布式数据提供高性能、高可用性和高灵活性的数据存储解决方案。MongoDB的主要特点包括: 1. **文档导向**:MongoDB存储BSON(二进制JSON)格式的...

    NoSQLBooster for MongoDB

    9. **实时统计**:实时监控MongoDB服务器的性能指标,如内存使用、CPU占用、网络流量等,帮助用户及时发现和解决问题。 10. **版本兼容性**:NoSQLBooster持续更新以保持与最新版本的MongoDB兼容,确保用户始终能够...

    解决MongoDB占用内存过大频繁死机的方法详解

    MongoDB是一款流行且功能强大的NoSQL数据库,以其灵活性和高性能而受到广泛应用。然而,当MongoDB占用过多内存时,可能导致系统...更多关于MongoDB内存管理的问题,可以通过查阅官方文档或在线社区获取更多解决方案。

    MongoDB介绍与使用文档

    ### MongoDB介绍与使用文档 #### mongoDB概述 MongoDB是一个介于关系数据库和非关系数据库之间的产品,它属于NoSQL数据库...这表明在高负载情况下,需要密切关注系统的内存使用情况,以避免因内存不足而引起的问题。

    MongoDB C/C++开发使用案例Demo

    2. **连接MongoDB**:使用C++驱动,开发者可以通过`mongoclient`对象建立到MongoDB服务器的连接。例如: ```cpp mongoclient conn("mongodb://localhost:27017"); ``` 3. **数据库操作**:连接建立后,可以创建...

Global site tag (gtag.js) - Google Analytics