mongodb 內存分析
要想了解mongo的內存機制就要先了解linux系統的內存分析。
第一步:先看看linux的內存參數都是怎麽說的
total used free shared buffers cached Mem: 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> mongostat mapped 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 內存分析