一、YCSB介绍
1、YCSB
YCSB项目的目标是提供一个标准的工具用来衡量不同键值对存储或云服务存储的性能。YCSB做了很多优化来提高客户端性能,例如在数据类型上用了最原始的比特数组以减少数据对象本身创建转换所需的时间等。YCSB的几大特性:
- 支持常见的数据存储读写操作,如插入,修改,删除及读取
- 多线程支持。YCSB用Java实现,有很好的多线程支持。
- 灵活定义场景文件。可以通过参数灵活的指定测试场景,如100%插入, 50%读50%写等等
- 数据请求分布方式:支持随机,zipfian(只有小部分的数据得到大部分的访问请求)以及最新数据几种请求分布方式
- 可扩展性:可以通过扩展Workload的方式来修改或者扩展YCSB的功能
开源地址:https://github.com/brianfrankcooper/YCSB
2、安装
YCSB的安装。直接下载tar.gz分发包的话其实也不需要安装什么,解压后通过bin目录下的脚本执行即可(依赖python和JRE)。
- bin :目录下有个可执行的 ycsb 文件,是个 python 脚本,是用户操作的命令行接口。ycsb 主逻辑是:解析命令行,设置 Java 环境,加载java-libs ,封装成可以执行的 Java 命令,最后执行。
- lib :包含 ycsb 里各种核心实现,比如 DB 的抽象类java ,各个 db 子类都要继承该类;还有比如 workload 抽象类,如果我们要自定义 workload 实现也需要继承该类。
- workloads :目录下有各种 workload 的模板,可以基于 workload 模板进行个性化修改。
3、YSCB workload测试模式
- workloada:读写均衡型,50%/50%,Reads/Writes
- workloadb:读多写少型,95%/5%,Reads/Writes
- workloadc:只读型,100%,Reads
- workloadd:读最近写入记录型,95%/5%,Reads/insert
- workloade:扫描小区间型,95%/5%,scan/insert
- workloadf:读写入记录均衡型,50%/50%,Reads/insert
- workload_template:参数列表模板。
参数 说明
fieldcount 单条记录字段个数,默认10
fieldlength 每个字段的大小,默认100B
readallfields 是否读取所有记录,默认true
readproportion 读比例(默认0.95)
updateproportion 更新比例(默认0.05)
insertproportion 插入比例(默认0)
scanproportion 扫描比例(默认0)
readmodifywriteproportion 同一记录读、修改、回写比例(默认值:0)
requestdistribution 记录选择策略:uniform,zipfian,latest(默认值:uniform)
maxscanlength 最大scan记录数(默认值:100)
scanlengthdistribution scan记录选择策略(默认值:uniform)
insertorder 记录插入策略:ordered,hashed(默认值:hashed)
operationcount 操作执行数
maxexecutiontime 最大执行时间,单位:秒
table 表名(默认值值usertable)
recordcount 初始化记录条数(默认值:0)
二、 MongoDB常规配置
1、参数配置
mongodb参数设置:
参数 说明
mongodb.url MongoDB URI或者连接串
mongodb.batchsize 对大量inert操作的时候,分批commit提交,提高吞吐量
mongodb.upsert 默认是false.true表示update操作,false表示insert操作.
mongodb.writeConcern 默认值是acknowledged。
可选的值:
- `errors_ignored`
- `unacknowledged`
- `acknowledged`
- `journaled`
- `replica_acknowledged`
- `majority`
mongodb.readPreference 默认值是primary
可选值:
- `primary`
- `primary_preferred`
- `secondary`
- `secondary_preferred`
- `nearest`
mongodb.maxconnections 默认值是100. mongodb.url选型中的maxPoolSize的值。
mongodb.threadsAllowedToBlockForConnectionMultiplier
默认值是5. mongodb.url 选型中的waitQueueMultiple的值。
三、 基于YCSB的MongoDB压测步骤
1、配置需要测试的数据库
YCSB 不负责表的创建,需要在数据库中手动创建用于测试的表。例如在MongoDB 中,需要手动创建一个表和一个列族。
2、选择合适的数据库接口层
YCSB 预置了一些常用数据库的接口层,对于 MongoDB测试,需要选择com.yahoo.ycsb.db.MongoDbClient作为接口。
3、选择合适的 workload
Workload 定义了如何向数据库中加载测试数据,包括两个部分:
- Workload Java 类(com.yahoo.ycsb.Workload 的子类)
- 配置文件(Java Properties 格式)
YCSB 的 CoreWorkload 预置了一些标准测试数据,可以直接使用,包括 6个不同的类型:
Workload A:重更新,50% 读 50% 写,例如 session sotre
Workload B:读多写少,95% 读 5% 写,例如 photo tagging
Workload C:只读:100% 读,例如 user profile cache
Workload D:读最近更新:这个 workload 会插入新纪录,越新的纪录读取概率越大,例如:user status updates
Workload E:小范围查询:这个 workload 会查询小范围的纪录,而不是单个纪录,例如:threaded conversations
Workload F:读取-修改-写入:这个 workload 会读取一个纪录,然后修改这个纪录,最后写回,例如:user database
可以根据测试需求选择合适的 workload,也可以新建一个新的 workload。
4、选择合适场景运行时参数
除了在 workload 中配置参数外,YCSB 还支持这些运行时参数:
- -threads:客户端线程数,默认为 1
- -target:每秒的目标操作数,默认为无限制(尽可能快地完成操作)。例如一个操作需要 100ms,那么一个线程 1s 内可以完成 10个操作,通过 -target 参数可以将操作放缓,控制在 10个以下
- -s:每 10s 打印一次客户端状态,用于调试
5、第五步:装载数据
Workload 包含两个阶段:装载阶段和事务阶段。在装载阶段向数据库中插入测试数据。对于 MongoDB测试,可以使用下面的命令装载数据:
/ycsb/ycsb-0.17.0/bin/ycsb load mongodb -s -P /ycsb/ycsb-0.17.0/workloads/workloada -p mongodb.url="mongodb://127.0.0.1:27018" -p operationcount=1000000 -threads 4
各个参数的含义为:
- -P 指定 workload 配置文件路径,使用 Workload A 类型
- -p 指定单个配置(会覆盖之前文件中的配置)
- table=,columnfamily=, 指定 HBase 表名和列族
- recordcount=,operationcount=,指定纪录数和操作数
- -thread 指定客户端线程数
- -s 打印状态
6、运行测试
当装载完测试数据后,就可以运行 workload 测试了。测试命令为:
/ycsb/ycsb-0.17.0/bin/ycsb run mongodb -s -P /ycsb/ycsb-0.17.0/workloads/workloada -p mongodb.url="mongodb://127.0.0.1:27018" -p operationcount=1000000 -threads 4
参数含义与装载数据时相同,区别在用 run 替代了 load。
运行结束后可以看到 YCSB 打印出了一些测试统计结果:
代码
各个参数的含义在结果解析中解释。
如果想获得直方图或者时间序列结果(参考测量参数),可以使用 measurementtype=timeseries 参数。客户端默认每 1s 纪录一次平均延迟,可以通过 timeseries.granularity=2000 参数(毫秒)来修改。此时测试报告为:
此时整个测试过程就结束了。
结果解析
[OVERALL] 区显示测试总体情况
RunTime(ms) 运行总时间
Throughput(ops/sec) 吞吐量,每秒操作数
[TOTAL_GC*] 区显示垃圾回收情况(JVM有关垃圾回收机制的配置)
[TOTAL_GCS_PS_Scavenge], Count, Parallel Scavenge 回收次数
[TOTAL_GC_TIME_PS_Scavenge], Time(ms), Parallel Scavenge 回收时间
[TOTAL_GC_TIME_%_PS_Scavenge], Time(%),Parallel Scavenge 回收时间百分比
[TOTAL_GCS_PS_MarkSweep], Count, PS MarkSweep 回收次数
[TOTAL_GC_TIME_PS_MarkSweep], Time(ms), PS MarkSweep 回收时间
[TOTAL_GC_TIME_%_PS_MarkSweep], Time(%), PS MarkSweep 回收时间百分比
[TOTAL_GCs], Count, 全局 GC 次数
[TOTAL_GC_TIME], Time(ms), 全局 GC 时间
[TOTAL_GC_TIME_%], Time(%),全局 GC 时间百分比
[READ] 区显示读取操作的统计结果
Operations 总操作数
AverageLatency(us) 平均延迟(微秒)
MinLatency(us) 最小延迟
MaxLatency(us) 最大延迟
95thPercentileLatency(us) 第 95 百分位延迟
99thPercentileLatency(us) 第 99 百分位延迟
Return=OK, 50011 结果(正确),总操作数
注意 YCSB 的延迟为端到端的延迟,在开始调用数据库接口层方法前开始计时,在方法返回时结束计时,也就是说延迟包括这几个部分:
- 在接口层内代码的运行时间
- 客户端到数据库服务器的网络延迟
- 数据库的执行时间
其中并不包括由 -target 节流参数引入的延迟。