pgbench快速上手指南

139 阅读8分钟

一、背景

pgbench是一种在PostgreSQL上运行基准测试的简单程序, 它是pg自带的工具;

它在并发的数据库会话中一遍一遍地运行相同序列的 SQL 命令,并且计算平均事务率(每秒的事务数); 默认情况下,pgbench会测试一种基于 TPC-B 但是要更宽松的场景,其中在每个事务中涉及五个SELECT、UPDATE以及INSERT命令。

通过编写自己的事务脚本文件很容易用来测试其他情况;

测试的目的是了解硬件的处理能力;通过调整参数优化数据库事务处理性能




二、安装

  1. PG自带工具,不需要额外安装

  2. 使用限制




三、默认测试场景

  1. 初始化测试库

# 初始化测试数据库
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:指定数据库用户。
  1. 混合读写

# 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:指定数据库用户。
  1. 分析结果

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) :表示每秒完成的事务数量。

  • 延迟统计:包括平均延迟、中位数延迟、最大延迟等。

  • 客户端统计:每个客户端的性能表现。




四、自定义测试场景

  1. 初始化

# 
# 初始化测试数据库
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:指定数据库用户。
  1. 混合读写

# 自定义混合读写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:指定数据库用户。
  1. 分析结果

执行测试后,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 参数),观察不同数据量下的性能表现。

  • 事务类型:自定义事务类型,模拟更接近实际业务场景的负载。




五、注意事项与使用限制




六、补充

  1. 典型输出格式
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来创建并且填充这些表(当你在测试一个自定义脚本时,你不需要这一步,但是需要按你自己的测试需要做一些设置工作)。