PostgreSQL自带一款轻量级的压力测试工具pgbench。pgbench是一种在PostgreSQL上运行基准测试的简单程序,它可以在并发的数据库会话中重复运行相同的SQL命令。本文介绍如何使用pgbench测试PolarDB PostgreSQL版集群的最大性能。
测试环境
- 所有测试均在华北1(青岛)地域完成,PolarDB集群和ECS实例在同一可用区。
- ECS的实例规格:ecs.g5.16xlarge(64核 256 GiB)。
- ECS存储规格:SSD本地盘200 GiB。
- 网络类型:专有网络(VPC),PolarDB集群和ECS实例在同一VPC。
- 操作系统:CentOS 7.6 x64。
- PolarDB集群节点数:1个主节点和1个只读节点。
说明 CentOS 6不支持PostgreSQL 11。
测试指标
- 只读QPS
数据库只读时每秒执行的SQL数(仅包含SELECT)。
- 读写QPS
数据库读写时每秒执行的SQL数(包含INSERT、SELECT、UPDATE)。
准备工作
- 安装测试工具 执行如下命令在ECS实例中安装PostgreSQL 11。
yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm yum install -y postgresql11
- 修改集群参数 PolarDB集群需要修改的配置参数如下:
log_statement = 'none' enable_hashjoin=off enable_mergejoin=off enable_bitmapscan=off
说明 目前仅log_statement参数支持在控制台修改。设置集群参数的方式,请参见设置集群参数。修改配置参数后,重启集群让配置生效。
测试方法
- 通过以下命令配置环境变量:
export PGHOST=<PolarDB集群地址的私网地址> export PGPORT=<PolarDB集群地址的私网端口> export PGDATABASE=postgres export PGUSER=<PolarDB数据库用户名> export PGPASSWORD=<PolarDB对应用户的密码>
说明 如何查看PolarDB PostgreSQL版集群的连接地址,请参见查看集群地址。 - 根据目标库大小初始化测试数据,具体命令如下:
- 初始化数据10亿:
/usr/pgsql-11/bin/pgbench -i -s 10000
- 初始化数据5亿:
/usr/pgsql-11/bin/pgbench -i -s 5000
- 初始化数据1亿:
/usr/pgsql-11/bin/pgbench -i -s 1000
- 初始化数据10亿:
- 创建只读和读写的测试脚本。
- 创建只读脚本ro.sql:
- 在命令行执行
vim ro.sql
命令。 - 按I键进入编辑页面。
- 在编辑页面输入如下内容:
\set aid random_gaussian(1, :range, 10.0) SELECT abalance FROM pgbench_accounts WHERE aid = :aid;
- 按Esc键退出编辑,输入
:wq
进行保存并退出。
- 在命令行执行
- 创建读写脚本rw.sql:
- 在命令行执行
vim rw.sql
命令。 - 按I键进入编辑页面。
- 在编辑页面输入如下内容:
\set aid random_gaussian(1, :range, 10.0) \set bid random(1, 1 * :scale) \set tid random(1, 10 * :scale) \set delta random(-5000, 5000) BEGIN; UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid; SELECT abalance FROM pgbench_accounts WHERE aid = :aid; UPDATE pgbench_tellers SET tbalance = tbalance + :delta WHERE tid = :tid; UPDATE pgbench_branches SET bbalance = bbalance + :delta WHERE bid = :bid; INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP); END;
- 按Esc键退出编辑,输入
:wq
进行保存并退出。
- 在命令行执行
- 创建只读脚本ro.sql:
- 在命令行执行如下命令测试:
- 只读测试:
88C 710 GB(polar.pg.x8.12xlarge) 总数据量10亿,热数据1亿 /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 256 -j 128 -T 120 -D scale=10000 -D range=100000000 总数据量10亿,热数据5亿 /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 256 -j 128 -T 120 -D scale=10000 -D range=500000000 总数据量10亿,热数据10亿 /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 256 -j 128 -T 120 -D scale=10000 -D range=1000000000 64C 512 GB(polar.pg.x8.8xlarge) 总数据量10亿,热数据1亿 /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 256 -j 256 -T 120 -D scale=10000 -D range=100000000 总数据量10亿,热数据5亿 /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 256 -j 128 -T 120 -D scale=10000 -D range=500000000 总数据量10亿,热数据10亿 /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 256 -j 128 -T 120 -D scale=10000 -D range=1000000000 32C 256 GB(polar.pg.x8.4xlarge) 总数据量10亿,热数据1亿 /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 128 -j 128 -T 120 -D scale=10000 -D range=100000000 总数据量10亿,热数据5亿 /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 128 -j 128 -T 120 -D scale=10000 -D range=500000000 总数据量10亿,热数据10亿 /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 128 -j 128 -T 120 -D scale=10000 -D range=1000000000 16C 128 GB(polar.pg.x8.2xlarge) 总数据量10亿,热数据1亿 /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 64 -j 64 -T 120 -D scale=10000 -D range=100000000 总数据量10亿,热数据5亿 /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 64 -j 64 -T 120 -D scale=10000 -D range=500000000 总数据量10亿,热数据10亿 /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 64 -j 64 -T 120 -D scale=10000 -D range=1000000000 8C 64 GB(polar.pg.x8.xlarge) 总数据量10亿,热数据1亿 /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 64 -j 32 -T 120 -D scale=10000 -D range=100000000 总数据量10亿,热数据5亿 /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 64 -j 32 -T 120 -D scale=10000 -D range=500000000 总数据量10亿,热数据10亿 /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 64 -j 32 -T 120 -D scale=10000 -D range=1000000000 8C 32 GB(polar.pg.x4.xlarge) 总数据量10亿,热数据1亿 /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 64 -j 32 -T 120 -D scale=10000 -D range=100000000 总数据量10亿,热数据5亿 /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 64 -j 32 -T 120 -D scale=10000 -D range=500000000 总数据量10亿,热数据10亿 /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 64 -j 32 -T 120 -D scale=10000 -D range=1000000000 4C 16 GB(polar.pg.x4.large) 总数据量5亿,热数据5000万 /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 16 -j 16 -T 120 -D scale=5000 -D range=50000000 总数据量5亿,热数据1亿 /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 16 -j 16 -T 120 -D scale=5000 -D range=100000000 2C 8 GB(polar.pg.x4.medium) 总数据量1亿,热数据5000万 /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 16 -j 32 -T 120 -D scale=1000 -D range=50000000 总数据量1亿,热数据1亿 /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 16 -j 32 -T 120 -D scale=1000 -D range=100000000
- 读写测试:
88C 710 GB(polar.pg.x8.12xlarge) 总数据量10亿,热数据1亿 /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 128 -j 128 -T 120 -D scale=10000 -D range=100000000 总数据量10亿,热数据5亿 /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 128 -j 128 -T 120 -D scale=10000 -D range=500000000 总数据量10亿,热数据10亿 /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 128 -j 128 -T 120 -D scale=10000 -D range=1000000000 64C 512 GB(polar.pg.x8.8xlarge) 总数据量10亿,热数据1亿 /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 128 -j 128 -T 120 -D scale=10000 -D range=100000000 总数据量10亿,热数据5亿 /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 128 -j 128 -T 120 -D scale=10000 -D range=500000000 总数据量10亿,热数据10亿 /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 128 -j 128 -T 120 -D scale=10000 -D range=1000000000 32C 256 GB(polar.pg.x8.4xlarge) 总数据量10亿,热数据1亿 /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 128 -j 128 -T 120 -D scale=10000 -D range=100000000 总数据量10亿,热数据5亿 /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 128 -j 128 -T 120 -D scale=10000 -D range=500000000 总数据量10亿,热数据10亿 /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 128 -j 128 -T 120 -D scale=10000 -D range=1000000000 16C 128 GB(polar.pg.x8.2xlarge) 总数据量10亿,热数据1亿 /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 64 -j 64 -T 120 -D scale=10000 -D range=100000000 总数据量10亿,热数据5亿 /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 64 -j 64 -T 120 -D scale=10000 -D range=500000000 总数据量10亿,热数据10亿 /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 64 -j 64 -T 120 -D scale=10000 -D range=1000000000 8C 64 GB(polar.pg.x8.xlarge) 总数据量10亿,热数据1亿 /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 64 -j 64 -T 120 -D scale=10000 -D range=100000000 总数据量10亿,热数据5亿 /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 64 -j 64 -T 120 -D scale=10000 -D range=500000000 总数据量10亿,热数据10亿 /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 64 -j 64 -T 120 -D scale=10000 -D range=1000000000 8C 32 GB(polar.pg.x4.xlarge) 总数据量10亿,热数据1亿 /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 32 -j 32 -T 120 -D scale=10000 -D range=100000000 总数据量10亿,热数据5亿 /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 32 -j 32 -T 120 -D scale=10000 -D range=500000000 总数据量10亿,热数据10亿 /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 32 -j 32 -T 120 -D scale=10000 -D range=1000000000 4C 16 GB(polar.pg.x4.large) 总数据量5亿,热数据5000万 /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 16 -j 16 -T 120 -D scale=5000 -D range=50000000 总数据量5亿,热数据1亿 /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 16 -j 16 -T 120 -D scale=5000 -D range=100000000 2C 8 GB(polar.pg.x4.medium) 总数据量1亿,热数据5000万 /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 8 -j 8 -T 120 -D scale=1000 -D range=50000000 总数据量1亿,热数据1亿 /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 8 -j 8 -T 120 -D scale=1000 -D range=100000000
说明- scale:该值乘以10万表示测试数据量。
- range:表示活跃数据量。
- -c:表示测试连接数,测试连接数不代表该规格的最大连接数,最大连接数请参考计算节点规格。
- 只读测试:
测试结果
规格 | 测试数据量 | 热(活跃)数据量 | 只读QPS | 读写QPS |
---|---|---|---|---|
polar.pg.x8.12xlarge 88核 710 GB | 10亿 | 1亿 | 628863.87 | 259862.37 |
5亿 | 612612.86 | 243871.65 | ||
10亿 | 607162.83 | 217592.26 | ||
polar.pg.x8.8xlarge 64核 512 GB | 10亿 | 1亿 | 587612.46 | 227352.23 |
5亿 | 539371.54 | 209782.29 | ||
10亿 | 498728.28 | 199821.76 | ||
polar.pg.x8.4xlarge 32核 256 GB | 10亿 | 1亿 | 487138.21 | 237280.67 |
5亿 | 442339.25 | 215081.79 | ||
10亿 | 420348.28 | 198341.34 | ||
polar.pg.x8.2xlarge 16核 128 GB | 10亿 | 1亿 | 269781.83 | 168612.27 |
5亿 | 249271.32 | 131725.26 | ||
10亿 | 233219.96 | 109826.82 | ||
polar.pg.x8.xlarge 8核 64 GB | 10亿 | 1亿 | 148621.38 | 71787.83 |
5亿 | 130862.86 | 59298.44 | ||
10亿 | 123151.90 | 52324.72 | ||
polar.pg.x4.xlarge 8核 32 GB | 10亿 | 1亿 | 137366.92 | 59738.33 |
5亿 | 114932.64 | 52873.87 | ||
10亿 | 109248.29 | 48993.82 | ||
polar.pg.x4.large 4核 16 GB | 5亿 | 5000万 | 67289.76 | 40221.21 |
1亿 | 78393.56 | 46281.85 | ||
polar.pg.x4.medium 2核 8 GB | 1亿 | 5000万 | 26383.91 | 18983.55 |
1亿 | 27821.49 | 17986.46 |
说明
- 规格:PolarDB PostgreSQL版的规格代码。
- 测试数据量:本轮测试数据的记录条数。
- 热(活跃)数据量:本轮测试的查询、更新SQL的记录条数。
- 只读QPS:只读测试的结果,表示每秒请求数。
- 读写QPS:读写测试的结果,表示每秒请求数。