天天看点

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,如需转载请自行联系原作者