1 YCSB是什么
YCSB(Yahoo! Cloud Serving Benchmark)是雅虎开源的一款通用的性能测试工具。通过这个工具我们可以对各类NoSQL产品进行相关的性能测试,包括:HBase、Cassandra、Mongodb、Voldemort、Redis等。通过配置workload文件,YCSB可以灵活的模拟不同的测试负载和读写模式。
YCSB的几大特性:
- 支持常见的数据库读写操作,如插入,修改,删除及读取
- 多线程支持。YCSB用Java实现,有很好的多线程支持。
- 灵活定义场景文件。可以通过参数灵活的指定测试场景,如100%插入, 50%读50%写等等
- 数据请求分布方式:支持随机,zipfian(只有小部分的数据得到大部分的访问请求)以及最新数据几种请求分布方式
- 可扩展性:可以通过扩展Workload的方式来修改或者扩展YCSB的功能
2 YCSB安装
见https://github.com/brianfrankcooper/YCSB/tree/master/mongodb
$ curl -O --location
https://github.com/brianfrankcooper/YCSB/releases/download/0.5.0/ycsb-0.5.0.tar.gz
$ tar xfvz ycsb-0.5.0.tar.gz
$ cd ycsb-0.5.0
3 YCSB运行
异步驱动加载和运行数据:
./bin/ycsb load mongodb-async -s -P workloads/workloada > outputLoad.txt
./bin/ycsb run mongodb-async -s -P workloads/workloada > outputRun.txt
使用MongoDB公司的同步驱动加载和运行数据:
./bin/ycsb load mongodb -s -P workloads/workloada > outputLoad.txt
./bin/ycsb run mongodb -s -P workloads/workloada > outputRun.txt
4 YCSB配置参数和文件
参数:
-P file 指定workload文件
-cp path 额外指定Java classpath路径
-jvm-args args 额外指定JVM的参数
-p key=value workload的一些设置
-s 把状态达到stderr中
-target n 目标每秒总共操作的次数(默认:unthrottled)
-threads n 客户端线程数(默认:1)
mongodb.url: 默认值是mongodb://localhost:27017/ycsb?w=1, w=1表示writeConcern为acknowledged。默认数据库是ycsb
mongodb.batchsize: 默认1
mongodb.upsert: 默认false
mongodb.writeConcern: 已废弃,使用mongodb.url里的w 和 journal替代。默认acknowledged
mongodb.readPreference: 已废弃,使用mongodb.url里的readPreference 替代。默认primary
mongodb.maxconnections: 已废弃,使用mongodb.url里的maxPoolSize 替代。默认100
mongodb.threadsAllowedToBlockForConnectionMultiplier: 已废弃,使用mongodb.url里的waitQueueMultiple 替代。默认5
举例:
./bin/ycsb load mongodb -s -P workloads/workloada -p mongodb.url=mongodb://192.168.10.13:27017/ycsb?w=1 -threads 500 > outputLoad.txt
./bin/ycsb run mongodb -s -P workloads/workloada -p mongodb.url=mongodb://192.168.10.13:27017/ycsb?w=1 -threads 500 > outputRun.txt
workload文件
recordcount=10000000 # 测试数据集的记录条数
operationcount=10000000 # 测试过程中执行的操作总数
workload=com.yahoo.ycsb.workloads.CoreWorkload # workload实现类
readallfields=true # 查询时是否读取记录的所有字段
readproportion=0.5 # 读操作的百分比
updateproportion=0.5 # 更新操作的百分比
scanproportion=0 # 扫描操作的百分比
insertproportion=0 # 插入操作的百分比
requestdistribution=zipfian # 请求分布模式
再次,运行YCSB。YCSB的运行分为两个阶段:测试数据加载阶段和测试操作执行阶段,前者用来加载测试数据集,后者用来执行正真的测试操作,两个阶段都要使用上面的配置文件。数据加载的执行命令为:./bin/ycsb load mongodb -threads 100 -P workloads/workloada,即根据workloada的配置要求启动100个线程并发加载测试数据,在执行完成后YCSB会打印出类似于下面的数据加载性能统计数据:
[OVERALL], RunTime(ms), 905346.0 # 数据加载所用时间(毫秒)
[OVERALL], Throughput(ops/sec), 11045.500836144412 # 加载操作的吞吐量(ops/sec)
[INSERT], Operations, 10000000 # 执行insert操作的总数
[INSERT], AverageLatency(us), 9024.8155659 # 每次insert操作的平均延时(微秒)
[INSERT], MinLatency(us), 139 # 所有insert操作的最小延时(微秒)
[INSERT], MaxLatency(us), 1022876 # 所有insert操作的最大延时(微秒)
[INSERT], 95thPercentileLatency(ms), 27 # 95%的insert操作延时在27毫秒以内
[INSERT], 99thPercentileLatency(ms), 42 # 99%的insert操作延时在42毫秒以内
[INSERT], Return=0, 10000000 # 成功返回数10000000
[INSERT], 0, 3793117 # 以下insert操作在各个延时时间区域的分布情况
[INSERT], 1, 37171
[INSERT], 2, 8035
[INSERT], 3, 6294
...
[INSERT], 999, 0
[INSERT], >1000, 5
5 YCSB提供的几个测试的模式
workloada:
特点:更新负载大。
应用举例:会话存储记录最近的动作
读/更新 比例: 50/50
默认数据大小:1 KB的记录(10个字段,每个字段100 bytes,加上key)
请求分布模式:zipfian(YCSB提供uniform等概率随机选择记录, zipfian随机选择记录,存在热纪录, latest近期写入的记录是热记录三种分布模式)
workloadb:
特点:大部分是读负载。
应用举例:照片标签:添加标签是更新,但大部分操作是读取标签
读/更新 比例: 95/5
默认数据大小:1 KB的记录(10个字段,每个字段100 bytes,加上key)
请求分布模式:zipfian
workloadc:
特点:只读取。
应用举例:用户配置文件缓存,其中配置文件是在别处构建的(例如,Hadoop)
读/更新 比例: 100/0
默认数据大小:1 KB的记录(10个字段,每个字段100 bytes,加上key)
请求分布模式:zipfian
workloadd:
特点:读取最近数据的负载。
应用举例:用户状态更新,用户想获取到最新的状态。
读/更新/插入 比例: 95/0/5
默认数据大小:1 KB的记录(10个字段,每个字段100 bytes,加上key)
请求分布模式:latest
workloade:
特点:Short ranges。
应用举例: 线程会话,其中每个扫描是针对给定的线程(假定由线程ID聚集)
扫描/插入 比例: 95/5
默认数据大小:1 KB的记录(10个字段,每个字段100 bytes,加上key)
请求分布模式:zipfian
workloadf:
特点:。读-修改-写 负载
应用举例:用户数据库,用户记录读取和修改用户记录或记录用户活动
读/读-修改-写 比例: 50/50
默认数据大小:1 KB的记录(10个字段,每个字段100 bytes,加上key)
请求分布模式:zipfian