HBase性能测试
自带有hbase pe,但是pe只能统计每个线程执行的情况,不能统计整体的状态。所以还是推荐使用YCSB
https://github.com/brianfrankcooper/YCSB
使用参考文档:
https://github.com/brianfrankcooper/YCSB/wiki
一:首先确认集群配置,比如cpu、内存、磁盘、网络带宽
二:创建hbase表,设置表重要属性,比如使用哪种压缩,哪种块编码等等。一般也会创建好预分区,在创建预分区的时候,由于YCSB默认生成的rowkey是以“user”开头的,所以创建预分区应做对应调整,比如:
create 'ycsb01',{NAME => 'f1',COMPRESSION => 'SNAPPY'},SPLITS => ['user1','user2','user3','user4','user5','user6','user7','user8','user9']
三:定义我们的workload,YCSB自带的也有几种workload,可以参照来定义我们自己的负载情况,
比较核心的配置如下:
recordcount: YCSB load命令的参数,指总数据条数 (default: 1000) Operationcount: YCSB run(运行压力测试)命令的参数,默认值1000表示默认选取数据库中的1000条数据进行压力测试。对于workloada这种测试场景,就意味着读数据在500左右,写数据也在500左右 fieldcount: 字段个数 (default: 10) fieldlength: 每个字段的长度 (default: 100) minfieldlength: 每个字段最小的长度 (default: 1) readallfields: 是否读取所有字段(default: true) writeallfields: 是否写/更新所有字段 (default: false) readproportion: read操作比例 (default: 0.95) updateproportion: update操作比例 (default: 0.05) insertproportion: insert操作比例 (default: 0) scanproportion: scan操作比例 (default: 0) requestdistribution: 使用哪种数据分布方式,主要有uniform, zipfian, hotspot, sequential, exponential or latest可选 (default: uniform) Uniform(等概率随机选择记录)、Zipfian(随机选择记录,存在热纪录)和Latest(近期写入的记录是热记录)。 minscanlength: scan时候,最小的scan条数(default: 1) maxscanlength: scan时候,最大的scan条数(default: 1000) scanlengthdistribution: scan时候,怎么选择scan的条数,[scan的条数介于1到maxscanlength之间] (default: uniform) insertstart: 在并行执行loads和runs的时候,定义当前YCSB实例的起始数据 (default: 0) insertcount: 在并行执行loads和runs的时候,定义当前YCSB实例要操作的数据条数 (default: recordcount) fieldnameprefix: 字段名的前缀 (default: “field”)
运行 Workload
运行workload大概有以下几个步骤:
-
选择符合场景的workload
-
配置合适的参数(比如客户端线程数)
-
执行Load阶段数据加载(workload有两个阶段,一个是loading阶段加载数据,一个是transactions阶段在这些数据上执行操作)
-
执行workload
执行Load
nohup ycsb_home/bin/ycsb load hbase12 -P workloads/workloada -cp ycsb_home/hbaseconf -p table=ycsb01 -p columnfamily=f1 -threads 10 -s > ycsb_home/log/ycsb_load.log &
load:表示的是执行的load阶段
hbase12:对应hbase1.2版本
-P workloads/workloada:指定负载配置
-cp ycsb_home/hbaseconf:指定hbase client配置文件
-p table=ycsb01:指定hbase表
-p columnfamily=f1:指定hbase表的列簇
-threads 10:指定ycsb线程数
-s:status,每隔10秒输出状态日志
日志分析
[OVERALL], RunTime(ms), 16487.0 [OVERALL], Throughput(ops/sec), 6065.384848668648 [OVERALL] 区显示测试总体情况 RunTime(ms) 运行总时间 Throughput(ops/sec) 吞吐量,每秒操作数 [TOTAL_GCS_PS_Scavenge], Count, 23.0 [TOTAL_GC_TIME_PS_Scavenge], Time(ms), 88.0 [TOTAL_GC_TIME_%_PS_Scavenge], Time(%), 0.5337538666828411 [TOTAL_GCS_PS_MarkSweep], Count, 0.0 [TOTAL_GC_TIME_PS_MarkSweep], Time(ms), 0.0 [TOTAL_GC_TIME_%_PS_MarkSweep], Time(%), 0.0 [TOTAL_GCs], Count, 23.0 [TOTAL_GC_TIME], Time(ms), 88.0 [TOTAL_GC_TIME_%], Time(%), 0.5337538666828411 [TOTAL_GC*] 区显示垃圾回收情况 [TOTAL_GCS_PS_Scavenge], Count, 23.0 Parallel Scavenge 回收次数 [TOTAL_GC_TIME_PS_Scavenge], Time(ms), 88.0 Parallel Scavenge 回收时间 [TOTAL_GC_TIME_%_PS_Scavenge], Time(%), 0.533 Parallel Scavenge 回收时间百分比 [TOTAL_GCS_PS_MarkSweep], Count, 0.0 PS MarkSweep 回收次数 [TOTAL_GC_TIME_PS_MarkSweep], Time(ms), 0.0 PS MarkSweep 回收时间 [TOTAL_GC_TIME_%_PS_MarkSweep], Time(%), 0.0 PS MarkSweep 回收时间百分比 [TOTAL_GCs], Count, 23.0 全局 GC 次数 [TOTAL_GC_TIME], Time(ms), 88.0 全局 GC 时间 [TOTAL_GC_TIME_%], Time(%), 0.533753866 全局 GC 时间百分比 [READ], Operations, 50011.0 [READ], AverageLatency(us), 4418.49443122513 [READ], MinLatency(us), 1584.0 [READ], MaxLatency(us), 208895.0 [READ], 95thPercentileLatency(us), 8207.0 [READ], 99thPercentileLatency(us), 11463.0 [READ], Return=OK, 50011 [READ] 区显示读取操作的统计结果 Operations 总操作数 AverageLatency(us) 平均延迟(微秒) MinLatency(us) 最小延迟 MaxLatency(us) 最大延迟 95thPercentileLatency(us) p95延迟 99thPercentileLatency(us) p99延迟 Return=OK, 50011 结果(正确),总操作数 [CLEANUP](清理操作)、[UPDATE](更新操作)等等和 [READ] 区类似
执行Run
nohup ycsb_home/bin/ycsb run hbase12 -P workloads/workloada -cp ycsb_home/hbaseconf -p table=ycsb01 -p columnfamily=f1 -threads 10 -s > ycsb_home/log/ycsb_run.log &
注意事项
1.ycsb client尽量运行在非hbase集群节点,以减少ycsb client对regionserver资源的占用,影响测试结果。
2.留意ycsb client网络IO情况,如果网络带宽被打满,测不出实际性能。这种情况可以设置多ycsb client并行运行
3.多ycsb client并行运行,最后的执行结果综合多个取平均值即可,主要关注TPS(ops/sec)和平均延迟、p95、p99延迟。