* 解压缩
* 进入到ycsb目录并运行(本地要有一个Mongo数据库在 27017端口上):
./bin/ycsb run mongodb -P workloads/workloada
* 如果YCSB可以运行则表明安装成功
你也可以用Git把源文件拉下来自己编译。需要JDK和Maven工具。Github地址是:https://github.com/achille/YCSB 可以参考这个页面进行编译安装YCSB: https://github.com/achille/YCSB/tree/master/mongodb
YCSB场景文件
使用YCSB测试不同场景只需要提供不同的场景文件就可以。YCSB会按照你的场景文件的属性而自动生成响应的客户端请求。在我们这次测试里我们会使用到几种场景:
场景S1: 100%插入。用来加载测试数据
场景S2: 写多读少 90% 更新 10%读
场景S3: 混合读写 65%读, 25% 插入, 10% 更新
场景S4: 读多写少 90% 读, 10% 插入、更新
场景S5: 100%读
如下是其中场景文件S2的内容:
recordcount=5000000
operationcount=100000000
workload=com.yahoo.ycsb.workloads.CoreWorkload
readallfields=true
readproportion=0.1
updateproportion=0.9
scanproportion=0
insertproportion=0
requestdistribution=uniform
insertorder=hashed
fieldlength=250
fieldcount=8
mongodb.url=mongodb://192.168.1.2:27017
mongodb.writeConcern=acknowledged
threadcount=32
一些说明:
* 测试数据包括500万个文档(recordcount)
* 每个文档大小大约2KB(fieldlength x fieldcount)。数据总共大小是10G+600M的索引
* MongoDB数据库的url是192.168.1.2:27017
* MongoDB的写安全设置(mongodb.writeConcern)是acknowledged
* 线程数是32(threadcount)
* 插入文档的顺序:哈希/随机 (insertorder)
* 更新操作: 90% (0.9)
* 读操作: 10% (0.1)
下载所有场景文件(S1 – S5)(见上面的Linux公社下载地址) 并解压到上面创建的ycsb目录下面:
MongoDB配置
本次测试是在AWS的虚拟主机上进行测试的。以下是服务器配置情况:
* OS: Amazon Linux (和CentOS基本类似)
* CPU: 8 vCPU
* RAM: 30G
* Storage: 160G SSD
* Journal: 25G EBS with 1000 PIOPS
* Log: 10G EBS with 250 IOPS
*
* MongoDB: 2.6.0
* Readahead:32
几点说明:
MongoDB的数据,恢复日志(journal)以及系统日志(log)分别用了3个不同的存储盘。这是一个常见的优化方式,以保证写日志的操作不会影响到数据的刷盘IO。另外服务器的readahead设置改到了推荐的32。关于readahead等可以参见:
单机基准测试
在我们测试使用微分片性能之前我们首先需要得出单机的最高性能。启动目标MongoDB服务器,登录上去后先删除ycsb数据库(如果已经存在)
# mongo
> use ycsb
> db.dropDatabase()
场景S1: 数据插入
接下来开始运行YCSB。进到ycsb目录下,运行以下命令(确认当前目录下已经有场景文件S1, S2, S3, S4,S5)
./bin/ycsb load mongodb -P S1 -s
如果运行正常,你会看到每隔10秒YCSB打印一下当前状态,包括每秒的并发率以及平均响应时间。 如:
Loading workload…
Starting test.
0 sec: 0 operations;
mongo connection created with localhost:27017/ycsb
10 sec: 67169 operations; 7002.16 current ops/sec; [INSERT AverageLatency(us)=4546.87]
20 sec: 151295 operations; 7909.24 current ops/sec; [INSERT AverageLatency(us)=3920.9]
30 sec: 223663 operations; 7235.35 current ops/sec; [INSERT AverageLatency(us)=4422.63]
在运行的同时你可以用mongostat(或者更好的选择:MMS)来监控MongoDB的实时指标,看是否和YCSB的报告大体一致。
运行结束后可以看到类似于如下输出:
[OVERALL], RunTime(ms), 687134.0
[OVERALL], Throughput(ops/sec), 7295.168457372555
…
[INSERT], Operations, 5000000
[INSERT], AverageLatency(us), 4509.1105768
[INSERT], MinLatency(us), 126
[INSERT], MaxLatency(us), 3738063
[INSERT], 95thPercentileLatency(ms), 10
[INSERT], 99thPercentileLatency(ms), 37
[INSERT], Return=0, 5000000
…