BenchMarkSQL 5.0测试PostgreSQL

简介

BenchmarkSQL是一款经典的开源数据库测试工具,内嵌了TPCC测试脚本,可以对PostgreSQL、Oracle以及Firebird等数据库进行测试.。

TPC-C 于 1992 年 7 月 23 日认可为新的基准测试。TPC(Transaction Processing Performance Council,事务处理性能委员会)-C是衡量联机事务处理(OLTP,Online TransactionProcessing)系统的工业标准,是行业中公认的权威和最为复杂的在线事务处理基准测试。它通过模拟仓库和订单管理系统,测试广泛的数据库功能,包括查询、更新和  mini-batch事务(队列式小批量事务)。TPC-C基准测试针对一种模拟订单录入与销售环境测量每分钟事务(tpmC-transactions per minute)吞吐量。

测试模型

测试用到的模型是一个大型的批发销售公司,在地理分布的多个区域有业务,并且使用仓库管理。当业务扩展的时候,公司将添加新的仓库。每个仓库负责十个区域的供货,每个区域 3000 个客户服务,每个仓库维护 100000 种商品的库存纪录。

BenchMarkSQL 5.0测试PostgreSQL

 

 

TPC-C 标准测试模拟了 5 种事务处理,通过这些事务处理来模拟真实的用户操作,事务分别为新订单(New-Order)、支付操作(Payment)、订单状态查询(Order-Status)、发货(Delivery)、库存状态查询(Stock-Level)。下面将对其执行的事务内容及特点进行详细介绍.

1.新订单(New-Order)

事务内容:对于任意一个客户端,从固定的仓库随机选取 5-15  件商品,创建新订单.其中 1%的订单要由假想的用户操作失败而回滚。

主要特点:中量级、读写频繁、要求响应快.

2.支付操作(Payment)

事务内容:对于任意一个客户端,从固定的仓库随机选取一个辖区及其内用户,采用随机的金额支付一笔订单,并作相应历史记录。

主要特点:轻量级,读写频繁,要求响应快

3.订单状态查询(Order-Status)

事务内容:对于任意一个客户端,从固定的仓库随机选取一个辖区及其内用户,读取其最后一条订单,显示订单内每件商品的状态。

主要特点:中量级,只读频率低,要求响应快

4.发货(Delivery)

事务内容:对于任意一个客户端,随机选取一个发货包,更新被处理订单的用户余额,并把该订单从新订单中删除.

主要特点:1-10 个批量,读写频率低,较宽松的响应时间

5.库存状态查询(Stock-Level)

事物内容:对于任意一个客户端,从固定的仓库和辖区随机选取最后 20 条订单,查看订单中所有的货物的库存,计算并显示所有库存低于随机生成域值的商品数量.

主要特点:重量级,只读频率低,较宽松的响应时间.

演示环境

PostgreSQL:13.0

OS:CentOS 8

openjdk version "1.8.0_292"

ant:1.10.5

benchmarksql:5.0

获取版本

访问官网获取最新版本benchmarksql-5.0.zip

https://sourceforge.net/projects/benchmarksql/

编译
unzip benchmarksql-5.0.zip
ant
配置参数

进入run目录,配置如下参数

vi props.pg

db=postgres
driver=org.postgresql.Driver
conn=jdbc:postgresql://localhost:5432/postgres
user=benchmarksql
password=PWbmsql

warehouses=1
loadWorkers=4

terminals=1
//To run specified transactions per terminal- runMins must equal zero
runTxnsPerTerminal=10
//To run for specified minutes- runTxnsPerTerminal must equal zero
runMins=0
//Number of total transactions per minute
limitTxnsPerMin=300

//Set to true to run in 4.x compatible mode. Set to false to use the
//entire configured database evenly.
terminalWarehouseFixed=true

//The following five values must add up to 100
//The default percentages of 45, 43, 4, 4 & 4 match the TPC-C spec
newOrderWeight=45
paymentWeight=43
orderStatusWeight=4
deliveryWeight=4
stockLevelWeight=4

// Directory name to create for collecting detailed result data.
// Comment this out to suppress.
resultDirectory=my_result_%tY-%tm-%td_%tH%tM%tS
osCollectorScript=./misc/os_collector_linux.py
osCollectorInterval=1
//osCollectorSSHAddr=user@dbhost
osCollectorDevices=net_eth0 blk_sda

主要参数解释如下

参数 说明
db postgres 指定数据库类型(修改后增加的数据库类型)
driver org.postgresql.Driver 数据库的驱动类名称,不需要更改
conn

jdbc:postgresql://localhost:5432/postgres

连接字符串,需要更改localhost为对应pg服务IP、5432位对应pg服务端口、postgres为对应测试数据库名
user postgres 用户名
password 123456 用户密码
warehouses 10 初始化加载数据时,需要创建多少仓库的数据。每仓库约80MB数据,数量根据实际服务器内存配置。
loadWorkers 4 表示加载数据时,开启加载数据的进程数,加载速度会随worker数量的增加而有所提升。
terminals 20 终端数量,指同时有多少终端并发执行,通常设置为CPU线程总数的2~6倍
runTxnsPerTerminal 0 每个终端(terminal)运行的固定事务数量,例如:如果该值设置为10,意味着每个terminal运行10个事务,如果有32个终端,那整体运行320个事务后,测试结束。该参数配置为非0值时,下面的runMins参数必须设置为0
runMins 1 要测试的整体时间,单位为分钟,如果runMins设置为60,那么测试持续1小时后结束。该值设置为非0值时,runTxnsPerTerminal参数必须设置为0。这两个参数不能同时设置为正整数,如果设置其中一个,另一个必须为0,主要区别是runMins定义时间长度来控制测试时间;runTxnsPerTerminal定义事务总数来控制时间。
limitTnxsPermin 0 限制每分钟执行的事务总数。0表示不限制
terminalWarehouseFixed true 用于指定终端和仓库的绑定模式,设置为true时可以运行4.x兼容模式,意思为每个终端都有一个固定的仓库。设置为false时可以均匀的使用数据库整体配置,TPCC规定每个终端都必须有一个绑定的仓库,所以一般使用默认值true。

 

数据准备

创建数据库表并加载数据

./runDatabaseBuild.sh props.pg
执行测试

执行如下命令开始测试

./runBenchmark.sh props.pg

BenchMarkSQL 5.0测试PostgreSQL

 测试完后会显示简要的测试结果,包括平均tpmC值(每分钟执行的事务数--每分钟能够处理的订单数量),tpmTOTAL(总订单量)等等。

流量指标(Throughput,简称tpmC):按照TPC组织的定义,流量指标描述了系统在执行支付操作、订单状态查询、发货和库存状态查询这4种交易的同时,每分钟可以处理多少个新订单交易。所有交易的响应时间必须满 足TPC-C测试规范的要求,且各种交易数量所占的比例也应该满足TPC-C测试规范的要求。在这种情况下,流量指标值越大说明系统的联机事务处理能力越高。

生成报告

生成图形的脚本generateReport.sh要求操作系统环境中已经安装了R语言

./generateReport.sh my_result_2021-05-23_175724

可以通过html查看生成的报告

BenchMarkSQL 5.0测试PostgreSQL

重新运行测试

执行runDatabaseDestroy.sh脚本带配置文件可以将所有的数据和表都删除,然后再重新修改配置后运行测试。

BenchMarkSQL 5.0测试PostgreSQL

上一篇:Mycat实现MySQL主从复制和读写分离(双主双从)


下一篇:node 连接MySql数据库