BenchmarkSQL 简介
BenchmarkSQL 是用 Java 实现的,使用 JDBC 对 SQL 数据库进行压力测试。整体的架构中包括了一系列数据结构、队列和线程组,用来模拟工作的终端、用户和应用线程。
它的架构允许 BenchmarkSQL 驱动 TPC-C 的配置,扩展到数千个仓库(称为扩展因子),而不会压垮测试驱动上的作业调度程序。而且,它在做到这一点时,还能不牺牲 TPC-C 中最重要的一个测量指标,即最终用户在访问终端体验到的响应时间。
创建用户和数据库
作为 Unix 用户postgres,使用psql客户端连接到postgres数据库,并执行CREATE USER和CREATE DATABASE命令。
CREATE USER benchmarksql WITH ENCRYPTED PASSWORD 'changeme';
CREATE DATABASE benchmarksql OWNER benchmarksql;
构建 BenchmarkSQL
BenchmarkSQL V6 旨在内置到 Docker 容器中,并通过其基于 Flask 的 WEB UI 或 API 进行控制。这允许在服务器和云系统上轻松部署基准测试程序,同时通过浏览器或脚本对其进行控制。
要求
要运行 BenchmarkSQL,有下面这些要求:
• Java 开发环境(java-1.8.0-openjdk-devel 或更高版本)。
• 适用于 Java 的 Maven 构建工具。
• Docker 和一个有权使用它的用户账户。这取决于您的操作系统。在基于 RedHat 的系统上,通常的方法是,运行sudo yum install -y docker来安装 Docker,并运行命令sudo usermod -a -G docker <USERNAME>,以使允许使用的用户成为 docker 用户组成员。
构建过程
在构建机器上,需要有 Java 开发环境和 Maven 工具,因为 Docker 容器只会安装 Java 的运行时环境。因此,需要在容器外部构建BenchmarkSQL.jar文件。
在安装完上述的依赖组件后,需要克隆 BenchmarkSQL 的 git 仓库(假设用户名为 wieck 并克隆到 ~/benchmarksql 目录中),进行构建:
$ git clone https://github.com/wieck/benchmarksql.git
$ 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
[INFO] ------------------------------------------------------------------------
您的 "Total time" 在第一次运行时很可能不只 5 秒。
预计它会运行几分钟,因为生成的 Docker 镜像大小约为 1.7GB,其中很多要通过您的互联网连接进行提取。
创建基准测试的配置文件
在 Maven 创建的target目录下,切换到run目录,复制您数据库的属性文件,然后编辑副本文件,以匹配您的系统设置和所需的扩展规格。
$ cd target/run
$ cp sample.RDBMS.properties my.properties
$ vi my.properties
请注意,提供的示例配置旨在测试您数据库的功能。BenchmarkSQL 可以连接到数据库并执行事务。该配置不是用来运行基准测试的。要使该配置可用来运行基准测试,您需要让该配置与您的数据库服务器大小和工作负载相匹配。先暂时保留设置的值,并执行首次功能测试。
BenchmarkSQL 数据库中,每个配置的仓库的初始大小约为 100MB。一个典型的设置是,数据库的大小为服务器物理内存的 2 ~ 5 倍。
同样,并发的数据库连接数(配置参数terminals)应该是 CPU 线程数的 2 ~ 6 倍。
最后但并非最不重要的一点是,基准测试运行通常需要数小时,甚至数天。这是因为基于上面的数据库大小,需要很长时间才能达到稳定状态,并确保数据库相关功能(如检查点和清理)的所有性能都包含在测量中。
所以,你可以看到,对于一个现代服务器,它有 32 ~ 256 个 CPU 线程和 64 ~ 512GB 的内存,我们会使用到数千个仓库和数百个并发的数据库连接。
构建表结构和加载初始数据
使用您的配置文件,执行runDatabaseBuild.sh脚本。
$ ./runDatabaseBuild.sh my.properties
# ------------------------------------------------------------
# Loading SQL file ./sql.common/tableCreates.sql
# ------------------------------------------------------------
create table bmsql_config (
cfg_namevarchar(30) primary key,
cfg_value varchar(50)
);
create table bmsql_warehouse (
w_id integer not null,
w_ytd decimal(12,2),
[...]
Starting BenchmarkSQL LoadData
driver=org.postgresql.Driver
conn=jdbc:postgresql://localhost:5432/benchmarksql
user=benchmarksql
password=***********
warehouses=30
loadWorkers=10
fileLocation (not defined)
csvNullValue (not defined - using default 'NULL')
Worker 000: Loading ITEM
Worker 001: Loading Warehouse 1
Worker 002: Loading Warehouse 2
Worker 003: Loading Warehouse 3
[...]
Worker 000: Loading Warehouse 30 done
Worker 008: Loading Warehouse 29 done
# ------------------------------------------------------------
# Loading SQL file ./sql.common/indexCreates.sql
# ------------------------------------------------------------
alter table bmsql_warehouse add constraint bmsql_warehouse_pkey
primary key (w_id);
alter table bmsql_district add constraint bmsql_district_pkey
primary key (d_w_id, d_id);
[...]
vacuum analyze;
运行配置的基准测试
一旦表中有了必要的数据,您就可以运行基准测试。
$ ./runBenchmark.sh my.properties
基准测试应该会采用配置的并发连接数(terminals),运行指定的持续时间或事务数。
基准测试的最终结果将会以下面的报告形式呈现:
01:58:09,081 [Thread-1] INFO jTPCC : Term-00,
01:58:09,082 [Thread-1] INFO jTPCC : Term-00, Measured tpmC (NewOrders) = 179.55
01:58:09,082 [Thread-1] INFO jTPCC : Term-00, Measured tpmTOTAL = 329.17
01:58:09,082 [Thread-1] INFO jTPCC : Term-00, Session Start = 2016-05-25 01:58:07
01:58:09,082 [Thread-1] INFO jTPCC : Term-00, Session End = 2016-05-25 01:58:09
01:58:09,082 [Thread-1] INFO jTPCC : Term-00, Transaction Count = 10
至此,您已经有一个正常工作的设置了。
扩展基准测试的配置
将my.properties文件中的扩展比例更改为正确的值(包括仓库数和并发的连接/终端数)。从基于事务的计数切换到基于时间的计数:
runTxnsPerTerminal=0
runMins=180
如果需要的话,可以运行下面的命令,重新构建数据库:
$ ./runDatabaseDestroy.sh my.properties
$ ./runDatabaseBuild.sh my.properties
然后再次运行基准测试。
重置数据并重复测试。
结果报告
BenchmarkSQL 会收集详细的性能统计数据,和操作系统性能数据(如果配置了的话)。示例的配置文件,默认会输出到一个以 my_result_ 开头的目录中。
使用generateReport.sh脚本创建包含图形的 HTML 文件。这需要安装 R 语言,不过这超出了本文的范围。