菜蜂 发表于 2018-10-27 15:17:01

MongoDB内存机制

  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 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>  
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
  



页: [1]
查看完整版本: MongoDB内存机制