mongodb釋放記憶體-切換日誌

chenfeng發表於2015-12-19
由於碰到過mongodb吃掉所有閒置記憶體的情況,導致伺服器操作越來越慢。雖然對mongodb的讀操作沒有太多影響,
但是此時寫入的效能卻極劇下降(懷疑記憶體不夠引起的)。由於要收集大量的歷史檔案資料,
每次多執行緒收集到一定的程度時,寫入檔案速度越來越慢,經過多次測試發現,均與服務記憶體的使用峰值有關。
當伺服器記憶體使用率較低時,多執行緒寫入較快,當伺服器記憶體被mongodb 對映耗盡時,多執行緒寫入速度慢到慘不忍賭了,
即使是單執行緒情況這種情況表現也很明顯。雖然mongodb提供了runCommnad({closeAllDatabase:1})或關閉資料庫釋放快取。


mongo>use admin


switched to db admin


mongo>db.runCommand({closeAllDatabases:1})


但是這卻影響到了正常讀寫操作。因此給伺服器預留一定的記憶體空間成了保障快速寫入的一個方案,
當然在正常情況下不會出現如此頻率的檔案寫入操作,只是現在面對的情況特殊,是要收集大量歷史的檔案。


=====================================================================================================


平時可以透過mongo命令列來監控MongoDB的記憶體使用情況,如下所示:


mongo> db.serverStatus().mem:
{
    "resident" : 22346,
    "virtual" : 1938524,
    "mapped" : 962283
}還可以透過mongostat命令來監控MongoDB的記憶體使用情況,如下所示:


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大致相當。

==================================================================================
檢視記憶體情況最常用的是free命令:


shell> free -m
             total       used       free     shared    buffers     cached
Mem:         32101      29377       2723          0        239      25880
-/+ buffers/cache:       3258      28842
Swap:         2047          0       2047


新手看到used一欄數值偏大,free一欄數值偏小,
往往會認為記憶體要用光了。其實並非如此,之所以這樣是因為每當我們操作檔案的時候,
Linux都會盡可能的把檔案快取到記憶體裡,這樣下次訪問的時候,就可以直接從記憶體中取結果,
所以cached一欄的數值非常的大,不過不用擔心,這部分記憶體是可回收的,
作業系統的虛擬記憶體管理器會按照LRU演算法淘汰冷資料。還有一個buffers,也是可回收的,不過它是保留給塊裝置使用的。


知道了原理,我們就可以推算出系統可用的記憶體是free + buffers + cached:


shell> echo $((2723 + 239 + 25880))
28842至於系統實際使用的記憶體是used – buffers – cached:


shell> echo $((29377 - 239 - 25880))
3258

####切換日誌
use admin
db.runCommand("logRotate")

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

相關文章