性能测试:性能测试中的核心指标应该怎么看

性能测试里最常见的误区之一,就是只盯一两个数字下结论。

例如:

  • QPS 很高,所以系统没问题
  • 平均响应 200ms,所以体验很好
  • CPU 70%,所以资源还够

这些判断都太粗。
它们不是完全错,而是只抓到了局部表象。

从真实项目里看,性能指标真正有价值的地方,不是告诉你“某个数是多少”,而是告诉你:

  • 系统有没有在退化
  • 退化是从哪里开始的
  • 这个退化是局部抖动,还是系统性风险

而这些判断,通常都不是靠单个指标完成的。

一、先说结论:性能指标要看“组合”,不要看“单点”

性能测试里的核心指标通常可以分成四组:

  • 吞吐类
  • 延迟类
  • 错误类
  • 资源类

它们分别回答不同问题:

  • 吞吐类:系统产出多少
  • 延迟类:系统慢不慢、抖不抖
  • 错误类:系统有没有开始失真或失败
  • 资源类:系统靠什么在扛,哪里快到上限了

如果只看其中一类,通常都不够。
真正有意义的是把这几组指标放到同一时间轴上一起看。

二、吞吐指标看的是“系统产出能力”,但不能脱离错误率和延迟单独解释

吞吐最常见的指标就是:

  • TPS
  • QPS

看到吞吐高,直觉上很容易觉得系统能力强。
但这个判断要非常小心,因为吞吐高至少有三种完全不同的含义:

1. 真正健康的高吞吐

表现通常是:

  • 吞吐增长平稳
  • 响应时间没有明显恶化
  • 错误率保持低位

这说明系统还在健康工作区。

2. 错误堆出来的高吞吐

例如:

  • 接口快速失败
  • 网关直接拒绝
  • 下游超时前置返回

这种情况下,看起来吞吐也可能很高,但业务价值几乎为零。

3. 逼近极限前的“虚假繁荣”

有些系统在某个区间内,吞吐还能继续涨,但尾延迟和错误率已经开始抬头。
这往往意味着系统已经在透支稳定性换吞吐。

所以吞吐类指标的第一原则是:

至少要和响应时间、错误率一起看。

三、响应时间不要只看平均值,真正危险的是尾延迟

这是线上最典型也最容易被忽视的问题。

很多报告里都会先写平均响应时间,因为它看起来最直观。
但真实用户体验往往不是被平均值决定的,而是被尾部请求决定的。

比如一个接口:

  • Avg 200ms
  • P95 1.2s
  • P99 4.8s

从平均值看,好像很好;
但从用户视角看,这已经是明显会被感知到卡顿的系统。

所以通常会重点看:

  • Avg
  • P90
  • P95
  • P99

其中:

  • Avg 更像整体概览
  • P95 / P99 更像真实风险指标

如果 P99 开始显著抬高,哪怕平均值还不错,我也会把它当成明确的退化信号。

四、错误率不是“最终失败数”,而是系统退化最敏感的外显信号

只有到错误率明显升高时才重视它。
但实际上,错误率在性能测试里应该被更细地拆开看。

因为“错误”本身不是一个单一概念。

常见至少要区分:

  • 业务错误
  • 接口超时
  • 连接失败
  • 网关返回错误
  • 压测工具侧异常

这几类错误背后代表的含义完全不同。

例如:

  • 业务错误高,可能是参数模型有问题
  • 超时高,可能是下游阻塞或线程池排队
  • 连接失败高,可能是网络、端口、句柄或网关资源先顶住了
  • 工具侧异常高,可能是压测机自己先崩了

如果错误率只看一个总数,结论会非常粗糙。

五、资源类指标的价值,不是看“高不高”,而是看“有没有限制产出”

这也是最容易误判的一类指标。

这类指标组合一出现,最常见的判断是:

  • CPU 高
  • 内存高
  • 磁盘 util 高

就直接说瓶颈在这里。
但真实分析里,更关键的问题是:

这个资源高利用率,到底有没有开始限制系统继续产出。

举几个例子:

1. CPU 高,不一定就是 CPU 瓶颈

如果 CPU 80% 但:

  • 吞吐还在健康增长
  • P99 没明显恶化
  • 错误率也没抬头

那它更像“资源被充分利用”,而不是当前主瓶颈。

2. 内存高,也不一定是问题

