使用 BenchmarkSQL 对 PostgreSQL 进行性能测试

453 阅读6分钟

前言

数据库性能测试有助于掌握数据库状态并进行优化。对于 PostgreSQL,pgbench 是一个很好的测试工具,但 BenchmarkSQL 支持多种数据库,可以更好地进行数据库之间的横向性能对比。本指南将一步步带你完成 BenchmarkSQL 在 PostgreSQL 上的安装、配置和测试。

实施环境

  • Fedora 40
  • 至少 4 vCPU + 8 GB 内存的被测机器

安装 BenchmarkSQL

BenchmarkSQL 官方推荐使用 Docker 安装,但这里我们直接进行编译安装,这样可以帮助大家更好地理解安装过程。

首先,确保安装 Maven 和 JDK-8:

sudo dnf install maven java-1.8.0-openjdk -y

Maven 是一个项目管理和构建工具,我们使用它来编译 BenchmarkSQL,而 JDK-8 是 Java 的开发工具包,BenchmarkSQL 的代码需要它来运行。

然后从 Git 仓库中拉取源码并编译:

git clone https://github.com/wieck/benchmarksql.git
cd benchmarksql
mvn clean package

TIPS: 为 Maven 增加阿里云的代理可以有效缩短编译时间。

创建测试用数据库

接下来,我们需要创建一个用于测试的 PostgreSQL 数据库。

首先安装 PostgreSQL,并初始化数据库:

sudo dnf install postgresql
initdb -D /path/to/data_dir

initdb 命令会初始化数据库的存储目录。在初始化过程中,你需要指定一个数据目录来存储数据库文件。

接着启动 PostgreSQL 服务:

pg_ctl -D /path/to/data_dir -l logfile start

pg_ctl 命令用于启动数据库,-D 参数指定数据目录,-l logfile 参数用于记录日志。

然后进入 PostgreSQL 命令行工具 psql,创建一个用于测试的用户和数据库:

psql postgres

进入 psql 后,执行以下 SQL 语句来创建用户和数据库:

CREATE USER benchmarksql WITH ENCRYPTED PASSWORD 'PWbmsql';
CREATE DATABASE benchmarksql OWNER benchmarksql;

CREATE USERCREATE DATABASE 语句分别用于创建数据库用户和数据库。这些命令会确保我们有一个名为 benchmarksql 的用户和一个属于这个用户的数据库。

对数据库进行基础调优

为了获得更好的测试结果,我们需要对 PostgreSQL 进行一些基础调优。PostgreSQL 的默认配置适用于各种硬件环境,但并不是为最佳性能而设计的,因此需要进行适当调整。

以下是一些推荐的配置:

参数名配置值说明
shared_buffers物理内存 * 0.25定义数据库服务器可以使用的内存缓存大小,一般设置为物理内存的 25%。
effective_cache_size物理内存 * 0.75用于告诉数据库操作系统的缓存有多少可以用于缓存数据,一般设置为物理内存的 75%。
work_mem16MB (最小)每个查询操作所使用的内存,用于排序操作和哈希表操作,设置太小会影响查询性能。
maintenance_work_mem至少 1GB用于维护操作(如索引重建等)时的内存大小。
max_connections100允许的最大客户端连接数,过高会影响性能,推荐值为 100 左右。
wal_buffersshared_buffers / 32用于写入日志的内存大小,和 shared_buffers 有关。
max_parallel_workers_per_gather系统核数 * 0.5控制并行查询时的工作线程数。
max_parallel_workers系统核数设置允许的最大并行工作者数量。
max_worker_processes系统核数设置允许的最大工作进程数量。
checkpoint_timeout15min (或更长)检查点之间的最大时间间隔,设置较长的时间可以减少磁盘 IO 负担。

这些参数会帮助数据库更高效地利用系统资源,从而提高性能。

修改 BenchmarkSQL 配置文件

BenchmarkSQL 需要修改配置文件来控制压力测试的流程。可以直接使用官方示例并进行修改:

cd /path/to/benchmarksql/target/run
cp ./sample.postgresql.properties test.properties
vi test.properties

vi 中打开 test.properties 文件后,根据需要修改以下参数:

  • warehouses:控制仓库的数量,用于模拟数据库的大小。一个仓库的大小大约为 100MB,一般建议设置为物理内存的 3-6 倍,以便模拟更高负载。
  • loadWorkers:控制在创建数据库数据时同时执行的 worker 数量,worker 是执行任务的工作线程。
  • runMins:测试运行的时间(分钟),可以根据需要调整这个时间。
  • conn:数据库连接字符串,格式为 jdbc:postgresql://<服务器地址>:<端口>/<数据库名>,例如 jdbc:postgresql://10.1.1.142:5433/benchmarksql

初始化数据库并进行测试

配置好之后,我们需要初始化数据库并进行性能测试。初始化数据库的过程会创建表结构并填充数据,这些数据将用于后续的压力测试。

首先,运行以下命令来初始化数据库:

cd /path/to/benchmarksql/target/run
./runDatabaseBuild.sh test.properties

在初始化过程中,BenchmarkSQL 会执行以下步骤:

  • 创建表结构并填充数据:为数据库创建所有需要的表并插入测试数据。
  • 创建外键关系:设置表之间的关系,确保数据一致性。
  • 执行 VACUUM:清理数据库中的死元组,确保数据库高效运转。

完成初始化后,就可以进行压力测试了:

./runBenchmark.sh test.properties

这个命令会根据配置文件中的设置对数据库进行压力测试,测试的结果会被记录下来以供分析。

生成测试报告

BenchmarkSQL 会将测试报告存储在一个文件夹中,默认文件名以“my_result”开头。报告文件中包含了测试的详细信息,但它是以纯文本格式存储的,因此可以通过脚本生成更易于阅读的 HTML 格式报告。

首先,安装必要的 Python 依赖:

sudo dnf install python3-numpy python3-matplotlib

这些库用于处理数据和生成图表。然后运行以下命令生成报告:

./generateReport.py --resultdir=my_result_2024-10-12_121005
# 生成的报告文件为 my_result_2024-10-12_121005.html

生成的报告文件是 HTML 格式的,可以在浏览器中查看,这样可以更直观地分析性能测试的结果。

重复进行测试

如果你想要重复进行测试,可以先销毁之前的数据,然后重新初始化数据库。这样可以确保每次测试都是在相同的初始条件下进行的。

执行以下命令来销毁并重新初始化数据库:

./runDatabaseDestroy.sh test.properties
./runDatabaseBuild.sh test.properties
./runBenchmark.sh test.properties

runDatabaseDestroy.sh 会删除数据库中的所有数据,runDatabaseBuild.sh 会重新创建数据,然后再进行测试。

参考资料

BenchmarkSQL 官方文档