YCSB压测elasticsearch
YCSB是Yahoo开源的用于测试数据库(主要是nosql)的性能框架,可以测试Hbase, mongo, redis,elasticSearch等,本文主要介绍压测elasticsearch的流程。
1.安装下载YCSB
git clone https://github.com/brianfrankcooper/YCSB.git
clone完成后,看项目目录结构能发现,有两个elasticsearch相关的项目
其中elasticsearch支持的版本是2.x, elasticsearch5支持的版本是5.x, 而目前公司的es版本已经升级至7.x,在YCSB中提交记录中发现了一个版本,https://github.com/brianfrankcooper/YCSB/pull/1469 虽还未合并到主分支,但我们可以下下来,试一下。
重新拉取新分支代码 :
git clone https://github.com/xosk31/YCSB.git
成功获取到elasticsearch7的版本
2. 编译打包
mvn -pl elasticsearch7 -am clean package
打包成功后:
在YCSB/elasticsearch7/target目录下生成一个YCSB的启动包:ycsb-elasticsearch7-binding-0.18.0-SNAPSHOT.tar.gz
解压:tar -xzvf ycsb-elasticsearch7-binding-0.18.0-SNAPSHOT.tar.gz
进入ycsb-elasticsearch7-binding-0.18.0-SNAPSHOT目录,可看到目录结构如下:
LICENSE.txt NOTICE.txt README.md bin lib workloads
workloads目录里有预设的workloada/b/c/d/e/f几个文件,打开后,结构类似,都有如下参数,唯一不同是的是几个 *proportion的值不一样
recordcount=1000 //测试数据集的总数 operationcount=1000 //测试中执行的操作总数 workload=site.ycsb.workloads.CoreWorkload readallfields=true readproportion=0.5 //读数据占操作总数的比例 updateproportion=0.5 //更新数据占操作总数的比例 scanproportion=0 //扫描数据占操作总数的比例 insertproportion=0 //写数据占操作总数的比例 requestdistribution=zipfian
测试过程中,我们可以根据自己的实际情况,随意的设置这几个*proportion的值
3.压测流程
1.在待压测集群上新建测试索引
YCSB不负责表的创建,所以需要自己手动创建用于测试的索引。例如在elasticsearch中,需要手动在待测集群上创建测试索引test
2.选择合适的 workload
本次主要做读和写,所以只需要准备两个workload, 一个insertproportion值为1, 其余均为0; 另一个readproportion值为1,其余均为0
3.选择合适的运行时参数
在当前目录新增配置文件myproperties.data, 内容如下:可根据自己的实际情况配置
es.cluster.name=tj-es-staging //es集群名 es.index.name= middle_review_test es.index.key=middle_review_test //es索引名,提前已经建好的测试索引 es.number_of_shards=1 //es的分片数 es.number_of_replicas=1 //分片的副本数 es.remote=true //是否是远程测试 es.newdb=false es.hosts.list=xxxx //es集群的ip或者域名:port, 多个用逗号隔开 es.security.ssl=false //是否需要进行SSL证书验证 es.security.ssl.path=changeme //SSL证书目录 es.authentication=true //是否需要身份验证 es.credentials.user=changeme //用户名 es.credentials.password=changeme //密码
本次qps预设为30, 100, 200 ,所以将 -threads分别设置为30, 100, 200即可。除了在 workload 中配置参数外,YCSB 还支持其他运行时参数,比较有用的是-threads,用于设置
客户端线程数,默认为 1
4.装载数据(loading phase)
./bin/ycsb load elasticsearch7 -P workloads/workloada -P myproperties.data -s
装载数据的主要作用是,为测试做数据准备,比如需要压测更新操作,若没有load操作,则会提示待更新的数据不存在。
可以观察下装在数据的输出日志,无论配置的workloada是什么样的,都只执行insert操作。
[OVERALL], RunTime(ms), 16220 [OVERALL], Throughput(ops/sec), 61.652281134401974 [TOTAL_GCS_PS_Scavenge], Count, 2 [TOTAL_GC_TIME_PS_Scavenge], Time(ms), 23 [TOTAL_GC_TIME_%_PS_Scavenge], Time(%), 0.14180024660912455 [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, 2 [TOTAL_GC_TIME], Time(ms), 23 [TOTAL_GC_TIME_%], Time(%), 0.14180024660912455 [CLEANUP], Operations, 1 [CLEANUP], AverageLatency(us), 2133.0 [CLEANUP], MinLatency(us), 2132 [CLEANUP], MaxLatency(us), 2133 [CLEANUP], 95thPercentileLatency(us), 2133 [CLEANUP], 99thPercentileLatency(us), 2133 [INSERT], Operations, 1000 [INSERT], AverageLatency(us), 14927.496 [INSERT], MinLatency(us), 9568 [INSERT], MaxLatency(us), 76351 [INSERT], 95thPercentileLatency(us), 23343 [INSERT], 99thPercentileLatency(us), 44575 [INSERT], Return=OK, 1000
5.运行测试(transaction phase)
压测qps 30:
./bin/ycsb run elasticsearch7 -P workloads/workloada -P myproperties.data -s -threads 30
压测qps 100:
./bin/ycsb run elasticsearch7 -P workloads/workloada -P myproperties.data -s -threads 100
压测qps 200:
./bin/ycsb run elasticsearch7 -P workloads/workloada -P myproperties.data -s -threads 200
6.结果解析
Operations 执行的操作数
AverageLatency 平均响应时间
MinLatency 最小响应时间
MaxLatency 最大响应时间
95thPercentileLatency p95
99thPercentileLatency p99
根据最终的结果,用excel绘制柱状图,效果如下:
写AverageLatency 写p99
读AverageLatency 读p99