KernelRanch
返回文章列表

pgbench 速查:默认值、六组参数、一个容易自欺的规模陷阱

2026-11-10 #数据库

pgbench 输出好看,但很容易产出一组毫无意义的数字。下面把参数、输出、陷阱放在一页。

1. 默认值

参数默认说明
-c1并发客户端数(连接数)
-j1pgbench 自身线程数
-t10每客户端事务数(与 -T 互斥)
-s1规模因子,1 对应 10 万行 accounts
-Idtgvp初始化步骤:drop / tables / generate / vacuum / primary keys
-Msimple查询协议:simple / extended / prepared
-C关闭每事务新建连接(用来测连接开销)
-r关闭每语句延迟报告

2. 规模与行数

-saccountsbranchestellers
1100,000110
101,000,00010100
10010,000,0001001,000

3. 六组常用命令

# 1) 初始化(会删同名表,注意别在业务库上跑)
pgbench -i -s 10 -U postgres -d bench

# 2) 只读压测 60 秒,4 客户端
pgbench -S -c 4 -T 60 -U postgres -d bench

# 3) 默认 TPC-B 类事务,8 客户端 4 线程
pgbench -c 8 -j 4 -T 60 -U postgres -d bench

# 4) 测连接开销:每事务新建连接
pgbench -C -S -c 4 -T 30 -U postgres -d bench

# 5) 每语句延迟,定位哪条 SQL 慢
pgbench -r -c 4 -T 30 -U postgres -d bench

# 6) 限速 + 延迟统计,模拟真实到达率
pgbench -R 500 -L 10 -c 20 -T 60 -U postgres -d bench

本机一次只读压测的真实输出:

number of clients: 4
number of transactions actually processed: 250286
latency average = 0.080 ms
tps = 50121.997719 (without initial connection time)

注意 tps 后面那句 without initial connection time:pgbench 默认把建连时间排除在 tps 之外。要包含它,用 -C 让每个事务都建连。

4. 一个容易自欺的陷阱

-s 要不小于 -c。默认脚本每个事务都要更新一行 pgbench_branches,而该表只有 -s 行。-c 超过 -s 时,多个客户端抢同一行,你测到的是行锁排队,不是数据库吞吐。

官方文档把这条写成"初始化规模因子应当至少等于你打算测试的最大客户端数",并直言否则"主要在测更新争用"。

5. 其余四个坑

跑太短。官方原话是"永远不要相信只跑几秒的测试"。几十秒以内的结果波动可能比你要观察的差异还大。

拿 -S 的 tps 代表整体能力。只读脚本只有一条 SELECT,比默认事务轻得多。两个数字不能混着引用。

在业务库上跑 -i。它会 drop 并重建四张 pgbench_* 表。

-r 有开销。逐语句计时会降低吞吐,比较两组数字时要么都开、要么都关。

小结

记住三件事就够用:-s 不小于 -c、跑够时间、-S 和默认事务不能混为一谈。

再补一句:pgbench 测的是"数据库能跑多快",不是"你的业务能跑多快"。它的事务是均匀随机的,没有热点、没有长事务、没有复杂 join。拿它做容量基线可以,拿它证明业务性能不行。

数据来源与检索时间

检索时间 2026-11-10。默认值与规模表来自文档,压测输出为本机 18.6 实跑。

来源URL对应数据
PostgreSQL 18 文档《pgbench》https://www.postgresql.org/docs/18/pgbench.html各参数默认值、-s 1 对应 10 万行、默认脚本的 7 条 SQL、-C 与 -r 的语义、规模因子应不小于客户端数的建议、"不要相信只跑几秒的测试"
PostgreSQL 18 文档《13.4 用 pgbench 做基准测试》https://www.postgresql.org/docs/18/pgbench.html同上(章节入口),用于交叉确认默认事务构成

核验说明

  • 第 3 节的输出为本机实跑(-S -c 4 -T 5,数据量 -s 2),tps 与延迟均原样记录。
  • 未做:没有验证 -R 限速下的 schedule lag 行为,也没有对比 -M prepared 与 simple 的差异;这两项在真实容量评估里值得单独测。