如何验证 PG 系产品稳定性?上压力测试吧!

数据库 PostgreSQL
BenchmarkSQL 会收集详细的性能统计数据,和操作系统性能数据(如果配置了的话)。示例的配置文件,默认会输出到一个以 my_result_ 开头的目录中。使用generateReport.sh脚本创建包含图形的 HTML 文件。这需要安装 R 语言,不过这超出了本文的范围。​

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 语言,不过这超出了本文的范围。

责任编辑:武晓燕 来源: 红石PG
相关推荐

2023-04-26 18:36:13

2011-07-28 16:06:13

MongoDBAutoShardinReplication

2009-02-04 09:22:40

稳定性服务器测试

2019-06-17 15:48:51

服务器测试方法软件

2022-05-19 08:47:31

ITCIO企业

2022-05-12 18:09:18

Kubernetes公有云

2023-06-30 08:43:36

2023-09-07 15:16:06

软件开发测试

2022-09-15 08:33:27

安全生产系统Review

2020-10-28 10:49:55

2016-10-18 13:31:23

CronPaxos服务

2011-04-27 21:54:45

2010-08-14 09:46:05

2023-06-15 11:48:09

2011-08-01 11:03:15

2020-07-28 08:07:14

ElasticSear

2020-07-13 08:10:13

软件设计系统

2011-12-21 09:46:46

程序员

2009-07-27 10:08:14

2013-11-01 11:16:16

苹果OS XOS X Maveri
点赞
收藏

51CTO技术栈公众号