mongo記憶體筆記

G8bao7發表於2015-11-03


記憶體分配策略:
記憶體 > 索引 + 熱資料 + 連線數*Stack(ulimit -a | grep stack ),另外,作業系統本身正常運轉也需要消耗一部分記憶體

虛擬記憶體大小限制
# 檢視
shell> ulimit -a | grep 'virtual'

# 關閉,避免OOM
shell> ulimit -v unlimited

連線佔用記憶體
# 檢視當前連線數
mongo> db.serverStatus().connections
每個連線預設分配記憶體為Stack
    # 檢視Linux下預設的Stack
    shell> ulimit -a | grep stack 
   
stack size              (kbytes, -s) 10240
    # 設定Stack
   
# 注:ulimit的使用是有上下文的,最好放在MongoDB的啟動指令碼里。
    shell> ulimit -s 1024

檢視資料、索引大小
mongo> db.stats() 

"dataSize" : 1004862191980, 
"indexSize" : 1335929664 
}

記憶體釋放
重啟服務
內建closeAllDatabases命令
mongo> use admin 
mongo> db.runCommand({closeAllDatabases:1})
調整核心引數drop_caches
shell> sysctl -w vm.drop_caches=1


記憶體監控使用情況
mongo命令列
mongo> db.serverStatus().mem: 
"resident" : 22346, 
"virtual" : 1938524, 
"mapped" : 962283 
}

mongostat命令
shell> mongostat 
mapped  vsize    res faults 
 940g  1893g  21.9g      0


其中記憶體相關欄位的含義是:
mapped:對映到記憶體的資料大小
visze:佔用的虛擬記憶體大小
res:佔用的實體記憶體大小 
注:如果操作不能在記憶體中完成,結果faults列的數值不會是0,視大小可能有效能問題。
在上面的結果中,vsize是mapped的兩倍,而mapped等於資料檔案的大小,所以說vsize是資料檔案的兩倍
之所以會這樣,是因為本例中,MongoDB開啟了journal,需要在記憶體裡多對映一次資料檔案,
如果關閉journal,則vsize和mapped大致相當。
如果想驗證這一點,可以在開啟或關閉journal後,透過pmap命令來觀察檔案對映情況:
shell> pmap $(pidof mongod)


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

相關文章