使用ycsb对mongo单实例做性能测试

Posted 雅冰石

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用ycsb对mongo单实例做性能测试相关的知识,希望对你有一定的参考价值。

本文详细演示在16G,4核cpu配置下用ycsb(版本0.17)对mongo(版本4.0.10)单实例进行性能测试。

测试表数据量:一千万条数据

一 安装ycsb

安装包下载地址:

https://github.com/brianfrankcooper/YCSB/releases/download/0.17.0/ycsb-0.17.0.tar.gz

tar xfvz ycsb-0.17.0.tar.gz

cd ycsb-0.17.0

二 使用ycsb对mongo做性能测试

2.1 选择合适的workload

CoreWorkload 是与 YCSB 一起分发的标准工作负载包,可以直接使用。特别是,CoreWorkload 定义了读取/插入/更新/扫描操作的简单组合。每个操作的相对频率在参数文件中定义,工作负载的其他属性也是如此。因此,通过更改参数文件,可以执行各种不同的具体工作负载。有关 CoreWorkload 的更多详细信息,请参阅Core Workloads

2.1.1 workload分类

核心工作负载由六种不同的工作负载组成

Workload A: Update heavy workload

此工作负载混合了 50/50 的读取和写入。

Workload B: Read mostly workload

此工作负载具有 95/5 的读/写混合。

Workload C: Read only

此工作负载为 100% 读取。
Workload D: Read latest workload

在这个工作负载中,插入新记录,最近插入的记录最受欢迎。应用示例:用户状态更新;人们想阅读最新的。
Workload E: Short ranges

在此工作负载中,查询的是小范围的记录,而不是单个记录。
Workload F: Read-modify-write

在此工作负载中,客户端将读取记录、对其进行修改并写回更改。

2.1.2 验证50/50 的读取和写入

2.1.2.1 配置workload

cd workloads/

mv workloada workloada_bak

vi workloada

mongodb.url=mongodb://账号:密码@192.168.144.252:27017

mongodb.database=ycsb

recordcount=10000000

operationcount=100000

workload=site.ycsb.workloads.CoreWorkload

readallfields=true

readproportion=0.5

updateproportion=0.5

scanproportion=0

insertproportion=0

requestdistribution=zipfian

threadcount=100

fieldlength=200

fieldcount=8

table=testCollection

/*

参数介绍:

mongo.url指定要测试的mongo的地址,账号密码等信息

mongodb.database:要测试的数据库名称

recordcount:最初加载到数据库中的记录数

operationcount:要执行的操作次数

readallfields:查询时读取所有字段

readproportion:读比例

updateprortion:更新的比例

 */

2.1.2.2 加载数据

../bin/ycsb load mongodb -P workloada >a_load.txt

会输出DBWrapper: report latency for each error is false and specific error codes to track for latency are: []

但是没有影响。

查看a_load.txt里的输出信息:

[OVERALL], RunTime(ms), 357121

[OVERALL], Throughput(ops/sec), 28001.713704878737

[TOTAL_GCS_PS_Scavenge], Count, 649

[TOTAL_GC_TIME_PS_Scavenge], Time(ms), 1645

[TOTAL_GC_TIME_%_PS_Scavenge], Time(%), 0.4606281904452552

[TOTAL_GCS_PS_MarkSweep], Count, 0

[TOTAL_GC_TIME_PS_MarkSweep], Time(ms), 0

[TOTAL_GC_TIME_%_PS_MarkSweep], Time(%), 0.0

[TOTAL_GCs], Count, 649

[TOTAL_GC_TIME], Time(ms), 1645

[TOTAL_GC_TIME_%], Time(%), 0.4606281904452552

[CLEANUP], Operations, 100

[CLEANUP], AverageLatency(us), 31.98

[CLEANUP], MinLatency(us), 1

[CLEANUP], MaxLatency(us), 2895

[CLEANUP], 95thPercentileLatency(us), 4

[CLEANUP], 99thPercentileLatency(us), 18

[INSERT], Operations, 10000000

[INSERT], AverageLatency(us), 3515.3324546

[INSERT], MinLatency(us), 180

[INSERT], MaxLatency(us), 12345343

[INSERT], 95thPercentileLatency(us), 4335

[INSERT], 99thPercentileLatency(us), 14791

[INSERT], Return=OK, 10000000

说明往一个表里插入一千万条数据,用时357秒,平均每秒28001 个操作。

/*

已实验,插入一百万条数据,每秒41637个操作

*/

2.1.2.3 开始读写测试

../bin/ycsb run mongodb -P workloada > a_run.txt

[root@pc4 workloads]# cat a_run.txt

[OVERALL], RunTime(ms), 6905

[OVERALL], Throughput(ops/sec), 14482.259232440261

[TOTAL_GCS_PS_Scavenge], Count, 7

[TOTAL_GC_TIME_PS_Scavenge], Time(ms), 89

[TOTAL_GC_TIME_%_PS_Scavenge], Time(%), 1.2889210716871833

[TOTAL_GCS_PS_MarkSweep], Count, 0

[TOTAL_GC_TIME_PS_MarkSweep], Time(ms), 0

[TOTAL_GC_TIME_%_PS_MarkSweep], Time(%), 0.0

[TOTAL_GCs], Count, 7

[TOTAL_GC_TIME], Time(ms), 89

[TOTAL_GC_TIME_%], Time(%), 1.2889210716871833

[READ], Operations, 49966

[READ], AverageLatency(us), 6184.857122843534

[READ], MinLatency(us), 210

[READ], MaxLatency(us), 685567

[READ], 95thPercentileLatency(us), 16703

[READ], 99thPercentileLatency(us), 25183

[READ], Return=OK, 49966

