zoukankan      html  css  js  c++  java
  • Mongodb内存管理和使用情况查询

    overview

         MongoDB使用的是内存映射存储引擎,即Memory Mapped Storage Engine,简称MMAP。MMAP可以把磁盘文件的一部分或全部内容直接映射到内存,这样文件中的信息位置就会在内存中有对应的地址空间,这时对文件的读写可以直接用指针来做,而不需要read/write函数了,但这并不代表将文件map到物理内存,只有访问到这块数据时才会被操作系统以Page的方式换到物理内存。mongodb将内存管理工作交给操作系统的虚拟内存管理器来完成,这样就大大简化了MongoDB的工作,同时操作系统会将数据刷新保存到磁盘上,下图就是MMAP的简要工作原理图







    内存使用情况

    查看Linux虚拟内存管理器是否对内存做了限制,如果显示为unlimited表示无限制

    [jiangjianjian@f1-mongo1 ~]$  ulimit -a | grep memory 
    max locked memory       (kbytes, -l) 64
    max memory size         (kbytes, -m) unlimited
    virtual memory          (kbytes, -v) unlimited

    修改虚拟内存限制

    [jiangjianjian@f1-mongo1 ~]$ ulimit -m unlimited
    [jiangjianjian@f1-mongo1 ~]$ ulimit -v unlimited

    查看当前MongoDB的连接数

    mongo中每一个连接都是一个线程,需要一个stack,从结果中可看到当前连接数为2372,最大连接数为51200
    bj1-farm1:PRIMARY> db.serverStatus().connections
    {
    "current" : 2372,
    "available" : 48828,
    "totalCreated" : NumberLong(185449264)
    }

    Linux下缺省的Stack大小查看 

    [jiangjianjian@f1-mongo1 ~]$ ulimit -a | grep stack
    stack size              (kbytes, -s) 10240

    MongoDB实际使用的Stack大小查看

    可以用如下命令确认(单位:K)
    [root@f1-mongo1 journal]# cat /proc/$(pidof mongod)/limits | grep stack | awk -F 'size' '{print int($NF)/1024}' 
    10240 

    调整stack大小的方法

    如果Stack过大,比如上述的10240K,我们可以通过以下命令调整stack大小
    [root@f1-mongo1 journal]#  ulimit -s 1024

    MongoDB释放内存的命令

    mongo> use admin
    mongo> db.runCommand({closeAllDatabases:1}) 
     

    Mongodb自带命令查看其内存使用情况

    其中resident代表物理内存使用情况,单位为M;而virtual为虚拟内存使用情况,mapped是映射到内存的数据大小。这里虚拟内存是mapped的两倍,是因为我们开启了Journal日志,需要在内存中多映射一次,大概就是它的两倍了。如果关闭Journal日志,虚拟内存大小将和mapped大小相当。
    bj1-farm1:PRIMARY> db.serverStatus().mem
    {
    "bits" : 64,
    "resident" : 46662,
    "virtual" : 326198,
    "supported" : true,
    "mapped" : 161399,
    "mappedWithJournal" : 322798
    }

    top命令查看

    这里还可以通过top命令观察mongodb的内存使用情况,如下图,可看到其中的VIRT和RES与上述命令的结果一样
      PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                    
    12603 mongod    20   0  318g  45g  44g S 28.0 72.1  27230:21 mongod 

    free命令查看

    而再通过free命令可查看到内存占用中有多少是因为数据缓存和cache,关于如何查看free命令,参见http://blog.csdn.net/cug_jiang126com/article/details/42266653
    [jiangjianjian@f1-mongo1 ~]$ free
                 total       used       free     shared    buffers     cached
    Mem:      65921032   65262376     658656          0     274264   61742808
    -/+ buffers/cache:    3245304   62675728
    Swap:    100663288      11884  100651404

    Mongodb内存大小配置建议

    MongoDB应该分配的内存大小最好满足内存大小>索引+热数据+连接占用内存,通过db.stats()命令可查看到当前数据库的索引大小情况
    bj1-farm1:PRIMARY> db.stats()
    {
    "db" : "yc_driver",                  //当前数据库
    "collections" : 5,                   //当前数据库多少表
    "objects" : 2911281,                //当前数据库所有表多少条数据 
    "avgObjSize" : 240.28991086741541,  //每条数据的平均大小
    "dataSize" : 699551452,            //所有数据的总大小
    "storageSize" : 858513408,          //所有数据占的磁盘大小
    "numExtents" : 21,                 
    "indexes" : 5,                     //索引数
    "indexSize" : 569229472,          //索引大小
    "fileSize" : 2080374784,         //预分配给数据库的文件大小
    "nsSizeMB" : 16,
    "dataFileVersion" : {
    "major" : 4,
    "minor" : 5
    },
    "extentFreeList" : {
    "num" : 0,
    "totalSize" : 0
    },
    "ok" : 1
    }

  • 相关阅读:
    表单全选,不选和反选
    利用js改变宽,高等属性
    点击显示与隐藏
    改变div的不同属性
    给三个不同的div变色
    经典排序算法实现
    基本排序算法的实现
    排序的概念及分类实现
    #和##运算符实例
    #pragma预处理实例
  • 原文地址:https://www.cnblogs.com/ytxiao/p/11995737.html
Copyright © 2011-2022 走看看