MongoDB內存管理

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

內存使用狀況

查看Linux虛擬內存管理器是否對內存作了限制,若是顯示爲unlimited表示無限制數據庫

[root@localhost bin]# ulimit -a | grep memory
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
virtual memory          (kbytes, -v) unlimited

多數操做系統缺省都是把它設置成unlimited的,若是操做系統不是,能夠這樣修改:app

[root@localhost bin]# ulimit -m unlimited
[root@localhost bin]# ulimit -v unlimited

查看當前MongoDB的鏈接數

mongo中每個鏈接都是一個線程,須要一個stack,從結果中可看到當前鏈接數爲13,最大鏈接數爲819ide

replication:PRIMARY> db.serverStatus().connections
{ "current" : 13, "available" : 806, "totalCreated" : 36 }

Linux下缺省的Stack大小查看

[root@localhost bin]# ulimit -a | grep stack
stack size              (kbytes, -s) 10240

MongoDB實際使用的Stack大小查看

[root@localhost bin]# cat /proc/$(pidof mongod)/limits | grep stack | awk -F 'size' '{print int($NF)/1024}'
10240

調整stack大小

若是Stack過大(好比:10240K)的話沒有意義,簡單對照命令結果中的Size和Rss:函數

[root@localhost bin]# cat /proc/$(pidof mongod)/smaps | grep 10240 -A 10

全部鏈接消耗的內存加起來會至關驚人,推薦把Stack設置小一點,好比說1024:操作系統

[root@localhost bin]# ulimit -s 1024

MongoDB1.8.3開始,MongoDB會在啓動時自動設置Stack。線程

釋放內存

有時候可能想釋放掉MongoDB佔用的內存,不過內存管理工做是由虛擬內存管理器控制的,但可使用MongoDB內置的closeAllDatabases命令達到目的:指針

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

監控MongoDB的內存使用狀況

replication:PRIMARY> db.serverStatus().mem
{
        "bits" : 64,
        "resident" : 6591,    # 到如今總共使用的物理內存,單位:MB
        "virtual" : 7461,    # 當前Mongodb實例使用的虛擬內存大小,單位:MB,通常狀況下比mem.map的值要大一點,若是大不少頗有可能發生內存泄露,若是使用journal,大約是2倍的map值
        "supported" : true,    # 本機是否支持內存擴展
        "mapped" : 0,    # Mongodb使全部數據都映射到內存中,因此這個值能夠當作整個數據量的值。
        "mappedWithJournal" : 0
}

Mongodb內存大小配置建議

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

replication:PRIMARY> db.stats()
{
        "db" : "mydb",    # 當前數據庫
        "collections" : 10,    # 當前數據庫多少表
        "views" : 0,    
        "objects" : 2777998,    # 當前數據庫全部表多少條數據
        "avgObjSize" : 988.7910034492465,    # 每條數據的平均大小
        "dataSize" : 2746859430,    # 全部數據的總大小
        "storageSize" : 409530368,    # 全部數據佔的磁盤大小
        "numExtents" : 0,
        "indexes" : 10,    # 索引數
        "indexSize" : 25239552,    # 索引大小
        "ok" : 1
}

當前系統內存使用狀況server

[root@localhost bin]# free -m
             total       used       free     shared    buffers     cached
Mem:         64519      11967      52551          0        248       2707
-/+ buffers/cache:       9011      55508
Swap:        32767          0      32767
總內存:64G
mongodb: 2.58G
    "dataSize" : 2746859430 => 2.56G
    "indexSize" : 25239552 => 0.02G

【參考】

相關文章
相關標籤/搜索