每一个数据库都有自己独立的文件。如果你开启了directoryperdb选项,那你每个库的文件会单独放在一个文件夹里。

数据库文件在内部会被切分成单个的块,每个块只保存一个名字空间的数据。在MongoDB中,名字空间用于区分不同的存储类别。比如每个collection有一个独立的名字空间,每个索引也有自己的名字空间。

每个数据文件会被分成一个一个的数据块,块与块之间用双向链表连接

名字空间文件中,保存的是一个hash table,保存了每个名字空间的存储信息元数据,包括其大小,块数,第一块位置,最后一块位置,被删除的块的链表以及索引信息

数据文件从16MB开始,新的数据文件比上一个文件大一倍,最大为2GB

文件使用MMAP进行内存映射,会将所有数据文件映射到内存中,但是只是虚拟内存,只有访问到这块数据时才会交换到物理内存。

但是在32位机器上,4GB内存会有1GB被内核战用,大约0.5GB会用于mongod进程的stack空间,只剩下大约2.5GB可用于映射数据文件。

缓存重建:

重启MongoDB不会导致MongoDB的缓存失效(除非重启服务器)

当你重新mount磁盘时,文件系统的缓存会失效,这和重启机器时一样,Mon需要进行缓存重建与预热。

MongoDB采用mmap来将数据文件映射到内存中,所以当MongoDB重启时,这些映射的内存并不会清掉,因为它们是由操作系统维护的(所以当操作系统重启时,MongoDB才会有相同问题)。相对于其它一些自己维护Cache的数据库,MongoDB在重启后并不需要进行缓存重建与预热。

内存映射

内存映射的原理就是让操作系统将一个文件映射到一段内存中,然后在操作这个文件内存就可以像操作内存一样。

使用内存情况:

WARNING: You are running on a NUMA machine.
We suggest launching mongod like this to avoid performance problems:
numactl --interleave=all mongod [other options]

MongoDB容量规划: 1 热数据量 2 索引量 3 连接数量(默认是一条连接10M)


这里的结论是尽量不要用ext3,用ext4或者xfs。

db.status()

storageSize  数据大小,包括预分配空间

indexSize 索引大小   

这两个加起来是数据占用空间的大小