Mongodb記憶體管理和使用情況情況查詢

chenfeng發表於2015-12-19

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
}

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15498/viewspace-1875026/,如需轉載,請註明出處,否則將追究法律責任。

相關文章