1 TPC-C基准
TPC-C测试是由Transaction Processing Performance Council (TPC) 提出的标准基准测试,用于衡量数据库在大规模事务负载下的处理能力。它模拟了一个大型商品批发商的订单处理系统,测试目标是评估系统在并发事务负载下的吞吐量、延迟以及可扩展性。
虽然TPC-C并不模拟某个具体的业务场景,但其设计已经涵盖了大多数销售活动的基本特征,例如管理、销售、分发产品和服务等。因此,它既适用于汽车租赁、食品批发、零部件供应等多种业务场景,也能反映出不同事务类型和资源争用的综合影响。
TPC-C测试结果通常用来比较不同系统的性能,作为系统选型和配置的参考。目前,官网上测试结果最高的是下面两个(都是国产数据库),

2 BenchmarkSQL简介
BenchmarkSQL是TPC-C基准的开源实现,基于Java开发,使用JDBC接入到数据库进行压测。
它的总体架构由一列的数据结构,队列和处理仿真终端、用户和应用线程的线程组构成。
BenchmarkSQL的job调度器可以驱动数万个仓库(由缩放因数英文为scaling factor控制)。在进行负载压测时,负载的增长不会影响TPC-C标准中最重要的衡量指标-终端用户响应时间。
BenchmarkSQL支持的数据库和数据结构如下图所示:

