標籤:linux mongo 記憶體 mem
要想瞭解mongo的記憶體機制就要先瞭解linux系統的記憶體分析。
第一步:先看看linux的記憶體參數都是怎麼說的
             total       used       free     shared    buffers     cachedMem:         11912       9045       2866          0         90       3406-/+ buffers/cache:       5549       6363 Swap:         2047         14       2033
total:實體記憶體總大小
used:使用了多少
free:剩餘多少
buffers:buffers是指高速緩衝區的大小,是一個空間大小的概念,運行程式常用的資料,在第一次運行
               時系統會把它們暫時緩衝在一個高速的儲存地區,以後再用時就直接從這個地區讀取資料供程
               序使用,存取這些資料的介質,因其讀寫速度比硬碟和記憶體要快得多,所以,buffers的大小對
               電腦運行速度的影響是很大的,但這些資料重啟電腦或關機後就會自動消失。
cached:cached是指緩衝的資料,是真正意義上的實在東西,例如你常用的程式,由於一些資料是這些
               程式運行經常要使用到的,系統就會把它們形成檔案,緩衝到一個特定的位置,下次你再運行
               該程式時,就會自動到緩衝的位置讀取資料供程式運行使用,儲存這些資料的地區是在電腦的
               硬碟上,理論上講讀寫速度是不變的,只是節省了尋找這些資料的時間而也,這樣也可間接地
               提高了電腦的運行效率。
Swap:當實體記憶體不夠使用的是,系統會在物理硬碟上切割一塊空間,當作記憶體使用量。
linux主機的真正可用記憶體是:真正可用記憶體=total-used-buffers-cached
系統中顯示的used是包括buffers和cached大小的,但是這兩個資料是可以被釋放的,所以真正使用了多少是:真正使用了的記憶體=used-buffers-cached
第二步:系統記憶體說的差不多了,那麼我們來看看mongo的記憶體是怎麼和系統配合的。
首先說mongo是一個比較坑但又叫人特別爽的資料庫,為什麼說坑“是因為它不釋放記憶體,你有100G的記憶體它也會給你吃滿”;為什麼說他爽“是因為它把資料放到記憶體中,所以100w的資料查詢會很快”;
那麼怎麼來判定mongo機器給的記憶體是否合理呢?下面給出公式:實體記憶體>mongo索引資料+mongo的熱資料    
還可以通過mongostat命令來監控MongoDB的記憶體使用量情況,如下所示:
shell> mongostatmapped vsize res faults 940g 1893g 21.9g 0
其中記憶體相關欄位的含義是:
mapped:映射到記憶體的資料大小
visze:佔用的虛擬記憶體大小
res:佔用的實體記憶體大小
註:如果操作不能在記憶體中完成,結果faults列的數值不會是0,視大小可能有效能問題。
在上面的結果中,vsize是mapped的兩倍,而mapped等於資料檔案的大小,所以說vsize是資料檔案的兩倍,之所以會這樣,是因為本例中,MongoDB開啟了journal,需要在記憶體裡多映射一次資料檔案,如果關閉journal,則vsize和mapped大致相當。
參考文檔:http://www.ttlsa.com/mongodb/mongodb-and-memory/
本文出自 “學習改變命運” 部落格,請務必保留此出處http://xinsir.blog.51cto.com/5038915/1960750
mongodb 記憶體分析