一、背景
pgbench是一种在PostgreSQL上运行基准测试的简单程序, 它是pg自带的工具;
它在并发的数据库会话中一遍一遍地运行相同序列的 SQL 命令,并且计算平均事务率(每秒的事务数); 默认情况下,pgbench会测试一种基于 TPC-B 但是要更宽松的场景,其中在每个事务中涉及五个SELECT、UPDATE以及INSERT命令。
通过编写自己的事务脚本文件很容易用来测试其他情况;
测试的目的是了解硬件的处理能力;通过调整参数优化数据库事务处理性能
二、安装
-
PG自带工具,不需要额外安装
-
使用限制
三、默认测试场景
-
初始化测试库
# 初始化测试数据库
pgbench -i -s 100 -h 172.21.27.29 -p 1921 -d two -U postgres
-i:初始化测试数据库。
-s 100:指定测试数据的规模(默认是 100 个账户,可以根据需要调整)。
-h:指定数据库服务器的主机名。
-p:指定数据库服务器的端口号。
-d:指定数据库名称。
-U:指定数据库用户。
结果
postgres@xfzcvmmw185023:~$ pgbench -i -s 10 -h 172.21.27.29 -p 1921 -d two -U postgres
Password:
dropping old tables...
注意: 表 "pgbench_accounts" 不存在
注意: 表 "pgbench_branches" 不存在
注意: 表 "pgbench_history" 不存在
注意: 表 "pgbench_tellers" 不存在
creating tables...
generating data (client-side)...
1000000 of 1000000 tuples (100%) done (elapsed 0.77 s, remaining 0.00 s)
vacuuming...
creating primary keys...
done in 3.33 s (drop tables 0.00 s, create tables 0.02 s, client-side generate 1.06 s, vacuum 1.14 s, primary keys 1.10 s).
-
读
# pgbench 提供了一个默认的只读测试脚本,可以通过 -S 参数启用。
# 执行只读测试
pgbench -c 100 -T 20 -S -h 172.21.27.29 -p 1921 -d two -U postgres
-c 10:指定 10 个并发客户端。
-T 60:指定测试时长为 60 秒。
-S:启用只读测试模式。
-h 172.21.27.29:指定数据库服务器的主机名。
-p 1921:指定数据库服务器的端口号。
-d test:指定数据库名称。
-U postgres:指定数据库用户。
-
写
# pgbench 的默认测试场景(类似 TPC-B)主要涉及写操作(更新账户余额等)。可以通过以下命令执行写测试:
# 执行写测试
pgbench -c 10 -T 60 -h 172.21.27.29 -p 1921 -d test -U postgres
-c 10:指定 10 个并发客户端。
-T 60:指定测试时长为 60 秒。
-h 172.21.27.29:指定数据库服务器的主机名。
-p 1921:指定数据库服务器的端口号。
-d test:指定数据库名称。
-U postgres:指定数据库用户。
-
混合读写
# pgbench 的默认测试场景(类似 TPC-B)本身就是一个混合读写场景,因为它包含了读操作(如查询账户余额)和写操作(如更新账户余额)。可以通过以下命令执行混合读写测试
# 执行混合读写测试
pgbench -c 10 -T 60 -h 172.21.27.29 -p 1921 -d test -U postgres
-c 10:指定 10 个并发客户端。
-T 60:指定测试时长为 60 秒。
-h 172.21.27.29:指定数据库服务器的主机名。
-p 1921:指定数据库服务器的端口号。
-d test:指定数据库名称。
-U postgres:指定数据库用户。
-
分析结果
transaction type: <builtin: TPC-B (sort of)>
scaling factor: 100
query mode: simple
number of clients: 10
number of transactions per client: 1000
number of transactions actually processed: 10000/10000
tps = 1234.56 (including connections establishing)
tps = 1234.56 (excluding connections establishing)
执行测试后,pgbench 会输出测试结果,包括:
-
每秒事务数(TPS) :表示每秒完成的事务数量。
-
延迟统计:包括平均延迟、中位数延迟、最大延迟等。
-
客户端统计:每个客户端的性能表现。
四、自定义测试场景
-
初始化
#
# 初始化测试数据库
pgbench -i -s 100 -h 172.21.27.29 -p 1921 -d test -U postgres
-i:初始化测试数据库。
-s 100:指定测试数据的规模(默认是 100 个账户,可以根据需要调整)。
-h:指定数据库服务器的主机名。
-p:指定数据库服务器的端口号。
-d:指定数据库名称。
-U:指定数据库用户。
补充说明
- -s 插入的倍数,默认是1,即插入100000条;也就是执行多少次generate_series(1,100000)。
- 初始的数据库内容
创建四个表,如果同名表已经存在会被先删除
pgbench_accounts #账户表
pgbench_branches #支行表
pgbench_history #历史信息表
pgbench_tellers #出纳表
- 默认行为
在默认的情况下-s’比例因子’为 1,这些表初始包含的行数为:
table # of rows
pgbench_branches 1
pgbench_tellers 10
pgbench_accounts 100000
pgbench_history 0
-
读
# 自定义读测试脚本
-- read_test.sql
\set aid random(1, 100000)
SELECT abalance FROM accounts WHERE aid = :aid;
#
# 执行读测试
pgbench -c 10 -T 60 -f read_test.sql -h 172.21.27.29 -p 1921 -d test -U postgres
-c 10:指定 10 个并发客户端。
-T 60:指定测试时长为 60 秒。
-f read_test.sql:指定自定义的读测试脚本。
-h 172.21.27.29:指定数据库服务器的主机名。
-p 1921:指定数据库服务器的端口号。
-d test:指定数据库名称。
-U postgres:指定数据库用户。
-
写
# 自定义写测试sql
-- write_test.sql
\set aid random(1, 100000)
\set delta random(-5000, 5000)
UPDATE accounts SET abalance = abalance + :delta WHERE aid = :aid;
# 执行写测试
pgbench -c 10 -T 60 -f write_test.sql -h 172.21.27.29 -p 1921 -d test -U postgres
-c 10:指定 10 个并发客户端。
-T 60:指定测试时长为 60 秒。
-f write_test.sql:指定自定义的写测试脚本。
-h 172.21.27.29:指定数据库服务器的主机名。
-p 1921:指定数据库服务器的端口号。
-d test:指定数据库名称。
-U postgres:指定数据库用户。
-
混合读写
# 自定义混合读写sql
-- mixed_test.sql
\set aid random(1, 100000)
\set delta random(-5000, 5000)
-- 读操作
SELECT abalance FROM accounts WHERE aid = :aid;
-- 写操作
UPDATE accounts SET abalance = abalance + :delta WHERE aid = :aid;
# 执行混合读写测试
pgbench -c 10 -T 60 -f mixed_test.sql -h 172.21.27.29 -p 1921 -d test -U postgres
-c 10:指定 10 个并发客户端。
-T 60:指定测试时长为 60 秒。
-f mixed_test.sql:指定自定义的混合读写测试脚本。
-h 172.21.27.29:指定数据库服务器的主机名。
-p 1921:指定数据库服务器的端口号。
-d test:指定数据库名称。
-U postgres:指定数据库用户。
-
分析结果
执行测试后,pgbench 会输出测试结果,包括:
- 每秒事务数(TPS) :表示每秒完成的事务数量。
- 延迟统计:包括平均延迟、中位数延迟、最大延迟等。
- 客户端统计:每个客户端的性能表现。
transaction type: <builtin: TPC-B (sort of)>
scaling factor: 100
query mode: simple
number of clients: 10
number of transactions per client: 1000
number of transactions actually processed: 10000/10000
tps = 1234.56 (including connections establishing)
tps = 1234.56 (excluding connections establishing)
参数调整
根据测试结果,可以调整以下参数以优化测试:
-
并发客户端数:增加或减少并发客户端数量,观察 TPS 和延迟的变化。
-
测试时长:增加测试时长以获取更稳定的性能数据。
-
数据规模:调整数据规模(
-s参数),观察不同数据量下的性能表现。 -
事务类型:自定义事务类型,模拟更接近实际业务场景的负载。
五、注意事项与使用限制
六、补充
- 典型输出格式
transaction type: <builtin: TPC-B (sort of)>
scaling factor: 10 # 有四张表,这里是10,相当于每个表的数据*10(大概10倍,并不是准确的) -s
query mode: simple # 共三种查询方式:-M, --protocol=simple|extended|prepared
number of clients: 10 # 并行客户端连接数 -c
number of threads: 1 # 工作线程数,多个客户端公用这些工作线程 -j
number of transactions per client: 1000
number of transactions actually processed: 10000/10000
tps = 85.184871 (including connections establishing)
tps = 85.296346 (excluding connections establishing)
前六行报告一些最重要的参数设置。
接下来的行报告完成的事务数以及预期的事务数(后者就是客户端数量与每个客户端事务数的乘积),除非运行在完成之前失败,这些值应该是相等的(在-T模式中,只有实际的事务数会被打印出来)。
最后两行报告每秒的事务数,分别代表包括和不包括开始数据库会话所花时间的情况。
默认的类 TPC-B 事务测试要求预先设置好特定的表。
可以使用-i(初始化)选项调用pgbench来创建并且填充这些表(当你在测试一个自定义脚本时,你不需要这一步,但是需要按你自己的测试需要做一些设置工作)。