要想了解mongo的記憶體機制就要先了解linux系統的記憶體分析。
第一步:先看看linux的記憶體參數都是怎麼說的
1
2
3
4
<code> </code><code>total used </code><code>free</code> <code>shared buffers cached</code>
<code>Mem: 11912 9045 2866 0 90 3406</code>
<code>-/+ buffers</code><code>/cache</code><code>: 5549 6363 </code>
<code>Swap: 2047 14 2033</code>
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的記憶體使用情況,如下所示:
<code>shell> mongostat</code>
<code>mapped vsize res faults</code>
<code> </code><code>940g 1893g 21.9g 0</code>
其中記憶體相關字段的含義是:
mapped:映射到記憶體的資料大小
visze:占用的虛拟記憶體大小
res:占用的實體記憶體大小
注:如果操作不能在記憶體中完成,結果faults列的數值不會是0,視大小可能有性能問題。
在上面的結果中,vsize是mapped的兩倍,而mapped等于資料檔案的大小,是以說vsize是資料檔案的兩倍,之是以會這樣,是因為本例中,MongoDB開啟了journal,需要在記憶體裡多映射一次資料檔案,如果關閉journal,則vsize和mapped大緻相當。
本文轉自 xinsir999 51CTO部落格,原文連結:http://blog.51cto.com/xinsir/1960750,如需轉載請自行聯系原作者