[CLEANUP], Operations, 100

[CLEANUP], AverageLatency(us), 32.68

[CLEANUP], MinLatency(us), 1

[CLEANUP], MaxLatency(us), 3117

[CLEANUP], 95thPercentileLatency(us), 3

[CLEANUP], 99thPercentileLatency(us), 9

[UPDATE], Operations, 50034

[UPDATE], AverageLatency(us), 6088.497821481393

[UPDATE], MinLatency(us), 188

[UPDATE], MaxLatency(us), 681983

[UPDATE], 95thPercentileLatency(us), 16751

[UPDATE], 99thPercentileLatency(us), 25327

[UPDATE], Return=OK, 50034

说明在读写比例一样的情况下,对一千万条数据的表执行十万个操作,吞吐量是14482。

/*

已实验,对一百万条的表执行十万个操作(读写比例50/50),平均每秒18921个操作

*/

2.1.3 验证95/5的读/写混合

2.1.3.1 配置workload

mv workloadb workloadb_bak

vi workloadb

mongodb.url=mongodb://账号:密码@192.168.144.252:27017

mongodb.database=ycsb

recordcount=10000000

operationcount=100000

workload=site.ycsb.workloads.CoreWorkload

readallfields=true

readproportion=0.95

updateproportion=0.05

scanproportion=0

insertproportion=0

requestdistribution=zipfian

threadcount=100

fieldlength=200

fieldcount=8

table=testCollection

2.1.2.2 开始读写测试

../bin/ycsb run mongodb -P workloadb > b_run.txt

[root@pc4 workloads]# cat b_run.txt

[OVERALL], RunTime(ms), 6799

[OVERALL], Throughput(ops/sec), 14708.045300779526

[TOTAL_GCS_PS_Scavenge], Count, 7

[TOTAL_GC_TIME_PS_Scavenge], Time(ms), 81

[TOTAL_GC_TIME_%_PS_Scavenge], Time(%), 1.1913516693631416

[TOTAL_GCS_PS_MarkSweep], Count, 0

[TOTAL_GC_TIME_PS_MarkSweep], Time(ms), 0

[TOTAL_GC_TIME_%_PS_MarkSweep], Time(%), 0.0

[TOTAL_GCs], Count, 7

[TOTAL_GC_TIME], Time(ms), 81

[TOTAL_GC_TIME_%], Time(%), 1.1913516693631416

[READ], Operations, 94968

[READ], AverageLatency(us), 6000.804860584618

[READ], MinLatency(us), 206

[READ], MaxLatency(us), 780287

[READ], 95thPercentileLatency(us), 22079

[READ], 99thPercentileLatency(us), 35039

[READ], Return=OK, 94968

[CLEANUP], Operations, 100

[CLEANUP], AverageLatency(us), 32.84

[CLEANUP], MinLatency(us), 1

[CLEANUP], MaxLatency(us), 3101

[CLEANUP], 95thPercentileLatency(us), 3

[CLEANUP], 99thPercentileLatency(us), 14

[UPDATE], Operations, 5032

[UPDATE], AverageLatency(us), 6271.118243243243

[UPDATE], MinLatency(us), 261

[UPDATE], MaxLatency(us), 759295

[UPDATE], 95thPercentileLatency(us), 22303

[UPDATE], 99thPercentileLatency(us), 37087

[UPDATE], Return=OK, 5032

说明在读写比例为95/5的情况下,对一千万条数据的表执行十万个操作,吞吐量是14708。

/*

已实验,对一百万条的表执行十万个操作(读写比例95/5),平均每秒24654个操作

*/

2.2 测试结论

2.2.1 测试数据

2.2.2 测试结论 
实验发现,操作系统的硬件配置很影响测试结果,配置越高,OPS越高。

操作数据量小的表,OPS更高。

2.3 官方测试报告

其硬件配置如下:

  1. CPU: 2x Deca Core Xeon 2690 V2 – 3.00GHz (Ivy Bridge) – 2 x 25MB cache
    2、 RAM: 128 GB Registered DDR3 1333
    3、 Storage: 2x 960GB SSD drives, SATA Disk Controller
    4、 Network: 10 Gbps
    5、 Ubuntu 14.10 (64 bit)
    6、 MongoDB Versions: MongoDB 2.6.7; MongoDB 3.0.1

2.4 备注

2.4.1 验证分片集群性能步骤

sh.enableSharding("ycsb")

sh.shardCollection("ycsb.testCollection", _id:"hashed")

../bin/ycsb load mongodb -P workloada >a_load.txt

../bin/ycsb run mongodb -P workloada > a_run.txt

../bin/ycsb run mongodb -P workloadb > b_run.txt

本篇文章参考了

GitHub - brianfrankcooper/YCSB: Yahoo! Cloud Serving Benchmark

Running a Workload · brianfrankcooper/YCSB Wiki · GitHub

Core Workloads · brianfrankcooper/YCSB Wiki · GitHub

高性能mongodb之使用ycsb进行性能测试_a172742451的专栏-CSDN博客_mongodb性能测试工具

使用YCSB测试MongoDB的微分片性能 | MongoDB中文社区

MongoDB 3.0 官方性能测试报告(I):YCSB测试下的并发量提升 | MongoDB中文社区

以上是关于使用ycsb对mongo单实例做性能测试的主要内容,如果未能解决你的问题,请参考以下文章

使用ycsb对mariadb做性能测试

使用ycsb对mariadb做性能测试

利用雅虎ycsb对cassandra做性能测试

ycsb对hbase性能测试的研究

YCSB测试Mysql,MongoDB,TokuMX,Couchbase性能

教程,使用YCSB测试MYSQL数据库,获取千万条测试后的数据