前言
数据库性能测试有助于掌握数据库状态并进行优化。对于 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 USER 和 CREATE DATABASE 语句分别用于创建数据库用户和数据库。这些命令会确保我们有一个名为 benchmarksql 的用户和一个属于这个用户的数据库。
对数据库进行基础调优
为了获得更好的测试结果,我们需要对 PostgreSQL 进行一些基础调优。PostgreSQL 的默认配置适用于各种硬件环境,但并不是为最佳性能而设计的,因此需要进行适当调整。
以下是一些推荐的配置:
| 参数名 | 配置值 | 说明 |
|---|---|---|
shared_buffers | 物理内存 * 0.25 | 定义数据库服务器可以使用的内存缓存大小,一般设置为物理内存的 25%。 |
effective_cache_size | 物理内存 * 0.75 | 用于告诉数据库操作系统的缓存有多少可以用于缓存数据,一般设置为物理内存的 75%。 |
work_mem | 16MB (最小) | 每个查询操作所使用的内存,用于排序操作和哈希表操作,设置太小会影响查询性能。 |
maintenance_work_mem | 至少 1GB | 用于维护操作(如索引重建等)时的内存大小。 |
max_connections | 100 | 允许的最大客户端连接数,过高会影响性能,推荐值为 100 左右。 |
wal_buffers | shared_buffers / 32 | 用于写入日志的内存大小,和 shared_buffers 有关。 |
max_parallel_workers_per_gather | 系统核数 * 0.5 | 控制并行查询时的工作线程数。 |
max_parallel_workers | 系统核数 | 设置允许的最大并行工作者数量。 |
max_worker_processes | 系统核数 | 设置允许的最大工作进程数量。 |
checkpoint_timeout | 15min (或更长) | 检查点之间的最大时间间隔,设置较长的时间可以减少磁盘 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 会重新创建数据,然后再进行测试。