从数据结构中可以看到各个实体(表)之间的数量关系,比如一个仓库(图中用W)表示,对应10个区域(District),每个区域有3000个消费者(Customer)。
3 BenchmarkSQL的部署
BenchmarkSQL的最新版本是V6,这个版本建议在docker中运行,部署的第一步是创建docker映像。
3.1 前提条件
运行BenchmarkSQL需要下面三个组件
Java开发环境(java-1.8.0-openjdk-devel及更新版本)
Maven build tool for Java
Docker及有docker使用授权的用户
3.2 映像创建
克隆git源码仓库
gh repo clone brvlant/benchmarksql-1
编译BenchmarkSQL源文件
$ cd ~/benchmarksql
$ mvn
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------< com.github.pgsql-io:benchmarksql >------------------
[INFO] Building A TPC-C like test tool 6.0.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ benchmarksql ---
[INFO] Deleting /Users/wieck/git/benchmarksql-6/target
[INFO]
[INFO] --- maven-resources-plugin:3.2.0:resources (default-resources) @ benchmarksql ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Using 'UTF-8' encoding to copy filtered properties files.
[INFO] Copying 49 resources
[INFO]
[INFO] --- maven-compiler-plugin:3.8.0:compile (default-compile) @ benchmarksql ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 18 source files to /Users/wieck/git/benchmarksql-6/target/classes
[INFO]
[INFO] --- maven-resources-plugin:3.2.0:testResources (default-testResources) @ benchmarksql ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Using 'UTF-8' encoding to copy filtered properties files.
[INFO] skip non existing resourceDirectory /Users/wieck/git/benchmarksql-6/src/test/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.8.0:testCompile (default-testCompile) @ benchmarksql ---
[INFO] No sources to compile
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ benchmarksql ---
[INFO] No tests to run.
[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ benchmarksql ---
[INFO] Building jar: /Users/wieck/git/benchmarksql-6/target/BenchmarkSQL.jar
[INFO]
[INFO] --- maven-dependency-plugin:3.0.0:copy-dependencies (copy-dependencies) @ benchmarksql ---
[INFO] Copying postgresql-42.2.19.jar to /Users/wieck/git/benchmarksql-6/target/lib/postgresql-42.2.19.jar
[INFO] Copying jcc-11.5.5.0.jar to /Users/wieck/git/benchmarksql-6/target/lib/jcc-11.5.5.0.jar
[INFO] Copying mysql-connector-java-8.0.23.jar to /Users/wieck/git/benchmarksql-6/target/lib/mysql-connector-java-8.0.23.jar
[INFO] Copying protobuf-java-3.11.4.jar to /Users/wieck/git/benchmarksql-6/target/lib/protobuf-java-3.11.4.jar
[INFO] Copying jaybird-4.0.3.java11.jar to /Users/wieck/git/benchmarksql-6/target/lib/jaybird-4.0.3.java11.jar
[INFO] Copying mssql-jdbc-9.2.1.jre8.jar to /Users/wieck/git/benchmarksql-6/target/lib/mssql-jdbc-9.2.1.jre8.jar
[INFO] Copying antlr4-runtime-4.7.2.jar to /Users/wieck/git/benchmarksql-6/target/lib/antlr4-runtime-4.7.2.jar
[INFO] Copying log4j-api-2.14.1.jar to /Users/wieck/git/benchmarksql-6/target/lib/log4j-api-2.14.1.jar
[INFO] Copying ojdbc8-21.1.0.0.jar to /Users/wieck/git/benchmarksql-6/target/lib/ojdbc8-21.1.0.0.jar
[INFO] Copying connector-api-1.5.jar to /Users/wieck/git/benchmarksql-6/target/lib/connector-api-1.5.jar
[INFO] Copying checker-qual-3.5.0.jar to /Users/wieck/git/benchmarksql-6/target/lib/checker-qual-3.5.0.jar
[INFO] Copying log4j-core-2.14.1.jar to /Users/wieck/git/benchmarksql-6/target/lib/log4j-core-2.14.1.jar
[INFO] Copying mariadb-java-client-2.7.2.jar to /Users/wieck/git/benchmarksql-6/target/lib/mariadb-java-client-2.7.2.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 5.360 s
[INFO] Finished at: 2021-04-13T17:56:05-05:00
编译后的目标文件如下
[root@d0980fdffdb0 /]# ls -l benchmarksql
total 104
-rw-r--r--. 1 root root 99974 Jan 11 2024 BenchmarkSQL.jar
drwxr-xr-x. 2 root root 4096 Jan 12 2024 lib
drwxr-xr-x. 1 root root 75 Jan 12 2024 run
创建docke映像
编译后的BenchmarkSQL可以直接运行,BenchmarkSQL也实现了基于Python的Flask服务,在安装了Python和flask及相关依赖后,通过flask启动BenchmarkSQL服务后,用户可以使用浏览器访问BenchmarkSQL,连接数据库,创建测试数据,运行测试任务,查看测试报告。官方建议通过docker来运行这个flask服务,提供了下面的docker文件
FROM centos:8
RUN yum -y update
RUN yum -y install epel-release
RUN yum -y install java-1.8.0-openjdk-headless
RUN yum -y install R-core bc
RUN yum -y install python3
RUN yum -y install python3-pip
ENV JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF8
ENV FLASK_ENV=development
RUN pip3 install pip --upgrade
RUN pip3 install Flask
RUN mkdir -p /benchmarksql
COPY ./FlaskService/ /benchmarksql/FlaskService/
COPY ./dist/ /benchmarksql/dist/
COPY ./lib/ /benchmarksql/lib/
COPY ./run/ /benchmarksql/run/
RUN mkdir -p /service_data
RUN ln -s /service_data/run_seq.dat /benchmarksql/run/.jTPCC_run_seq.dat
RUN ln -s /service_data/benchmarksql-error.log /benchmarksql/run/
RUN ln -s /service_data/extra_lib /benchmarksql/extra_lib
CMD ["python3", "/benchmarksql/FlaskService/main.py"]
这个docker文件位于BenchmarkSQL git仓库中,只要进入项目目录使用下面命令就可以创建docker映像了
docker built -t benchsqlmark:v1 .
3.3 创建docker容器
有了docker映像,就可以创建docker容器了,使用下面的命令
docker run --rm -itd --name benchmarksql-service \
--publish 5000:5000 \
--volume "`pwd`/service_data:/service_data" \
--user `id -u`:`id -g` \
8b26c4891b4c
检查容器是否启动成功
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d0980fdffdb0 8b26c4891b4c "python3 /benchmarks…" 36 minutes ago Up 36 minutes 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp benchmarksql-service
容器已经正常启动,访问的端口为5000,通过浏览器访问,显示如下界面:

BenchmarkSQL已经部署成功了。
4 对Oracle数据库进行压力测试
4.1 数据库的准备工作
创建测试账号并授权登陆数据库,运行官网提供的SQL脚本即可,如下
CREATE USER benchmarksql
IDENTIFIED BY "password"
DEFAULT TABLESPACE users
TEMPORARY TABLESPACE temp;
GRANT CONNECT TO benchmarksql;
GRANT CREATE PROCEDURE TO benchmarksql;
GRANT CREATE SEQUENCE TO benchmarksql;
GRANT CREATE SESSION TO benchmarksql;
GRANT CREATE TABLE TO benchmarksql;
GRANT CREATE TRIGGER TO benchmarksql;
GRANT CREATE TYPE TO benchmarksql;
GRANT UNLIMITED TABLESPACE TO benchmarksql;
4.2 连接数据库,在数据库内创建测试数据
打开BenchmarkSQL页面,Properties文件里显示的当前bulild和run使用的配置文件,在创建测试数据前,首先要编辑这个配置文件,第一步填入数据库的连接信息,如下
db=oracle driver=oracle.jdbc.driver.OracleDriver application=Generic conn=jdbc:oracle:thin:@//192.168.56.101:1521/freepdb1 user=benchmarksql password=password
上面需要注意的jdbc连接字符串,通过实例名连接格式如下:
jdbc:oracle:thin:@<host>:<port>:<SID>
如果是Oracle 12C以上版本,使用的是容器数据库,如例子中所示,就必须使用服务名进行连接了,格式如下:
jdbc:oracle:thin:@//<host>:<port>/<service_name>
紧接着是缩放因数和时间的配置,如仓库数量(关键参数,决定数据集的大小),loadWorkers参数(数据初始化任务的并行进程数量),下面的参数就和测试任务有关了
# Scaling and timing configuration
warehouses=5
loadWorkers=10
monkeys=2
sutThreads=10
maxDeliveryBGThreads=12
maxDeliveryBGPerWarehouse=1
rampupMins=10
rampupSUTMins=5
rampupTerminalMins=5
runMins=10
reportIntervalSecs=30
restartSUTThreadProbability=0.0
keyingTimeMultiplier=1.0
thinkTimeMultiplier=1.0
traceTerminalIO=false
再接着是测试时用到的参数,各类负载所占的比例
paymentWeight=43.2 orderStatusWeight=4.2 deliveryWeight=4.2 stockLevelWeight=4.2
根据自己的需要,编辑好配置文件之后,就可以点击下面的build按钮,创建测试数据集了。运行创建任务时,Current/Last Job Output会显示任务运行的进度。
4.3 运行压测任务
根据需要调整压测参数,点击run按键,运行测试,任务的进度如下:

4.4 查看压测报告
任务结束后,会生成压测报告,点击results下相应任务的Show Report这里截取部分结果,
结果汇总

NEW_ORDER 事务每分钟

5 注意事项
BenchmarkSQL也可以使用命令行运行,只需安装所需要的Java开发工具,不需要安装python及flask。




