MongoDB 性能测试(一)

数据写入(插入)测试:数据源为文本文件,一行一条记录(record),长度约为125B,使用单线程Pymongo 的 insert_one() 方法写入,所有记录写入到相同collection(类似于数据库中的表)。


环境一(主要特征:老机器单机两块独立硬盘、新版本):

  • CPU:Intel Core Quad Q8300 (2.5GHz) with 2MB cache
  • 内存:DDR2 2×2 GB
  • 硬盘:HDD1,HDD2;
  • OS:Ubuntu 14.04
  • MongoDB:V3.2.7

从本机HDD2 读取写入装在HDD1上的MongoDB 中,

速度约为1000 records 每秒,约等于 0.1MB/sCPU 占用率100%。瓶颈在CPU(解析数据)。


环境二(主要特征:服务器CPU单机两块独立硬盘SSD老版本):

  • CPU:Intel Xeon E3-1231(3.4GHz) with 8MB cache
  • 内存:DDR3 2×8 GB
  • 硬盘:SSD1 (128GB),HDD2;
  • OS:Ubuntu 14.04
  • Mongodb:V2.4.9

从本机HDD2 读取写入装在SSD1 上的MongoDB中,

速度约为6000-8000 records 每秒,约等于1MB/s,CPU占用率100%(python 80%,MongoDB 20%)。两点说明如下:

  1. 改环境测试时间较长,到记录8710万条记录,插入速度没有下降。
  2. 五个线程(一个生产者读取记录,四个消费者写入记录)速度下降为5500 records 每秒(0.6MB/s),印证了collection 全局锁。

环境三(主要特征:网络双机器老版本):

  • 服务器配置为环境二服务器
  • 客户端CPU:Intel i7-4790K 4GHz
  • 客户端内存:DDR3 2×8 GB
  • 客户端硬盘:HDD
  • 客户端OS:Ubuntu 14.04
  • MongoDB:V3.2.7

从客户端HDD 中读取数据写入到服务器SSD 中的MongoDB 中,

速度为1500-2000 records 每秒,客户端CPU占用率20%,瓶颈可能在网络协议。

同样是用一个线程读取数据,多线程写入数据时,速度有所提升(因为网络得到更好使用)。但当线程数增加到8个以上时,速度变化不大,速度稳定在6100 records 每秒(0.63MB/s)。此时,服务器MongoDB 是瓶颈,MongoDB服务器CPU 使用率37%左右。


环境四(环境二和环境三换批量插入

硬件环境与环境二、环境三相同,为支持批量插入数据(bulk),使用新版本(V2.6 以上)。批量每次插入10000条数据(1.3MB)

环境三单线程可以达到15000 records 每秒(TCP/IP网络还是对长报文比较友好,短报文只能用多线程来堆了,后经测试,四线程也只能达到18000 records 每秒)

环境二单线程可以达到30000 records 每秒(4MB/s)

插入速度较慢,SSD 换成HDD 变化不大,可能查询有差别。

insert