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
mongo中每個鏈接都是一個線程,須要一個stack,從結果中可看到當前鏈接數爲13,最大鏈接數爲819ide
replication:PRIMARY> db.serverStatus().connections { "current" : 13, "available" : 806, "totalCreated" : 36 }
[root@localhost bin]# ulimit -a | grep stack stack size (kbytes, -s) 10240
[root@localhost bin]# cat /proc/$(pidof mongod)/limits | grep stack | awk -F 'size' '{print int($NF)/1024}' 10240
若是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})
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應該分配的內存大小最好知足 內存 > 索引 + 熱數據 + 鏈接佔用內存
,經過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