pgbench测试中的TPS和延迟指标到底代表什么含义

来源:程序开发作者:陈远山头衔:网络博主
导读:本期聚焦于陈远山创作的《pgbench测试中的TPS和延迟指标到底代表什么含义》,敬请观看详情。压测PostgreSQL时,pgbench输出的TPS和延迟常让人困惑。TPS反映数据库每秒处理的事务数,直接体现吞吐能力;延迟则表示单个事务从发起到完成的时间消耗,关乎响应体验。两者并非孤立,高并发下TPS上涨往往伴随延迟增加。理解pgbench报告里的latency average、latency stddev以及每秒事务数波动,能帮我们判断瓶颈在磁盘、CPU还是锁竞争。本文用实际参数说明这些数字背后的测量逻辑与误读风险。

在使用pgbench对PostgreSQL进行基准测试时,最常被提及的两个结果是TPS与延迟。TPS是Transactions Per Second的缩写,表示每秒成功提交的事务数量;延迟则是每个事务从客户端发出到收到确认所经历的时间。很多人在看报告时只盯着TPS越高越好,却忽略了延迟的分布情况,导致线上系统在压测漂亮的情况下依然出现卡顿。

pgbench测试中的TPS和延迟指标到底代表什么含义

pgbench如何统计TPS与延迟

pgbench在运行结束时会打印出类似“tps = 1250.345678 (including connections establishing)”以及“latency average = 0.800 ms”这样的行。TPS的计算方式是用总完成事务数除以测试总时长,这里的时长默认包含连接建立阶段,如果使用-C参数每次事务新建连接,那么TPS会被建连开销显著拉低。延迟的平均值则是所有事务延迟的算术平均,pgbench还会给出标准差(latency stddev)来描述波动程度。

在源码层面,pgbench客户端会在每个事务开始前记录时间戳,事务提交后再次取时,差值就是该事务延迟。所有线程的延迟被汇总到主进程,最终算出平均与标准差。需要注意的是,pgbench默认的“事务”是由内置脚本定义的,例如pgbench自带的tpcb-like脚本包含多条SQL,因此这里的TPS并非单条SQL的每秒执行次数,而是完整业务脚本的吞吐。

如果我们自定义脚本,比如只执行一条主键查询,那么同样TPS下系统承载的SQL量会完全不同。因此在对比不同文章的pgbench结果时,必须先确认使用的脚本与并发数。下面是一段简单的自定义脚本与调用方式:

-- 自定义脚本 query.sql
set id random(1, 100000)
SELECT * FROM accounts WHERE id = :id;
pgbench -c 16 -j 4 -T 60 -f query.sql -n mydb

TPS与延迟之间的关系及误区

直观上TPS和延迟近似成反比:如果平均延迟是1毫秒,那么单线程理论TPS上限约1000。但数据库是多并发系统,当客户端并发数-c增加时,总TPS会上升,而平均延迟通常也会随之增加,因为请求开始排队。很多人误以为“延迟低就一定TPS高”,实际上在单连接下延迟极低但TPS也上不去,无法反映真实业务的多并发特征。

另一个常见误区是只看平均延迟。pgbench给出的latency average掩盖了长尾问题,若标准差很大,说明部分事务延迟可能是平均值的几十倍。这种毛刺在OLTP系统中往往对应锁等待或检查点落盘。我们可以通过--latency-limit=ms参数让超过阈值的事务被计入“late”统计,从而观察SLA达标率,而不是仅仅盯着平均线。

以下表格列出不同并发下某次测试的典型数值,可见TPS并未随并发线性增长,而延迟上升明显:

并发数TPS平均延迟(ms)延迟标准差(ms)
432001.250.4
1698001.631.2
64125005.108.7
1281280010.0222.5

如何利用指标定位性能瓶颈

当pgbench结果显示TPS达不到预期且延迟标准差巨大时,第一步应检查系统资源。通过topiostat观察CPU是否饱和、磁盘await是否过高。如果CPU空闲但TPS上不去,往往是锁竞争或事务冲突,例如默认tpcb脚本在高并发下对branches表更新会触发行锁。此时平均延迟中的大部分可能消耗在等待而非执行。

延迟指标还能辅助判断网络开销。若数据库与pgbench客户端不在同一主机,平均延迟会包含RTT。使用-h 127.0.0.1本地连接可排除网络,若本地延迟依旧高,则问题在数据库内部。我们还可以在pgbench运行时开启log_min_duration_statement记录慢查询,交叉比对延迟毛刺对应的SQL。

对于写密集场景,TPS受WAL写入速度限制。当延迟随TPS接近磁盘顺序写上限而陡增,说明该机器不适合更高吞吐。此时考虑组提交参数commit_delaycommit_siblings来合并WAL刷盘,能在一定范围内提升TPS并平滑延迟。示例调整如下:

-- 在 postgresql.conf 中调整
commit_delay = 10          # 毫秒,尝试等待合并提交
commit_siblings = 5        # 至少有这么多并发事务才延迟

重新跑pgbench后,若延迟标准差下降且TPS小幅提升,即证明瓶颈在WAL刷盘频率。反之若毫无变化,则应排查其他子系统。只有将TPS与延迟联合起来看,才能避免被单一数字误导,做出正确的扩容或调优决策。

pgbenchTPS延迟修改时间:2026-08-19 01:30:26

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。