ycsb压测mongodb
Posted _雪辉_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ycsb压测mongodb相关的知识,希望对你有一定的参考价值。
ycsb maven jdk1.8+
ycsb有几个目录需要注意下:
bin:
- 目录下有个可执行的ycsb文件,是个python脚本,是用户操作的命令行接口。ycsb主逻辑是:解析命令行、设置java环境,加载java-libs,封装成可以执行的java命令,并执行
workloads:
- 目录下有各种workload的模板,可以基于workload模板进行个性化修改
core:
- 包含ycsb里各种核心实现,比如DB的虚拟类DB.java,各个db子类都要继承该类;还有比如workload抽象类,如果我们要自定义workload实现也需要继承该类
各种DB的目录:
- 比如mongo,redis等,里面包含了对应测试的源码等。
- 当ycsb mvn编译后,会在对应的目录下生成target文件,ycsb会加载对应target文件中的class类
2 使用
ycsb在执行的时候,分为两阶段:load阶段 和 transaction阶段
2.1 load阶段
该阶段主要用于构造测试数据,ycsb会基于参数设定,往db里面构造测试需要的数据,如:
mongodb-async
在ycsb中,对于不同的db都有一些选项,比如mongo就有mongodb 和 mongodb-async。
默 认的mongodb表示同步,即load和run使用同步的方式,ycsb会调用mongodb/src底下对应的MongodbClient实现对应的 insert/update等操作。如果设置了mongodb-async,ycsb会调用mongodb/src底下对应的 AsyncMongoDbClient.java实现
参数设置:
Options:
-P file Specify workload file // workload文件
-cp path Additional Java classpath entries
-jvm-args args Additional arguments to the JVM
-p key=value Override workload property // 一些设置
-s Print status to stderr // 把状态达到stderr中
-target n Target ops/sec (default: unthrottled) // 每秒总共操作的次数
-threads n Number of client threads (default: 1) // 客户端线程数
参数解读:
-P workload文件
在ycsb的目录下有多种workload,参考:https://github.com/brianfrankcooper/YCSB/wiki/Core-Workloads,我们以workloada举例子
基础配置:
#YCSB load(加载元数据)命令的参数,表示加载的记录条数,也就是可用于测试的总记录数。
recordcount=1000000
#YCSB run(运行压力测试)命令的参数,测试的总次数。和maxexecutiontime参数有冲突,谁先完成就中断测试退出,结合下面的增改读扫参数,按比例来操作.
#operationcount=1000000
#测试的总时长,单位为秒,和operationcount参数有冲突,谁先完成就中断测试退出,这里3600秒就代表一小时,也是结合下面的增改读扫参数,按比例来操作.
maxexecutiontime=3600
#java相关参数,指定了workload的实现类为 com.yahoo.ycsb.workloads.CoreWorkload
workload=com.yahoo.ycsb.workloads.CoreWorkload
#表示查询时是否读取记录的所有字段
readallfields=true
#表示读操作的比例,该场景为0.54,即54%
readproportion=0.54
#表示更新操作的比例,该场景为0.2,即20%
updateproportion=0.2
#表示扫描操作的比例,即1%,通常是用来模拟没有索引的查询
scanproportion=0.01
#表示插入操作的比例,即25%
insertproportion=0.25
#表示请求的分布模式,YCSB提供uniform(随机均衡读写),zipfian(偏重读写少量热数据),latest(偏重读写最新数据)三种分布模式
requestdistribution=uniform
#插入文档的顺序方式:哈希(hashed)/有序 (insertorder)
insertorder=hashed
#测试数据的每一个字段的长度,单位字节
fieldlength=2000
#测试数据的每条记录的字段数,也就是说一条记录的总长度是2000*10=20000字节
fieldcount=10
#####################以下是不自带的参数#############################
#把数据库连接地址写到这里,那么输命令的时候就不用输地址了,我这里没有设用户名密码,当然是不需要了
mongodb.url=mongodb://10.21.1.205:30000/ycsb?w=0
#如果你是有很多个mongos的话,就要这样写
#mongodb.url=mongodb://172.25.31.101:30000,172.25.31.102:30000,172.25.31.103:30000/ycsb?w=0
#如果是有用户名密码的话,就要这样写,还记得上面一开始的模板嘛,mongodb://user:pwd@server1.example.com:9999
#mongodb.url=mongodb://ycsbtest:ycsbtest@10.21.1.205:30000/ycsb?w=0
#写安全设置,Unacknowledged(不返回用户是否写入成功w:0),Acknowledged(写入到主节点内存就返回写入成功w:1),Journaled(写入到主节点journal log才返回写入成功w:1,j:true),Replica Acknowledged(写入到所有副本集内存和主节点journal log才返回写入成功w:2),Available Write Concern(写入到所有节点journal log才返回写入成功w:2,j:true),选项越往后,安全性越高,但是性能越差.
mongodb.writeConcern=acknowledged
#线程数,也就是说100个并发,既然是压测,怎么可能是单线程
threadcount=100
requestdistribution=zipfian
workloada的负载比较中,read和update类比例为1:1,里面一些设置参数如上,如果我们再设置mongo的时候,还需要再workload中增加对应的mongo配置,如下:
mongodb.url=mongodb://192.168.137.10:34001/ycsb? # mongodb对应的uri等
mongodb.database=ycsb # 对应的db
mongodb.writeConcern=normal # 写级别
-p选项
-p用于设置一些对应的参数,如果workload中的参数,也可以以-p的方式放在命令行中设置
-s
-s是表示,在运行中,把一些状态打印到stderr中,一般status信息,用于表示在运行中的一些中间状态(比如当前处理了多少请求,还有多少请求等)
-target n
表示1s中总共的操作次数(各个线程加起来的),如果性能不满足,比如最高性能只有100,你设置了1000,那么ycsb会尽量往这个数目去靠近。默认是不做限制
-thread 线程数
设置ycsb client的并发测试线程数,默认是1,单线程,所以再测试的时候,一定要设置这个选项
2.2 transcation阶段
在2.1load数据结束之后,ycsb就可以进行测试了,也就是transaction阶段。在transaction阶段,会基于workload中的比例设置,和线程参数设置进行db的压测。具体参数如上
#造数
./bin/ycsb load mongodb -P workloads/workloada -p mongodb.url=mongodb://ycsb:ycsb@127.0.0.1:27017/ycsb -s
#压测
./bin/ycsb.sh run mongodb -P workloads/workloada -p mongodb.url=mongodb://ycsb:ycsb@127.0.0.1:27017/ycsb -s
以上是关于ycsb压测mongodb的主要内容,如果未能解决你的问题,请参考以下文章