Mongodb--內存管理MMAP

     MongoDB使用的是內存映射存儲引擎,即Memory Mapped Storage Engine,簡稱MMAP。mongodb

    MMAP能夠把磁盤文件的一部分或所有內容直接映射到內存,這樣文件中的信息位置就會在內存中有對應的地址空間,這時對文件的讀寫能夠直接用指針來作,而不須要read/write函數了,但這並不表明將文件map到物理內存,只有訪問到這塊數據時纔會被操做系統以Page的方式換到物理內存。MongoDB將內存管理工做交給操做系統的虛擬內存管理器來完成,這樣就大大簡化了MongoDB的工做,同時操做系統會將數據刷新保存到磁盤上。數據庫

  

  其實,從數據存儲原理來看,我更傾向於將mongodb歸類爲硬盤數據庫,可是使用了mmap做爲加速的手段而已。vim

       MongoDB應該分配的內存大小最好知足內存大小>索引+熱數據+鏈接佔用內存,經過db.stats()命令可查看到當前數據庫的索引大小狀況
     db.stats()緩存

      下面是公司的MongoDB存儲了14億數據,佔1.4T存儲空間app

複製代碼
shard1:SECONDARY> db.stats()
{
    "db" : "database",            // 當前使用的數據庫 
    "collections" : 662,             // 多少張表 
    "objects" : 1405948982,         // 全部表的多少條數據      -- 14.05億
    "avgObjSize" : 1134.649427176014,    // 平均每條數據大小       
    "dataSize" : 1595259207065,      // 總數據大小         -- 1.485TB
    "storageSize" : 768647647232,     // 全部數據佔磁盤的大小    -- 715.85G
    "numExtents" : 0,
    "indexes" : 1098,            // 索引數量
    "indexSize" : 173431967744,      // 索引大小          -- 160G
    "ok" : 1
}
複製代碼

 

 

二、 修改MongoDB使用的內存大小ide

  從3.4版本開始,默認狀況下,WieldGigd內部緩存將使用下面2種中更大的一種:50% of (RAM - 1 GB) 和256 MB。經過文件系統緩存,MongoDB的自動使用未被wiredtiger緩存或由其餘進程使用全部可用內存。調整WiredTiger內部緩存的方法:    storage.wiredTiger.engineConfig.cacheSizeGB 和 --wiredTigerCacheSizeGB    函數

  看來不設置的話,默認會使用50% of (RAM - 1 GB)的內存。因而在配置文件設置了storage.wiredTiger.engineConfig.cacheSizeGB爲0.5,也就是500M,再看測試結果:測試

  vim /etc/mongod.confspa

storage:
dbPath: /var/lib/mongodb
journal:
enabled: true
# engine:
# mmapv1:
wiredTiger:
engineConfig:
cacheSizeGB: 0.5

能夠看到,MongoDB所佔的物理內存穩定在了630M左右,說明設置確實生效了。

操作系統

 

 

三、內存使用狀況
查看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     cachedMem:      65921032   65262376     658656          0     274264   61742808-/+ buffers/cache:    3245304   62675728Swap:    100663288      11884  100651404

相關文章
相關標籤/搜索