一、工具介绍

YCSB 于 2010 年开源,YCSB是雅虎开源的NoSQL测试工具,通常用来对noSQL数据库进行性能,运行一个压力测试需要 6 步:

  • 配置需要测试的数据库
  • 选择合适的数据库接口层
  • 选择合适的 workload
  • 选择合适的运行时参数
  • 装载数据(loading phase)   (ycsb主要就是这2步骤)
  • 运行测试(transaction phase)

二、工具使用

1、下载

curl -O --location https://github.com/brianfrankcooper/YCSB/releases/download/0.17.0/ycsb-0.17.0.tar.gz
tar xfvz ycsb-0.17.0.tar.gz
cd ycsb-0.17.0

2、修改配置

(1)进入ycsb-0.17.0/jdbc-binding/conf 修改db.properties

db.driver=com.mysql.jdbc.Driver
# jdbc.fetchsize=20
db.url=jdbc:mysql://192.168.30.128:33306/ycsb?useSSL=false&autoReconnect=true&characterEncoding=utf8
db.user=root
db.passwd=123456

(2)进入ycsb-0.17.0/jdbc-binding/lib,下载mysql-connector-java-5.1.46.jar并放入lib目录下

3、创建测试的库与表

create database ycsb;
use ycsb;

#必须是这个表结构,负责插入数据将报错,可以将text改为varchar类型
CREATE TABLE usertable (
    YCSB_KEY VARCHAR(255) PRIMARY KEY,
    FIELD0 TEXT, FIELD1 TEXT,
    FIELD2 TEXT, FIELD3 TEXT,
    FIELD4 TEXT, FIELD5 TEXT,
    FIELD6 TEXT, FIELD7 TEXT,
    FIELD8 TEXT, FIELD9 TEXT
);

#或者是如下的表结构

CREATE TABLE usertable (
YCSB_KEY VARCHAR(255) PRIMARY KEY,
FIELD0 VARCHAR(255), FIELD1 VARCHAR(255),
FIELD2 VARCHAR(255), FIELD3 VARCHAR(255),
FIELD4 VARCHAR(255), FIELD5 VARCHAR(255),
FIELD6 VARCHAR(255), FIELD7 VARCHAR(255),
FIELD8 text, FIELD9 text
);

4、数据写入

cd ycsb-0.17.0   #进入此目录下,然后执行load命令
./bin/ycsb load jdbc -s -P workloads/workloadd -P /syw_test/ycsb-0.17.0/jdbc-binding/conf/db.properties -cp /syw_test/ycsb-0.17.0/jdbc-binding/lib/mysql-connector-java-5.1.46.jar -p recordcount=1000 -p threads=5 -p operationcount=1000 -p table=usertable

5、执行测试

加载好数据之后,即可执行工作负载

#将load改为run即可
./bin/ycsb run jdbc -s -P workloads/workloadd -P /syw_test/ycsb-0.17.0/jdbc-binding/conf/db.properties -cp /syw_test/ycsb-0.17.0/jdbc-binding/lib/mysql-connector-java-5.1.46.jar -p recordcount=1000 -p threads=5 -p operationcount=1000 -p table=usertable

 

三、YCSB测试参数解析

(1)workloads目录里面下包含自带了6种压力测试场景:

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

(2)workload参数介绍

参数

含义

recordcount=1000

 

YCSB load(加载元数据)命令的参数,默认值1000表示默认加载的记录条数,可以在命令行显示修改该值。

operationcount=1000

 

YCSB run(运行压力测试)命令的参数,默认值1000表示默认选取数据库中的1000条数据进行压力测试。对于workloada这种测试场景,就意味着读数据在500左右,写数据也在500左右。

workload=com.yahoo.ycsb.workloads.CoreWorkload

 

指定了workload的实现类为 com.yahoo.ycsb.workloads.CoreWorkload

readallfields=true

表示查询时是否读取记录的所有字段

readproportion=0.5

表示读操作的比例,该场景为0.5

updateproportion=0.5

表示更新操作的比例,该场景为0.5

scanproportion=0

表示扫描操作的比例

insertproportion=0

表示插入操作的比例

requestdistribution=zipfian

 

表示请求的分布模式,YCSB提供uniform, zipfian, latest三种分布模式,

Uniform(等概率随机选择记录)、Zipfian(随机选择记录,存在热纪录)和Latest(近期写入的记录是热记录)

 

四、测试结果的解读

[OVERALL], RunTime(ms), 8001                       #运行总时间(毫秒)
[OVERALL], Throughput(ops/sec), 124.9843769528809    #吞吐量,每秒操作数
[TOTAL_GCS_G1_Young_Generation], Count, 1   
[TOTAL_GC_TIME_G1_Young_Generation], Time(ms), 152    
[TOTAL_GC_TIME_%_G1_Young_Generation], Time(%), 1.8997625296837894
[TOTAL_GCS_G1_Old_Generation], Count, 0
[TOTAL_GC_TIME_G1_Old_Generation], Time(ms), 0
[TOTAL_GC_TIME_%_G1_Old_Generation], Time(%), 0.0
[TOTAL_GCs], Count, 1         #全局GC次数
[TOTAL_GC_TIME], Time(ms), 152   #全局GC时间
[TOTAL_GC_TIME_%], Time(%), 1.8997625296837894     #全局GC时间百分比
[READ], Operations, 954            #读总操作数
[READ], AverageLatency(us), 3428.7201257861634    #平均延迟(微秒)
[READ], MinLatency(us), 1889      #最小延迟(微秒)
[READ], MaxLatency(us), 163071      #最大延迟(微秒)
[READ], 95thPercentileLatency(us), 5395     #95%的样本延迟低于该值
[READ], 99thPercentileLatency(us), 10007   #99%的样本延迟低于该值
[READ], Return=OK, 954
[CLEANUP], Operations, 1
[CLEANUP], AverageLatency(us), 9964.0
[CLEANUP], MinLatency(us), 9960
[CLEANUP], MaxLatency(us), 9967
[CLEANUP], 95thPercentileLatency(us), 9967
[CLEANUP], 99thPercentileLatency(us), 9967
[INSERT], Operations, 46    #写入总操作数
[INSERT], AverageLatency(us), 11757.478260869566
[INSERT], MinLatency(us), 6932
[INSERT], MaxLatency(us), 36159
[INSERT], 95thPercentileLatency(us), 19951
[INSERT], 99thPercentileLatency(us), 36159
[INSERT], Return=OK, 46