2.2 MongoDB资源消耗
考虑到性能的原因,mongo做了很多预分配,包括提前在文件系统中为每个数据库分配逐渐增长大小的文件集。这样可以有效地避免潜在的文件系统碎片,使数据库操作更高效。
一个数据库的文件集从序号0开始分配,0,1...,大小依次是64M,128M,256M,直到2G。一旦文件大小达到2G,之后的文件大小都保持为2G。所以如果上一个文件是1G,而数据量刚好超过1G,则下一个文件(大小为2G)则可能有超过90%都是空的。如“ls -lh”输出为:
-rw------- 1 root root 64M 2010-04-08 12:27 blog.0
-rw------- 1 root root 128M 2010-04-08 12:27 blog.1
-rw------- 1 root root 256M 2010-04-08 12:33 blog.2
-rw------- 1 root root 512M 2010-04-08 10:38 blog.3
-rw------- 1 root root 16M 2010-04-08 12:33 blog.ns
在这里显示的最新文件“blog.3”没满,第二新的文件“blog.2”也没满,因为当前写的正是文件“blog.2”,从而可以知道数据库中数据的大小至少是64M + 128M + 1 byte。对于一个大的数据库来说这也不算浪费,因为最大的文件大小是2G,所以你最多只会浪费2G。
如果你想使你的磁盘利用更有效率,下面是一些解决方法:
1. 只建立一个数据库。这样你最多只会浪费2G。
2. 每个文档使用自建的“_id”值而不要使用默认的ObjectId对象。
3. 由于每个document的每个字段名都会存放,所以如果字段名越长,document的数据占用就会越大,因此把字段名缩短会大大降低数据的占用量。如把“timeAdded”改为“tA”。
Mongo使用内存映射文件来访问数据,这样在用top观察mongod进程的内存占用时会发现量很大,不用担心这个,当使用内存映射文件时是正常的。并且映射数据的大小只出现在虚拟内存那一列,常驻内存量才反应出有多少数据cached在内存中。
按照mongodb官方的说法,mongodb完全由系统内核进行内存管理,会尽可能的占用系统空闲内存,用free可以看到,大部分内存都是作为io cache被占用的,而这部分内存是可以释放出来给应用使用的。根据网上实际生产环境的运行情况介绍,也确实是这样,8G内存被完全用掉,但是始终还没有使用swap空间,所以mongodb的内存问题应该不用担心。