mongdb2.6.5--FAQ之存储篇

1.mongodb内存映射文件是怎么工作的

mongodb通过内存映射文件来实现对文件的管理和操作,当需要操作文件的时候,会把需要访问的文档映射到内存。没有被映射到内存的文档是不能被访问的

2.什么是分页错误(page fault,应该理解为分页交换)

分页错误会出现在从一个文件中读取一部分数据或者写入一部分数据,但是这些数据当前不在物理内存(没有被映射到内存)。相反,操作系统的分页错误出现在物理内存被耗尽和物理内存的分页被交换到磁盘的时候。

如果有空余的内存,操作系统会查找磁盘中的页,并且直接加载到内存;然而,如果没有足够的空余内存,操作系统必须:

  • 查找内存中数据变得陈旧或者不再需要的内存页,并且把此页数据写入磁盘

  • 从磁盘找到需要加载的页,并且加载进内存

       与需要加载的数据已经在内存相比,这个过程(不用的数据写会磁盘,加载需要的数据)将会消耗较长的时间,尤其是一个比较活跃的系统(访问次数比较多)

可以通过db.serverStatus()查看出现page fault的次数,输出选项为:extra_info.page_faults

page fault的次数会在出现性能瓶颈和物理内存有限的时候出现急剧的增长;当访问大量数据的时候,page fault出现的次数也会增加,比如扫描一个完整集合;出现少量的和零星的page fault增长是正常的,不代表系统出现问题。

完成单次page fault是很快的,对系统不会有什么不好的影响;然而,出现大量的page fault,则表示从磁盘读取太多的数据。在大多数情况下,当出现page fault的时候(等待被读取的数据映射到内存),mongodb将会释放读锁,以避免阻塞其它进程读取数据。这种设计可以提高并发性,同时也提高整体的吞吐率,尤其在高容量系统。

增大内存(RAM)的大小,将会有利于减少page Faults的出现。如果不能增加单台机器的内存,则应该考虑用分片的机制来分布式部署数据,从而提高性能。

3.软分页错误与硬件分页错误的区别(soft and hard page faults)

  硬分页错误:当需要获取数据时,数据必须从磁盘加载

  软分页错误:当需要获取数据时,数据还是从内存获取,只不过是从内存的某个区域到另外一个区域,比如从操作系统文件缓存区到进程空间;

 在生产环境中,软分页错误是很少出现的

4.通过什么工具可以查看mongodb的存储使用情况

 可以通过db.stats()查看,输出的几个数据项

 datasize:数据的大小(包括填补空间(padding)),如果db.stats(1024)表示以M为单位显示,如果没指定则为字节

 storageSize:为集合文档分配的存储空间,单位与datasize一致,当remove文档或者压缩(shrink)文档的时候,这个值不会减少

 fileSize:数据库的数据文件大小,这个值包含预先分配的空间和填补(padding)空间

备注:padding空间,即:为了避免修改文档的时候,文档的移动,创建文档的存储空间的时候会多分配一些,这样在修改文档的时候就不涉及到文档的移动

5.工作区/集是什么(what is the working set)

工作集代表应用在正常运行过程中所使用到的全部数据(total body of data)。

6.为什么在数据目录中的文件大小大于数据库中的数据大小

   在数据目录中的数据文件大小(比如:默认下是在/data/db下)可能会比插入数据库中的数据集大,可能是由于下面的原因导致的:

  • 预先分配数据文件

    • 在数据目录中,mongodb会提前分配一定大小的数据文件,通过这种方式避免文件系统碎片。数据库的第一个文件命名为<databasename>.0,下一个数据文件为<databasename>.1,依次类推;

    • 第一个文件的大小是64M,下一个是128M,依次为2的幂次方,一直到2G,然后以后的文件每个都是2G了。这些数据文件被分配了空间,但是却没有数据。mongod可能会分配1g数据文件,但是90%的空间是空的

    • 对于大多数比较大的数据库来说,没有被使用的空间相对数据库的实际数据来说还是比较少的。

    • 对于像unix的操作系统来说,mongod会提前分配额外的数据文件,但是会初始化磁盘空间为0.预先分配数据文件可以避免当数据库需要分配数据文件时的延迟,即不用在需要的时候慢慢等着分配

    • 可以通过设置属性preallocDataFiles的值为false来避免预先分配。但是在生产环境中,尽量不要关闭这个属性。

  • oplog,操作日志

    • 如果当前的mongd是副本集当作的一个节点,则在数据目录下会包含oplog.rs文件,这是在本地(local)数据库中创建的一个预先分配的capped collection集合,对于64位操作系统,默认是磁盘空间的5%。通常情况下,需要重新设置这个文件大小的值,最小需要1G,最大为50G,在启动的时候可以在参数replication.oplogSizeMB配置

  • journal

    • 数据目录包含journal文件(日志文件),它把写操作持久化到磁盘,在数据被写入磁盘之前,通过这种方式可以保证数据的持久性,又能提供数据的读写性能。

  • 空记录

    • mongodb会在数据文件中维护一个空记录列表,当删除文档或者集合的时候

    • mongodb会重新利用这些空间,但是不会释放这些空间给操作系统

    • 可以使用compact命令降低分配空间的碎片率。使用这个命令的时候,需要额外大于2g的空间来运行此操作。这个compact操作只会释放碎片,但是不会释放空间给操作系统

    • 如果需要释放空间给操作系统,可以使用repairDatabase操作,这个操作也需要至少2g的额外空间来运行。当当前的磁盘空间比较低的时候,不要执行此操作

7.怎么检查集合的大小以及索引的大小

  db.collection.stats();

8.怎么知道什么时候服务器的磁盘空间不足(How do I know when the server runs out of disk space?)

   当数据文件磁盘空间不足的时候,会看到如下的日志信息:

Thu Aug 11 13:06:09 [FileAllocator] allocating new data file dbms/test.13, filling with zeroes...

Thu Aug 11 13:06:09 [FileAllocator] error failed to allocate new file: dbms/test.13 size: 2146435072 errno:28 No space left on device

Thu Aug 11 13:06:09 [FileAllocator] will try again in 10 seconds

Thu Aug 11 13:06:19 [FileAllocator] allocating new data file dbms/test.13, filling with zeroes...

Thu Aug 11 13:06:19 [FileAllocator] error failed to allocate new file: dbms/test.13 size: 2146435072 errno:28 No space left on device

Thu Aug 11 13:06:19 [FileAllocator] will try again in 10 seconds

  服务器会一直保持这种状态,会阻塞所有的写操作,包括删除。但是读取操作还可以工作

  如果磁盘空间不足是由于journal文件,则服务器进程会退出。可以单独把journal文件放在别的磁盘上

  注意:

    如果把journal文件放在单独的存储设备,则不能使用文件系统的快照工具来捕获一个有效的数据文件和journal文件的快照(此处不理解为什么不可以)

  


你可能感兴趣的:(page,faults,内存磁盘映射)