四、测试结果
1、写操作
成功写入416万条记录,写入失败84万条记录,共耗时525秒,平均每秒写入数据7924笔。数据文件大小近4G。写入过程中,服务器内存、CPU和磁盘等资源使用情况如下图所示:
可见,内存使用呈阶梯状上升,最后占用了近3.5个G,主要用来缓存数据,对比数据文件的大小可以设想,在操作系统内存可用的情况下,内存的分配和数据文件的大小是大致相当的。CPU和磁盘IO都表现出周期性的上下波动,估计和操作系统mmap缓存数据和刷新到磁盘的实现机制有关。从图表可见本次测试的瓶颈同样出现在磁盘IO上,磁盘的使用率最后达到100%,导致无法成功写入数据。
2、读操作
成功读出500万条记录,共耗时432秒,平均每秒读出数据11574笔。
读数据过程中没有发生磁盘IO。CPU较繁忙,Idle值稳定在27左右,等待CPU资源的进程一直在5到10个之间。内存表现平稳没有波动。
五、总结
通过以上测试结果可以看出,MongoDB占用的磁盘空间很大,这是因为其占用的磁盘空间是预分配的,每次以上一个数据文件的两倍大小来预分配空间,并以0来填充,以避免在繁忙时期分配磁盘空间导致性能下降,因此我们看到的数据文件大小并不是实际占用的空间大小。另外其内存是由操作系统管理的,自身并不管理内存使用。从功能角度看MongoDB提供的查询等操作接口是最为丰富的,在面对海量数据的拆分等可扩展方面也有很好的设计思路,是一个很好的将数据模型从面向关系转向面向文档的NoSQL产品,相信将来会看到更多的线上产品选用MongoDB。