要想了解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/