`
haoningabc
  • 浏览: 1476641 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

(转)mongo的内存(牛A文章)

 
阅读更多
转http://blog.nosqlfan.com/html/2865.html
MongoDB与内存
作者:nosqlfan on 星期五, 八月 19, 2011 · 评论本文 
本文转载自火丁笔记,文章对Linux的虚拟内存管理机制做了简单介绍,对MongoDB的MMAP的内存映射机制做了描述,后面也说到了一些MongoDB内存使用上的监控和优化。是一篇MongoDB内存使用机制描述很清楚的文章。
原文链接:huoding.com
但凡初次接触MongoDB的人,无不惊讶于它对内存的贪得无厌,至于个中缘由,我先讲讲Linux是如何管理内存的,再说说MongoDB是如何使用内存的,答案自然就清楚了。
据说带着问题学习更有效,那就先看一个MongoDB服务器的top命令结果:
shell> top -p $(pidof mongod)
Mem:  32872124k total, 30065320k used,  2806804k free,   245020k buffers
Swap:  2097144k total,      100k used,  2097044k free, 26482048k cached

 VIRT  RES  SHR %MEM
1892g  21g  21g 69.6
这台MongoDB服务器有没有性能问题?大家可以一边思考一边继续阅读。
先讲讲Linux是如何管理内存的
在Linux里(别的系统也差不多),内存有物理内存和虚拟内存之说,物理内存是什么自然无需解释,虚拟内存实际是物理内存的抽象,多数情况下,出于方便性的考虑,程序访问的都是虚拟内存地址,然后操作系统会把它翻译成物理内存地址。
很多人会把虚拟内存和Swap混为一谈,实际上Swap只是虚拟内存引申出的一种技术而已:操作系统一旦物理内存不足,为了腾出内存空间存放新内容,就会把当前物理内存中的内容放到交换分区里,稍后用到的时候再取回来,需要注意的是,Swap的使用可能会带来性能问题,偶尔为之无需紧张,糟糕的是物理内存和交换分区频繁的发生数据交换,这被称之为Swap颠簸,一旦发生这种情况,先要明确是什么原因造成的,如果是内存不足就好办了,加内存就可以解决,不过有的时候即使内存充足也可能会出现这种问题,比如MySQL就有可能出现这样的情况,解决方法是限制使用Swap:
shell> sysctl -w vm.swappiness=0
查看内存情况最常用的是free命令:
shell> free -m
             total       used       free     shared    buffers     cached
Mem:         32101      29377       2723          0        239      25880
-/+ buffers/cache:       3258      28842
Swap:         2047          0       2047
新手看到used一栏数值偏大,free一栏数值偏小,往往会认为内存要用光了。其实并非如此,之所以这样是因为每当我们操作文件的时候,Linux都会尽可能的把文件缓存到内存里,这样下次访问的时候,就可以直接从内存中取结果,所以cached一栏的数值非常的大,不过不用担心,这部分内存是可回收的,操作系统会按照LRU算法淘汰冷数据。除了cached,还有一个buffers,它和cached类似,也是可回收的,不过它的侧重点在于缓解不同设备的操作速度不一致造成的阻塞,这里就不多做解释了。
知道了原理,我们就可以推算出系统可用的内存是free + buffers + cached:
shell> echo "2723 + 239 + 25880" | bc -l
28842
至于系统实际使用的内存是used – buffers – cached:
shell> echo "29377 - 239 - 25880" | bc -l
3258
除了free命令,还可以使用sar命令:
shell> sar -r
kbmemfree kbmemused  %memused kbbuffers  kbcached
  3224392  29647732     90.19    246116  26070160
  3116324  29755800     90.52    245992  26157372
  2959520  29912604     91.00    245556  26316396
  2792248  30079876     91.51    245680  26485672
  2718260  30153864     91.73    245684  26563540

shell> sar -W
pswpin/s pswpout/s
    0.00      0.00
    0.00      0.00
    0.00      0.00
    0.00      0.00
    0.00      0.00
希望你没有被%memused吓到,如果不幸言中,请参考free命令的解释。
再说说MongoDB是如何使用内存的
目前,MongoDB使用的是内存映射存储引擎,它会把磁盘IO操作转换成内存操作,如果是读操作,内存中的数据起到缓存的作用,如果是写操作,内存还可以把随机的写操作转换成顺序的写操作,总之可以大幅度提升性能。MongoDB并不干涉内存管理工作,而是把这些工作留给操作系统的虚拟缓存管理器去处理,这样的好处是简化了MongoDB的工作,但坏处是你没有方法很方便的控制MongoDB占多大内存,事实上MongoDB会占用所有能用的内存,所以最好不要把别的服务和MongoDB放一起。
有时候,即便MongoDB使用的是64位操作系统,也可能会遭遇臭名昭著的OOM问题,出现这种情况,多半是因为限制了虚拟内存的大小所致,可以这样查看当前值:
shell> ulimit -a | grep 'virtual'
多数操作系统缺省都是把它设置成unlimited的,如果你的操作系统不是,可以这样修改:
shell> ulimit -v unlimited
不过要注意的是,ulimit的使用是有上下文的,最好放在MongoDB的启动脚本里。
有时候,出于某些原因,你可能想释放掉MongoDB占用的内存,不过前面说了,内存管理工作是由虚拟内存管理器控制的,所以通常你只能通过重启服务来释放内存,你一定不齿于这样的方法,幸好可以使用MongoDB内置的closeAllDatabases命令达到目的:
mongo> use admin
mongo> 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> mongostat
mapped  vsize    res faults
  940g  1893g  21.9g      0
  940g  1893g  21.9g      0
  940g  1893g  21.9g      0
  940g  1893g  21.9g      0
  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与内存的话题,大家还可以参考官方文档中的相关介绍。
分享到:
评论

相关推荐

    mysql转mongo工具

    mysql转mongo工具,可以转移整个数据库,或是单张表

    阿里mongo同步工具mongo-shake

    阿里mongo同步工具mongo-shake正是为了解决这些问题而设计的。 Mongo-shake 是阿里巴巴开发的一款高效、稳定且易于使用的MongoDB数据迁移工具,主要用于实现MongoDB集群之间的数据同步。它支持全量数据迁移和增量...

    mongo.tar 镜像

    mongo docker 镜像

    MongoVUE-Installer

    5. 性能监控:通过MongoVUE,用户可以实时监控MongoDB服务器的性能指标,如内存使用、磁盘I/O、网络吞吐量等,以便进行性能调优。 6. 用户管理:MongoVUE允许用户管理MongoDB的用户账户和角色,实现数据库的安全...

    MongoVUE1.6.9破解

    mongoVUE.1.6.9.破解文件,解压后覆盖安装目录中的MongoVUE.exe文件 安装文件下载地址:http://www.mongovue.com/downloads/

    MongoVUE绿色版

    MongoVUE是一款专为Windows操作系统设计的MongoDB客户端工具,旨在提供一个直观且功能丰富的图形用户界面(GUI),使得数据库的管理和操作更为便捷。MongoDB是一种流行的开源、文档型的NoSQL数据库系统,广泛应用于...

    MongoVUE.zip

    MongoVUE

    mongovue-installer

    8. 实时监控:MongoVUE提供实时的性能监控,包括CPU使用率、内存消耗、网络I/O等关键指标,帮助管理员及时发现并解决问题。 9. 用户友好:MongoVUE的界面设计简洁易用,符合Windows用户的操作习惯,降低了数据库...

    MongoVUE,MongoDB客户端

    8. **性能监控**:MongoVUE可以显示MongoDB服务器的运行状态,如CPU使用率、内存占用、连接数等,帮助用户监控数据库的性能和健康状况。 9. **版本兼容性**:MongoVUE通常会保持与最新MongoDB版本的兼容性,确保...

    bugu-mongo

    2. 性能提升:通过对内部操作的优化,1.12版本的Bugu-Mongo在读写速度上有所提升,同时降低了内存消耗,使得大规模数据处理更加流畅。 3. 错误处理:新的错误处理机制能够提供更详细的错误信息,帮助开发者快速定位...

    Mongo学习文档参考手册

    .Mongo 学习文档参考手册 Mongo 是一个高性能、开源、无模式的文档型数据库,它在许多场景下可用于替代传统的关系型数据库或键/值存储方式。Mongo 使用 C++ 开发,提供了以下功能: 1. 面向集合的存储:适合存储...

    delphi for mongo driver

    MongoDB Delphi驱动程序,简称为"mongo-delphi-driver",是专为Delphi编程语言设计的接口,使得开发者可以轻松地在Delphi应用程序中集成MongoDB的功能。这个驱动程序允许开发者通过Delphi的代码直接创建、查询、更新...

    mongo集群说明文档

    《mongo集群部署》这篇文章所需要的配置文件以及mongo压缩包和说明文档

    mongovue 1.5.3 破解版

    安装后将mongovue.exe替换系统安装的mongovue.exe就能免费使用mongovue所有功能。

    mongo 驱动包

    mongo

    springMvc配置mongo数据库

    <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate"> <constructor-arg name="mongo" ref="mongo" /> ``` 有了MongoTemplate,我们就可以在服务类或DAO类中注入并使用它来...

    mongo_plugin.zip

    "mongo_plugin.zip"这个压缩包就是为了解决这个问题,它包含了三个不同版本的MongoDB插件:0.12.0、0.12.1和0.12.2,即mongo4idea。 Mongo4idea是专为PyCharm设计的MongoDB数据库管理插件,它允许用户在PyCharm的...

    springboot整合mongo自定义Converter 实现字符串和Date类型互转 并且查询陈宫

    使用自定义了时间和字符串的转换规则 存的时候 存字符串 读取的时候 转换为日期类型 但是在按时间查找的时候 也可以使用 下载后 直接运行 Test类 修改下MongodbConfiguration的mongoUrl 写的时候将时间转为字符串 ...

    Mongo 3T带破解码

    Mongo数据库连接工具,带破解批处理文件.3T支持的mongo功能很多

    robomongo+Mongovue

    6. **监控工具**:提供性能监控功能,如CPU使用率、内存占用等。 尽管这两个工具都为MongoDB的管理带来了便利,但值得注意的是,Mongovue已经停止开发,可能无法支持最新的MongoDB版本和特性。而RoboMongo(现为...

Global site tag (gtag.js) - Google Analytics