`
ppxieppp
  • 浏览: 50733 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

MongoDB是如何使用内存的(转)

 
阅读更多

目前,MongoDB使用的是内存映射存储引擎,它会把数据文件映射到内存中,如果是读操作,内存中的数据起到缓存的作用,如果是写操 

作,内存还可以把随机的写操作转换成顺序的写操作,总之可以大幅度提升性能。MongoDB并不干涉内存管理工作,而是把这些工作留给操 

作系统的虚拟内存管理器去处理,这样做的好处是简化了MongoDB的工作,但坏处是你没有方法很方便的控制MongoDB占多大内存,幸运 

的是虚拟内存管理器的存在让我们多数时候并不需要关心这个问题。 

MongoDB的内存使用机制让它在缓存重建方面更有优势,简而言之:如果重启进程,那么缓存依然有效,如果重启系统,那么可以通过拷贝 

数据文件到/dev/null的方式来重建缓存,更详细的描述请参考:Cache Reheating – Not to be Ignored。 

有时候,即便MongoDB使用的是64位操作系统,也可能会遭遇OOM问题,出现这种情况,多半是因为限制了内存的大小所致,可以这样查 

看当前值: 

shell> ulimit -a | grep memory 
多数操作系统缺省都是把它设置成unlimited的,如果你的操作系统不是,可以这样修改: 

shell> ulimit -m unlimitedshell> ulimit -v unlimited 
注:ulimit的使用是有上下文的,最好放在MongoDB的启动脚本里。 

有时候,MongoDB连接数过多的话,会拖累性能,可以通过serverStatus查询连接数: 

mongo> db.serverStatus().connections 
每个连接都是一个线程,需要一个Stack,Linux下缺省的Stack设置一般比较大: 

shell> ulimit -a | grep stackstack size              (kbytes, -s) 10240 
至于MongoDB实际使用的Stack大小,可以用如下命令确认(单位:K): 

shell> cat /proc/$(pidof mongod)/limits | grep stack | awk -F 'size' '{print int($NF)/1024}' 
如果Stack过大(比如:10240K)的话没有意义,简单对照命令结果中的Size和Rss: 

shell> cat /proc/$(pidof mongod)/smaps | grep 10240 -A 10 
所有连接消耗的内存加起来会相当惊人,推荐把Stack设置小一点,比如说1024: 

shell> ulimit -s 1024 
注:从开始,MongoDB会在启动时自动设置Stack。 

有时候,出于某些原因,你可能想释放掉MongoDB占用的内存,不过前面说了,内存管理工作是由虚拟内存管理器控制的,幸好可以使用 

MongoDB内置的closeAllDatabases命令达到目的: 

mongo> use adminmongo> db.runCommand({closeAllDatabases:1}) 
另外,通过调整内核参数drop_caches也可以释放缓存: 

shell> sysctl -w vm.drop_caches=1 
平时可以通过mongo命令行来监控MongoDB的内存使用情况,如下所示: 

mongo> db.serverStatus().mem:{    "resident" : 22346,    "virtual" : 1938524,    "mapped" : 962283} 
还可以通过mongostat命令来监控MongoDB的内存使用情况,如下所示: 

shell> mongostatmapped  vsize    res faults  940g  1893g  21.9g      0 
其中内存相关字段的含义是: 

mapped:映射到内存的数据大小 
visze:占用的虚拟内存大小 
res:占用的物理内存大小 
注:如果操作不能在内存中完成,结果faults列的数值不会是0,视大小可能有性能问题。 

在上面的结果中,vsize是mapped的两倍,而mapped等于数据文件的大小,所以说vsize是数据文件的两倍,之所以会这样,是因为本例中,MongoDB开启了journal,需要在内存里多映射一次数据文件,如果关闭journal,则vsize和mapped大致相当。 

如果想验证这一点,可以在开启或关闭journal后,通过pmap命令来观察文件映射情况: 

shell> pmap $(pidof mongod) 
到底MongoDB配备多大内存合适?宽泛点来说,多多益善,如果要确切点来说,这实际取决于你的数据及索引的大小,内存如果能够装下全 

部数据加索引是最佳情况,不过很多时候,数据都会比内存大,比如本文所涉及的MongoDB实例: 

mongo> db.stats(){    "dataSize" : 1004862191980,    "indexSize" : 1335929664} 
本例中索引只有1G多,内存完全能装下,而数据文件则达到了1T,估计很难找到这么大内存,此时保证内存能装下热数据即可,至于热数 

据是多少,取决于具体的应用。如此一来内存大小就明确了:内存 > 索引 + 热数据,最好有点富余,毕竟操作系统本身正常运转也需要消耗一部分内存。 

分享到:
评论

相关推荐

    mongodb 对内存的严重占用以及解决方法

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

    MongoDB开发使用手册

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

    MongoDB与内存.pdf

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

    限制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...

    mongodb7.0.0安装包

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

    MongoDB限制内存批处理.bat

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

    mongodb使用文档集

    MongoDB 是一个流行的开源、分布式文档数据库,常用于构建高...MongoDB的学习和使用是一个持续的过程,理解其核心概念和操作方法是关键。通过实践,你可以更好地掌握这个强大的NoSQL数据库,并将其应用到实际项目中。

    windows mongodb 32位

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

    MongoDB 内存使用情况分析

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

    mongodb的安装和使用简介

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

    MongoDB安装包.zip

    - 高性能:MongoDB设计为内存驱动,通过缓存数据到内存中以提高读写速度。 - 高可用性:MongoDB支持复制集,可以创建多个数据副本以实现故障转移和读取负载均衡。 - 水平扩展:通过分片(Sharding)技术,MongoDB...

    NoSQLBooster for MongoDB

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

    mongodb Windows7 64位

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

    Spark-Mongodb是一个库允许用户利用SparkSQL读写数据至MongoDB集合

    MongoDB是一款流行的NoSQL数据库,以其灵活性、高性能和丰富的文档支持而闻名,而Spark作为大数据处理框架,以其高效的内存计算和强大的SQL支持备受青睐。Spark-MongoDB库将这两者完美结合,实现了在Spark上对...

    MongoDB开发使用手册.pdf

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

    MongoDB Days 2015 深圳 PPT 共享

    8. **性能调优**: 除了基本的查询优化,还包括内存管理、磁盘I/O优化、数据模型设计等方面的知识,这些都是确保MongoDB高效运行的重要因素。 9. **安全与认证**: MongoDB的安全特性包括用户认证、访问控制、SSL加密...

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

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

    MongoDB软件

    8. **高性能**:MongoDB采用了内存映射技术,将数据存储在内存中,大大提升了读写速度。 9. **社区支持**:MongoDB拥有活跃的开发者社区,提供了丰富的文档、教程和第三方工具,方便用户学习和使用。 10. **API...

    mongodb.zip

    7. **高性能**: MongoDB使用内存映射技术,将数据存储在内存中以实现快速读写,同时利用磁盘I/O进行持久化,确保数据安全。 8. **高可用性**: 副本集(Replica Sets)是MongoDB的一种高可用性机制,它能自动在多个...

Global site tag (gtag.js) - Google Analytics