最近接到一个活需要对mongodb数据库的写入进行性能测试,之前从未接触过这方面的东西,经过一番搜索后发现了YCSB(全称为Yahoo! Cloud Serving Benchmark,github地址GitHub - brianfrankcooper/YCSB: Yahoo! Cloud Serving Benchmark),该性能测试工具由Java语言编写,主要用于云端或者服务器端的数据库性能测试工具,其内部涵盖了常见的NoSQL数据库产品,如Cassandra、MongoDB、HBase、Redis等等,在此记录一下过程
1.环境搭建
YCSB需求的环境为:
- Java
- Maven
- Python2(一定要使用python2,YCSB不支持python3)
首先安装java
sudo apt install openjdk-11-jdk
安装maven
sudo apt install maven
安装python2并设置为默认版本
sudo apt-get install python2
sudo ln -s /usr/bin/python2.7 /usr/bin/python
下载YCSB并解压
wget 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.测试
在ycsb目录下有workloads目录,该目录下有workloada、workloadb、workloadc等几个预设测试场景,分别为:
- workloada:读写均衡型,50%/50%,Reads/Writes
- workloadb:读多写少型,95%15%,Reads/Writes
- workloadc:只读型,100%,Reads
- workloadd:读最近写入记录型,95%15%,Reads/insert
- workloade:扫描小区间型,95%/5%,scan/insert
- workloadf:读写入记录均衡型,50%/50%,Reads/insert
其中的参数含义为
参数 | 含义 |
recordcount=1000 | YCSB load(加载元数据)命令的参数,默认值1000表示默认加载的记录条数,可以在命令行显示修改该值 |
operationcount=1000 | YCSB run(运行压力测试)命令的参数,默认值1000表示默认选取数据库中的1000条数据进行压力测试。对于workloada这种测试场景,就意味着读数据在500左右,写数据也在500左右 |
workload=site.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(近期写入的记录是热记录) |
可以根据自己的需求去设置测试场景参数,设置好后就可以使用命令去执行了,例如
./bin/ycsb run mongodb -threads 1 -P workloads/workloada -p mongodb.url=mongodb://localhost:27017/test?w=0
命令参数含义
参数 | 含义 |
bin/ycsb | 命令本身 |
load/run/shell | 指定这个命令的作用,分别代表加载数据/运行测试/交互界面 |
mongodb/hbase10/ba sic... | 指定这次测试使用的驱动,也就是这次究竟测的是什么数据库,有很多选项,可以ycsb --help看到所有 |
threads | 线程数,模拟客户端数 |
workloads/workloada | 指定测试的参数文件,默认有6种测试模板 |
-p fieldcount=1 | 单条记录字段个数:1 |
-p fieldlength=1024 | 每个字段的大小:1024Bytes |
-p table= | 自定义表名 |
-p clientbuffering=true | 客户端写缓存 |
-p mongodb.url= | 指定测试的数据库的认证信息,账号密码,地址端口和库名 |
执行完成后会输出结果
各行的含义为
参数 | 说明 |
RunTime(ms): | 运行总时间(毫秒) |
Throughput(ops/sec): | 吞吐量,每秒操作数 |
[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 时间百分比 |
Operations | 总操作数 |
AverageLatency(us) | 平均延迟(微秒) |
MinLatency(us) | 最小延迟(微秒) |
MaxLatency(us) | 最大延迟(微秒) |
95thPercentileLatency(us) : | 95%的样本延迟低于该值 |
99thPercentileLatency(us) | 99%的样本延迟低于该值 |
Return=OK | 结果(正确),总操作数 |