一、业务层指标
从业务请求角度,直接反映用户体验,压测外层结果。
1. 吞吐量 TPS/QPS
每秒成功事务数、查询数;观察峰值、拐点、饱和点;判断系统大处理能力。
2. 响应时间 RT
平均、中位数、P50/P90/P95/P99/P999;长尾分位数比平均值更重要,平均会掩盖慢请求抖动。
3. 错误率
报错占比:超时、5xx、4xx、业务异常;高并发下错误率上升,代表系统已经过载。
4. 并发用户 / 虚拟用户
多少用户下指标开始恶化;区分:并发数≠TPS。
5. 业务成功率
不仅看 HTTP 状态码,还要校验业务返回是否正确,避免请求 200 但业务逻辑失败。
分析关注点:
随着并发上升,TPS 是否线性上涨?是否出现拐点;RT 是否陡增;错误率是否抬升。
二、服务器资源维度
主机、容器基础资源,判断是否资源瓶颈。
1. CPU
用户 CPU、系统 CPU、iowait、空闲;
重点:上下文切换、中断、负载;高 sys cpu 经常是锁、内核、频繁 GC。
2. 内存
已用内存、空闲、Buffer/Cache、Swap 使用;Swap 升高基本是内存压力;
OOM 风险、内存趋势(长时间压测看是否持续上涨,判断内存泄漏)。
3. 磁盘 IO
iops、读写吞吐量、% util、await(IO 等待时间);await 高代表磁盘瓶颈,数据库、日志刷盘常见。
4. 网络
出入带宽、网络包、丢包、重传、连接数;TIME_WAIT、CLOSE_WAIT 堆积;带宽打满、连接泄漏。
注意:CPU 100% 不一定就是瓶颈,要看是业务计算、GC、锁等待还是 IO 等待。
三、应用程序维度
以 Java 服务举例,其他语言对应同类指标:
1. JVM:堆内存、非堆、GC 次数、GC 停顿时间、FullGC 频率;频繁 FullGC、STW 变长会造成系统抖动。
2. 线程:线程总数、阻塞线程、死锁、线程池队列、线程池耗尽。
3. 连接池:数据库连接池、Redis 连接池;队列等待、连接耗尽。
4. 锁:锁等待时间、竞争锁;大量锁竞争会导致 RT 上涨、TPS 上不去。
5. 日志:大量打印错误日志、debug 日志消耗 IO 与 CPU。
四、中间件 & 存储层维度(数据库、缓存、MQ 等)
数据库 MySQL
QPS、TPS、慢 SQL、执行时间;
锁等待、行锁、表锁、事务长事务;
缓冲池命中率、IO、连接数;索引是否失效。
缓存 Redis
OPS、命中率;大 key、热 key;内存增长;网络;CPU;连接数;过期淘汰。
MQ 消息队列
生产速率、消费速率、堆积量;延迟;分区;消费线程;重试死信。
很多性能问题不在应用,而是存储 / 中间件成为瓶颈。
五、链路与调用维度(全链路)
1. 接口调用耗时分解:各个下游调用耗时占比,看是本地计算慢,还是依赖第三方、DB、缓存慢。
2. 调用频次:是否存在循环调用、重复查询、N+1 查询问题。
3. 外部依赖:第三方接口响应、超时、重试逻辑;重试风暴会放大压力。
4. Trace 链路:看慢请求耗在哪一段。
六、稳定性维度(长时间压测、可靠性,前面聊过方差分析就在这里)
不只是峰值能力,还要看系统持续运行表现:
1. 指标漂移:长时间压测,RT、TPS、错误率是否逐步恶化(内存泄漏、连接泄露)。
2. 抖动:指标忽高忽低,分位数波动大;可以用方差、变异系数 CV、单因素方差分析 ANOVA量化抖动。
3. 异常恢复:压力突增突降后,系统能否自动恢复;是否雪崩、连锁故障。
4. 泄漏风险:内存、句柄、连接是否持续上涨不释放。
方差分析作用:区分 “正常随机抖动” 和 “系统真实性能漂移”。
七、容量 & 可扩展性维度
1. 拐点 & 饱和点:并发增加到多少,系统开始性能下降;可支撑 TPS有多少。
2. 线性扩展能力:增加实例,TPS 是否近似线性提升;是否存在单点瓶颈。
3. 瓶颈定位:是 CPU 瓶颈、IO 瓶颈、DB 瓶颈、锁瓶颈还是业务逻辑瓶颈。
八、对比分析维度(基线、版本对比)
1. 基线对比:和历史基准压测对比,看 RT、TPS 变化。
2. 版本对比:新版本上线,判断是否性能退化,可以用 ANOVA、t 检验做统计学判断。
3. 环境对比:测试环境 vs 预发,识别环境差异带来的偏差。