比如缓存型服务,本来就应该吃更多内存。
关键不是内存高不高,而是:

  • GC 是否恶化
  • 回收是否异常
  • 是否出现明显抖动

3. 磁盘和网络更要看延迟与等待

很多磁盘和网络问题,最危险的不是“打满了”,而是:

  • await 明显升高
  • RTT 明显升高
  • 重传、排队、阻塞开始出现

这些信号往往比单纯使用率更早暴露风险。

六、真正有分析价值的,是指标之间的“联动关系”

做性能分析时,很少单看一张图。
更常见的是把几张图叠在脑子里一起解释。

例如一个典型的性能退化链路可能是:

  • 吞吐继续上升
  • P95 开始拉长
  • CPU 接近上限
  • 应用线程数明显增加
  • 错误率开始从 0 升到 0.5%

这种联动关系通常比单个指标更能说明问题。

再比如另一种情况:

  • 吞吐没怎么涨
  • CPU 也不高
  • 但 P99 很差
  • 数据库连接池等待上升

这就提示你,问题可能根本不在应用 CPU,而在数据库侧排队。

所以更倾向把性能指标理解成一组“互相印证的证据”,而不是各看各的数字。

七、在项目里最常见的几个指标误读

误读 1:吞吐高就是系统强

没有结合错误率和延迟的吞吐结论,通常都不可靠。

误读 2:平均值好看就是体验好

很多严重问题都藏在 P95 / P99 里。

误读 3:某个资源高就是主瓶颈

资源高只能说明“忙”,不能直接说明“限制产出”。

误读 4:错误率低就代表系统稳定

有些系统在错误率还没明显抬头时,尾延迟和线程堆积已经先开始恶化。
如果只盯错误率,发现风险会太晚。

八、如果现场只允许我带一张指标记录表,更合适的设计方式如下

指标分析最怕“图很多,没人会串”。
如果现场只允许我保留一张核心记录表,通常会用下面这种结构。

阶段 TPS Avg P95 P99 错误率 CPU DB 连接等待 初步判断
100 并发 620 120ms 210ms 340ms 0 42% 健康区
200 并发 1180 160ms 320ms 520ms 0 61% 健康区
300 并发 1540 210ms 480ms 1.1s 0.2% 78% 接近拐点
400 并发 1600 320ms 920ms 2.8s 1.4% 82% 风险区

这张表不是为了替代监控图,而是为了逼自己在现场做解释:

  • 吞吐是不是还在增长
  • 尾延迟是不是已经先抬头
  • 资源变化有没有和退化同步
  • 这一阶段到底该叫健康区还是风险区

九、更常用的一套指标阅读顺序

如果面对一堆图表不知道先看什么,通常可以按下面顺序看。

  1. 先看吞吐有没有继续增长
  2. 再看 P95 和 P99 是不是开始分叉
  3. 再看错误率是不是同步抬头
  4. 最后对齐资源和依赖指标

原因很简单:

  • 吞吐告诉你系统还有没有继续产出
  • 分位数告诉你系统是不是开始抖
  • 错误率告诉你系统是不是开始失真
  • 资源告诉你失真可能从哪一层开始

这比上来先盯 CPU 或平均响应时间更不容易跑偏。

八、更常用的指标分析顺序

如果一次压测结果出来,通常会按下面顺序看:

1. 先看吞吐曲线

确认:

  • 吞吐有没有正常爬升
  • 是否存在明显平台期
  • 是否出现突然掉头

2. 再看分位数延迟

确认:

  • P95 / P99 从哪里开始恶化
  • 是平滑变差,还是突然断崖

3. 再看错误率和错误类型

确认:

  • 错误是业务错、超时错,还是连接错
  • 错误从哪个阶段开始抬头

4. 最后对照资源指标

确认:

  • 哪个资源在同一时间窗口最先达到上限
  • 哪种资源变化和吞吐、延迟最同步

这样分析的好处是,不容易一上来就被某张资源图带偏。

结语

性能指标最怕的,就是被孤立地看。
真正有价值的分析,不是说“QPS 多少、平均响应多少、CPU 多少”,而是解释清楚:

  • 产出有没有继续增长
  • 用户体验在哪个阶段开始恶化
  • 错误是怎么冒出来的
  • 哪个资源最先开始限制系统继续产出

只有把吞吐、分位数、错误率和资源曲线放到同一时间轴上一起解释,性能结论才会真正站得住。