天天看點

MongoDB記憶體機制

Memory Mapped Storage Engine (MMAP)是目前MongoDB唯一的存儲引擎,它使用記憶體映射檔案來避免磁盤的IO,作業系統的虛拟記憶體管理器,下面是MMAP的幾個特點:

1、由于是由os來進行記憶體的管理,是以在檔案系統記憶體和資料庫記憶體之間是沒有備援之分的。

2、MongoDB可以不經過配置自動使用os剩餘的記憶體

3、虛拟記憶體的大小和駐留記憶體的大小會顯示出MongoDB process 占用很多的記憶體,這是因為虛拟記憶體的大小是映射檔案和日志檔案的總和,常駐資料所占用的記憶體取決于系統的剩餘記憶體。

4、緩存的資料會使用LRU算法進行部厘清除。映射檔案的寫入也是由作業系統進行控制的。

可以通過db.serverStatus().mem; 檢視資料庫記憶體的使用情況;

(剛剛安裝的是以基本上沒有什麼使用率)。

使用shell>mongostat 也是可以的。

Mongodb 每個連接配接記憶體使用情況:

每個連接配接啟用一個線程,每個線程有一個具有幾MB大小的堆棧。如果某個線程已經停止使用,那麼os就會把它的堆棧剩餘的部分交換出去。

Binary footprint:

通過啟動一個新的MongoDB執行個體,在沒有任何連接配接,沒有任何資料的情況下,我們可以得到the “inherent” memory 占有率的情況。

基于以上的說明,我們有時候需要控制Mongodb占用的記憶體.(最好不要把其他服務和Mongodb放在一起).

即便MongoDB使用的是64位作業系統,也有可能遇到linux OOM的問題.大部分情況下是限制了虛拟記憶體的大小所緻. 可以通過 ulimit -a | grep 'virtual' 進行檢視:

virtual memory (kbytes, -v) unlimited 

大部分的作業系統是沒有限制的.

MongoDB連接配接數過多的話,也可能影響性能,連接配接數可以這樣查詢:

> db.serverStatus().connections{ "current" : 1, "available" : 818 }每個線程都需要一個stack,如果預設stack比較大的話,視情況減小.通過一下指令來釋放掉MongoDB占用的記憶體.db.runCommand({closeAllDatabases:1})

 參考:http://www.mongodb.org/display/DOCS/Caching

       http://www.searchdatabase.com.cn/showcontent_51990.htm

本文轉自 位鵬飛 51CTO部落格,原文連結:http://blog.51cto.com/weipengfei/980238,如需轉載請自行聯系原作者