天天看點

mongodb 記憶體分析

要想了解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機器給的記憶體是否合理呢?下面給出公式:實體記憶體&gt;mongo索引資料+mongo的熱資料    

還可以通過mongostat指令來監控MongoDB的記憶體使用情況,如下所示:

<code>shell&gt; 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,如需轉載請自行聯系原作者