Memory Mapped Storage Engine (MMAP)是目前MongoDB唯一的存储引擎,它使用内存映射文件来避免磁盘的IO,操作系统的虚拟内存管理器,下面是MMAP的几个特点:
1、由于是由os来进行内存的管理,所以在文件系统内存和数据库内存之间是没有冗余之分的。
2、MongoDB可以不经过配置自动使用os剩余的内存
3、虚拟内存的大小和驻留内存的大小会显示出MongoDB process 占用很多的内存,这是因为虚拟内存的大小是映射文件和日志文件的总和,常驻数据所占用的内存取决于系统的剩余内存。
4、缓存的数据会使用LRU算法进行部分清除。映射文件的写入也是由操作系统进行控制的。

可以通过db.serverStatus().mem; 查看数据库内存的使用情况;

 db.serverStatus().mem;
{
"bits" : 32,
"resident" : 23,
"virtual" : 107,
"supported" : true,
"mapped" : 0
}

(刚刚安装的所以基本上没有什么使用率)。
使用shell>mongostat 也是可以的。

Sun Sep 2 21:55:59 [initandlisten] connection accepted from 127.0.0.1:54693 #3 (1 connection now open)
insert query update delete getmore command flushes mapped vsize res faults locked db idx miss % qr|qw ar|aw netIn netOut conn time
0 0 0 0 0 1 0 0m 107m 23m 0 local:0.0% 0 0|0 0|0 62b 1k 1 21:56:00
0 0 0 0 0 1 0 0m 107m 23m 0 local:0.0% 0 0|0 0|0 62b 1k 1 21:56:01

Mongodb 每个连接内存使用情况:
每个连接启用一个线程,每个线程有一个具有几MB大小的堆栈。如果某个线程已经停止使用,那么os就会把它的堆栈剩余的部分交换出去。
Binary footprint:
通过启动一个新的MongoDB实例,在没有任何连接,没有任何数据的情况下,我们可以得到the “inherent” memory 占有率的情况。

基于以上的说明,我们有时候需要控制Mongodb占用的内存.(最好不要把其他服务和Mongodb放在一起).
即便MongoDB使用的是64位操作系统,也有可能遇到linux OOM的问题.大部分情况下是限制了虚拟内存的大小所致. 可以通过 ulimit -a | grep 'virtual' 进行查看:
virtual memory (kbytes, -v) unlimited
大部分的操作系统是没有限制的.
MongoDB连接数过多的话,也可能影响性能,连接数可以这样查询:
> db.serverStatus().connections{ "current" : 1, "available" : 818 }每个线程都需要一个stack,如果默认stack比较大的话,视情况减小.通过一下命令来释放掉MongoDB占用的内存.db.runCommand({closeAllDatabases:1})

 参考:http://www.mongodb.org/display/DOCS/Caching

       http://www.searchdatabase.com.cn/showcontent_51990.htm