pgbench 速查:默认值、六组参数、一个容易自欺的规模陷阱
pgbench 输出好看,但很容易产出一组毫无意义的数字。下面把参数、输出、陷阱放在一页。
1. 默认值
| 参数 | 默认 | 说明 |
|---|---|---|
-c | 1 | 并发客户端数(连接数) |
-j | 1 | pgbench 自身线程数 |
-t | 10 | 每客户端事务数(与 -T 互斥) |
-s | 1 | 规模因子,1 对应 10 万行 accounts |
-I | dtgvp | 初始化步骤:drop / tables / generate / vacuum / primary keys |
-M | simple | 查询协议:simple / extended / prepared |
-C | 关闭 | 每事务新建连接(用来测连接开销) |
-r | 关闭 | 每语句延迟报告 |
2. 规模与行数
-s | accounts | branches | tellers |
|---|---|---|---|
| 1 | 100,000 | 1 | 10 |
| 10 | 1,000,000 | 10 | 100 |
| 100 | 10,000,000 | 100 | 1,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的差异;这两项在真实容量评估里值得单独测。