吞吐测试基础:从定义到实战模型

吞吐测试,说白了就是看你的系统到底能扛多少活。我刚开始做性能测试那会儿,总觉得这玩意儿就是拼命压服务器,看它什么时候挂。后来踩了不少坑才明白——吞吐量不是压出来的,是设计出来的。

这一章咱们先把地基打牢。吞吐量是什么、TPS和QPS怎么区分、响应时间和吞吐量到底什么关系、性能测试模型怎么搭。这些概念搞不清楚,后面的调优全是瞎忙活。

吞吐量的定义:别被数字骗了

吞吐量(Throughput),单位时间内系统成功处理的请求数量。听起来简单对吧?但我在项目中见过太多人把「并发数」和「吞吐量」混为一谈。

核心公式:

吞吐量 = 成功处理的请求总数 / 测试持续时间

单位:TPS(每秒事务数)、QPS(每秒查询数)、RPS(每秒请求数)

举个例子。你压了1000个并发用户,系统每秒只能处理200个请求。那吞吐量就是200 TPS,不是1000。并发是压力,吞吐是能力——这两个概念千万别搞反。

TPS vs QPS:什么时候用哪个?

很多新手问我:「TPS和QPS到底有什么区别?」嗯,这个问题我当年也纠结过。

指标 全称 适用场景 典型例子
TPS Transactions Per Second 事务型系统(下单、支付、转账) 一次完整的订单提交
QPS Queries Per Second 查询型系统(搜索、列表、详情) 一次商品搜索请求
RPS Requests Per Second 通用场景,包含所有请求 任何HTTP请求

我个人习惯这样区分:如果一次操作涉及多个步骤(比如登录→查询→下单→支付),用TPS更合适。如果只是单纯的查询或读写,用QPS就够了。

避坑指南:我曾经在一个电商项目中,团队把QPS当TPS报给老板。结果上线后实际吞吐量只有预期的一半——因为一次下单包含了5次内部调用。所以,定义清楚你的「事务」边界,比数字本身更重要。

响应时间与吞吐量的关系:跷跷板效应

响应时间和吞吐量,就像跷跷板的两头。你压得越狠,响应时间就越长,吞吐量反而可能下降。为什么会这样?

我画个图你就明白了:

响应时间与吞吐量的关系曲线 并发用户数 高 低 响应时间 / 吞吐量 吞吐量 响应时间 拐点 拐点之前:吞吐量上升,响应时间平稳 → 健康区

你看这张图。刚开始压测时,并发用户数增加,吞吐量跟着涨,响应时间变化不大。但到了某个点——我管它叫「拐点」——再增加并发,响应时间开始飙升,吞吐量反而往下掉。

这就是典型的系统过载现象。我在做某支付系统的压测时,亲眼看着响应时间从50ms飙到5s,吞吐量从2000 TPS跌到300 TPS。原因很简单:线程池满了,请求开始排队,排队又导致超时重试,重试又加剧了排队——恶性循环。

注意:不要追求「最大吞吐量」。最大吞吐量往往意味着响应时间已经不可接受了。合理的做法是:在响应时间满足SLA的前提下,找到吞吐量的上限。

性能测试模型:三个核心阶段

做吞吐测试,不能上来就猛压。我总结了一套模型,分三个阶段走:

  1. 基准测试:单用户、低压力,摸清系统的基础能力。
  2. 负载测试:逐步加压,找到拐点和瓶颈。
  3. 压力测试:持续高压,验证系统的稳定性和极限。

这三个阶段缺一不可。我见过有人跳过基准测试直接上压力,结果系统一压就崩,连是代码问题还是配置问题都分不清。

实战中的性能测试模型

下面这张图是我在实际项目中常用的测试模型:

性能测试三阶段模型 基准测试 1个用户 获取基础指标 负载测试 逐步加压 找到拐点 压力测试 持续高压 验证稳定性 每个阶段的关键产出 • 基准测试:单用户响应时间、基础TPS、CPU/内存基线 • 负载测试:拐点位置、最大吞吐量、瓶颈资源 • 压力测试:系统稳定性、内存泄漏、连接池耗尽

你想想看,如果连单用户都跑不顺,压再多用户有意义吗?基准测试就是帮你确认「系统本身没问题」。负载测试是找「系统什么时候开始不行」。压力测试是看「系统不行了之后会怎样」。

一个真实的压测案例

我记得有一次帮某金融客户做吞吐测试。他们的系统号称能支撑5000 TPS,结果一压到2000 TPS就崩了。

我按三阶段模型走了一遍:

  • 基准测试:单用户响应时间12ms,没问题。
  • 负载测试:从100并发开始,每30秒增加100。到800并发时,响应时间突然从80ms跳到800ms。拐点出现了。
  • 压力测试:在800并发下持续跑30分钟,发现内存持续增长,GC越来越频繁。

问题出在哪?数据库连接池配置了200个,但应用层的线程池只有100个。线程池满了,请求排队,排队导致数据库连接超时,超时后重试又占用了更多线程——典型的线程饥饿。

调优方案很简单:把线程池从100调到200,同时给数据库连接池留20%的余量。调整后,系统稳定跑到了4500 TPS。

我的经验:吞吐测试不是一次性的。每次代码变更、配置调整、架构升级后,都要重新跑一遍三阶段模型。我见过太多「上线前压测没问题,上线后两周就崩」的案例——因为数据量变了、用户行为变了、依赖的服务变了。

本章小结

吞吐测试的基础,说白了就三件事:搞清楚指标含义、理解响应时间和吞吐量的关系、用对测试模型。

TPS和QPS别混用,响应时间和吞吐量是跷跷板,三阶段模型是压测的骨架。这些概念不扎实,后面的调优全是空中楼阁。