吞吐测试概述

吞吐测试,说白了就是看系统在单位时间里能处理多少活儿。我做了十几年性能工程,每次接手一个新系统,第一个问的问题永远是:「你这系统到底能扛多少?」——这个「多少」,就是吞吐量。

很多人觉得吞吐测试就是压一压、跑个数字。其实没那么简单。你想想看,吞吐量是性能工程的「体温计」,测不准,后面所有优化都白搭。

吞吐量的定义

吞吐量(Throughput)的定义很直白:单位时间内系统成功处理的请求数量。

单位可以是秒、分钟、小时。请求可以是 HTTP 调用、数据库事务、消息队列投递——看你的业务场景。

核心公式:

吞吐量 = 成功处理的请求总数 / 时间窗口

举个例子:一个电商下单接口,1 分钟内成功处理了 3000 笔订单,那它的吞吐量就是 3000 req/min,或者换算成 50 req/s。

这里有个坑:「成功处理」四个字很关键。我在项目中遇到过,有人把服务端收到的请求数当吞吐量,结果压测报告漂亮得很,一上线就崩。为什么?因为很多请求虽然被接收了,但返回了 500 错误,或者超时了——这些不能算。

注意:吞吐量只统计业务成功的请求。4xx、5xx、超时重试都不计入。否则你测出来的就是「虚假繁荣」。

TPS 与 QPS 的区别

这两个概念,我几乎每次面试都会问。能说清楚的人,真不多。

指标 全称 含义 典型场景
TPS Transactions Per Second 每秒完成的事务数 数据库、支付、订单
QPS Queries Per Second 每秒完成的查询数 搜索引擎、读接口、缓存

它们的区别,我用一个例子讲清楚。

假设你在银行 ATM 上取钱。整个过程包括:插卡、输密码、选金额、出钞、退卡。这整个流程算 1 个 TPS。但在这个过程中,系统可能查询了 3 次账户余额、更新了 1 次流水、记录了 1 条日志——这些单独的查询操作,每个都是 1 个 QPS。

所以:TPS 是业务视角,QPS 是技术视角。

我的习惯:在压测报告里,我会同时给出 TPS 和 QPS。TPS 给老板看,说明业务承载能力;QPS 给开发看,定位具体瓶颈。缺一个,沟通就容易出问题。

我曾经在一个金融项目中,开发团队只盯着 QPS 优化,把单次查询从 50ms 优化到 5ms,QPS 涨了 10 倍。但业务 TPS 纹丝不动。为什么?因为瓶颈在事务锁上,查询再快也没用。这就是只看 QPS 不看 TPS 的典型教训。

吞吐测试在性能工程中的位置

性能工程是个大体系。我习惯把它分成三层:

  1. 基础层:响应时间、错误率、资源利用率
  2. 核心层:吞吐量(TPS/QPS)
  3. 决策层:容量规划、成本评估、SLA 达成

吞吐测试就在核心层。它承上启下——没有准确的吞吐数据,你没法做容量规划,也没法判断系统要不要扩容。

下面这张图,是我每次培训必画的。它展示了吞吐测试在整个性能工程中的位置:

吞吐测试在性能工程中的位置 基础层:性能监控与指标采集 响应时间 · 错误率 · CPU/内存/IO 利用率 · 网络延迟 「没有基础数据,一切分析都是空谈」 核心层:吞吐测试与瓶颈分析 TPS / QPS 测量 · 并发模型验证 · 瓶颈定位 「本章核心 —— 吞吐量是系统能力的标尺」 决策层:容量规划与成本优化 扩容决策 · SLA 达成评估 · 成本/性能平衡 「用数据说话,而不是拍脑袋」 数据流向

从图里能看出来:吞吐测试不是孤立存在的。它依赖基础层的监控数据,又为决策层的容量规划提供依据。我见过太多团队,上来就压测,压完出个数字就完事了。结果呢?线上流量一来,该崩还是崩。

我的经验:吞吐测试要回答三个问题:

  • 系统现在能扛多少?(当前吞吐量)
  • 瓶颈在哪?(哪个环节先撑不住)
  • 还能扩多少?(线性扩展还是很快到顶)

这三个问题答不上来,吞吐测试就是走过场。

吞吐测试的典型场景

我归纳了三个最常见的场景,你在工作中大概率会遇到:

场景 目标 典型方法
容量评估 确定系统最大承载能力 逐步加压直到系统崩溃
稳定性验证 验证长期运行下的吞吐表现 70%-80% 水位持续压测 24h+
版本对比 评估代码变更对性能的影响 相同场景下对比新旧版本 TPS

容量评估我做得最多。记得有一次,客户说系统能扛 10000 TPS。我一测,到 3000 就崩了。后来发现是数据库连接池配小了。嗯,这种坑,踩过一次就记住了。

一个小技巧:做容量评估时,别一上来就全力压。先跑个 10% 的流量,看看基线。然后每次加 20%,观察响应时间和错误率的变化。突然拐弯的地方,就是瓶颈所在。

吞吐测试的误区

最后聊几个常见误区。这些都是我在项目中真实踩过的坑:

  • 误区一:吞吐量越高越好 —— 不对。吞吐量高但响应时间暴涨,用户照样骂娘。要结合响应时间看。
  • 误区二:TPS 和 QPS 可以混用 —— 我见过有人把 QPS 当 TPS 报给老板,结果容量规划全错了。一定要区分清楚。
  • 误区三:压测一次就够了 —— 系统是动态的。代码在变、流量在变、配置在变。吞吐测试要常态化。

特别提醒:千万不要在线上环境做全量吞吐测试。我曾经见过一个团队,直接在线上压测,结果把数据库打挂了,业务停了 2 小时。吞吐测试一定要在隔离环境做,或者用影子流量。

好了,这一章就到这里。吞吐量的定义、TPS 与 QPS 的区别、吞吐测试在性能工程中的位置,这三个点你记住了,后面章节我们才能聊得更深。