2. 核心指标定义:QPS/TPS、响应时间(TP99/TP999)、错误率、资源利用率(CPU/内存/IO)

做压力测试,说白了就是给系统「上强度」。但怎么判断系统扛不扛得住?不能光凭感觉。你得盯住几个关键指标。我这些年踩过的坑,十有八九都是因为指标没看全,或者看错了。

这一章,我把压测最核心的四个指标掰开揉碎了讲。你记住,这四个指标就像汽车的仪表盘——少一个,你都可能翻车。

2.1 QPS 与 TPS:别傻傻分不清

很多人把 QPS 和 TPS 混着用。我刚开始也犯过这错。后来被一个老架构师怼了一句:「你连测的是请求还是事务都分不清,压个寂寞?」

嗯,从那以后我分得清清楚楚。

指标 全称 含义 典型场景
QPS Queries Per Second 每秒查询数 读接口、搜索、列表页
TPS Transactions Per Second 每秒事务数 下单、支付、风控决策

QPS 侧重「查询」。比如你查一个用户的订单列表,一次请求就算一个 QPS。它通常是无状态的,响应快,对系统压力相对小。

TPS 侧重「事务」。一个事务可能包含多个请求。比如风控系统里,一次「交易审核」可能涉及:查黑名单、查设备指纹、跑规则引擎、写日志。这一整套下来,才算一个 TPS。

我的习惯:压测风控系统,我只看 TPS。因为风控的每一次决策都是一个完整事务。只看 QPS 会严重低估系统压力。

举个例子。你压测一个风控决策接口,压到 2000 QPS 感觉还行。但仔细一看,每个 QPS 背后其实包含了 5 次内部调用。那实际 TPS 只有 400。系统真正的吞吐能力,是 400 TPS,不是 2000 QPS。

避坑指南:我曾经在压测报告里只写了 QPS,被老板表扬「性能不错」。结果上线第一天,真实流量一来,系统直接打满。后来复盘才发现,我压测时用的是简单查询接口,而线上全是复杂事务。从此以后,我压测报告里必须同时标注 QPS 和 TPS,并说明测试场景。

2.2 响应时间:TP99 和 TP999 才是真相

平均响应时间?那玩意儿骗人的。你想想看,100 个请求里 99 个 10ms,1 个 10s,平均一下才 109ms。看起来挺美,但那个倒霉的用户已经等崩溃了。

所以,我只看百分位响应时间。

  • TP99:99% 的请求在多少毫秒内完成。剩下 1% 是长尾。
  • TP999:99.9% 的请求在多少毫秒内完成。剩下 0.1% 是极端长尾。

为什么这两个指标重要?因为风控系统是「高敏感」系统。一个决策慢了,用户可能直接流失,或者被风控放过了一笔欺诈交易。

我的经验:风控系统的 TP99 建议控制在 200ms 以内,TP999 控制在 500ms 以内。超过这个阈值,说明系统已经接近瓶颈,需要扩容或优化。

怎么测?压测工具一般都会自动计算。比如用 JMeter,在聚合报告里就能看到 TP90、TP99、TP999。我习惯把 TP999 作为「红线指标」。一旦 TP999 超过阈值,我就认为系统不可用,哪怕平均响应时间还很低。

为什么会这样?因为 TP999 反映的是系统在最差情况下的表现。它暴露了资源竞争、锁冲突、GC 停顿等问题。这些问题平时不显眼,但流量高峰一来,就会放大成雪崩。

2.3 错误率:零容忍

错误率,就是压测过程中失败的请求占比。包括超时、返回 5xx、业务异常码等。

我对错误率的态度很简单:压测过程中,错误率必须为 0

有人会说:「哎呀,偶尔几个超时很正常嘛,不影响整体。」

我不这么认为。你想想看,压测是模拟真实流量。如果压测时都有错误,线上只会更严重。而且,错误率是系统健康度的「晴雨表」。一旦出现非零错误率,说明系统已经进入不稳定状态。

错误类型 常见原因 我的处理方式
超时 线程池打满、数据库连接池耗尽 先看 TP999,如果 TP999 正常,可能是超时时间设置太短
5xx 服务崩溃、内存溢出、依赖服务不可用 立即停止压测,排查日志
业务异常 风控规则返回错误、参数校验失败 检查压测数据是否合法,或者业务逻辑有 bug

避坑指南:我曾经压测一个风控规则引擎,发现错误率 0.5%。排查了两天,最后发现是压测数据里混入了一条「测试用户」的黑名单记录,导致规则引擎抛了空指针。嗯,从那以后,我压测前都会先做数据清洗。

2.4 资源利用率:CPU、内存、IO

光看 QPS 和响应时间还不够。你得知道系统「累不累」。资源利用率就是系统的「疲劳度」。

CPU

CPU 利用率是核心指标。我一般看两个值:

  • 用户态 CPU:业务代码在跑。如果这个高,说明业务逻辑复杂,需要优化代码。
  • 系统态 CPU:内核在干活。如果这个高,说明系统调用频繁,比如大量 IO 操作。

我的经验是:CPU 利用率在 70% 以下算健康。超过 80%,系统就开始排队了。超过 90%,响应时间会急剧恶化。

内存

内存主要看两点:

  • 堆内存使用率:Java 应用重点关注。如果堆内存持续增长,说明有内存泄漏。
  • GC 频率和停顿时间:Full GC 一次超过 1 秒,系统基本就卡死了。

我记得有一次压测,QPS 上不去,CPU 也不高。排查了半天,发现是 GC 太频繁,大部分时间都在「Stop The World」。优化了堆内存配置后,TPS 直接翻了一倍。

IO

IO 包括磁盘 IO 和网络 IO。风控系统里,IO 瓶颈通常出现在:

  • 数据库:慢查询、连接池打满
  • 缓存:Redis 响应变慢
  • 日志:写日志太频繁,磁盘 IO 打满

怎么判断 IO 是不是瓶颈?看 iowait。如果 iowait 超过 10%,说明磁盘在拖后腿。

我的习惯:压测时,我会同时开四个监控窗口:一个看 CPU 和内存,一个看 GC 日志,一个看数据库慢查询,一个看网络流量。哪个先报警,就先优化哪个。

2.5 核心指标关系图

下面这张图,是我自己总结的。它展示了四个核心指标之间的关联关系。你压测时,可以照着这张图来排查问题。

风控系统压测核心指标关系图 QPS / TPS 响应时间 错误率 资源利用率 压力增大 超时增多 资源耗尽 瓶颈限制 异常消耗 四个指标相互影响,任何一个出现异常,都需要联动排查

这张图想表达什么?说白了就是:没有孤立的指标

  • QPS 上去了,响应时间就会变长。
  • 响应时间变长,超时增多,错误率就上来了。
  • 错误率高了,系统忙着处理异常,资源利用率飙升。
  • 资源利用率高了,反过来又限制了 QPS。

你压测时,如果发现某个指标异常,别只盯着它看。顺着这张图去排查上下游,往往能找到根因。

一个小技巧:我习惯在压测脚本里同时采集这四个指标,然后画在一张趋势图上。哪个指标先「翘头」,哪个就是瓶颈。比如,如果 CPU 先到 90%,那就是计算密集型瓶颈;如果 TP999 先翘头,那就是资源竞争或锁冲突。

好了,核心指标就讲这么多。记住这四个指标,你的压测报告就有了灵魂。下一章,我们会聊怎么搭建压测环境——嗯,这部分我踩过的坑更多,到时候慢慢说。


公众号:蓝海资料掘金营,微信deep3321