1. 性能测试完整流程详解

1.1. 需求分析与目标确认 性能测试的目的不是要跑压测工具,而是想通过相应的手段识别系统的瓶颈,保障系统在目标场景下的稳定性和相应能力。如果没有明确的性能目标,测试结果将没有意义,优化方向也会迷失。

常见误区包括:

“把接口压一压” 就是性能测试

只关注 TPS 或 QPS,而忽略资源使用、响应时间、可用性

没有明确的业务目标或上线场景支撑

性能测试的需求并不是测试或者研发拍脑袋决定的,通常来源于以下几个方面:

来源

内容

业务需求文档

日活量、访问高峰期预测、使用人群

历史数据

上一版本的 TPS/QPS、慢查询数据

运维指标

CPU、内存、磁盘、带宽的报警阈值

架构设计文档

分布式部署、限流策略、缓存设计

SLA/SLO 要求

如:99% 接口响应时间<200ms, 99.9% 的可用性等

1.2. 计划与场景设计

性能问题的暴露往往是一个逐层放大的过程:接口没有问题,链路之间可能有问题;链路没问题,全链路的资源争抢、瓶颈、依赖就可能暴露问题。

因此我们需要从最小颗粒度的接口开始,逐层抽象到整个业务系统,最终设计出覆盖全面、风险可控、逐层定位的性能测试场景。

1.2.1. 单接口压测

目的:验证单个接口在不同负载下的性能极限和稳定性

应用场景:

新开发或重构的接口

接口性能瓶颈排查

网关或中间层性能验证

设计要素:

固定参数、构造 mock 数据、动态参数,需要根据接口实现评估

并发阶梯上升测试(如 10→100→500 QPS)

分析 TPS、响应时间、错误率、资源使用情况

1.2.2. 单链路压测

目的:验证某一完整业务流程在负载下的性能表现

链路定义:多个接口组成一个完整用户动作路径(前后端协作逻辑链)

应用场景:

重点核心链路性能保障(如发送消息链路)

新业务流程上线前的性能评估

依赖系统集成验证

设计要素:

明确业务路径中每一个接口

统一会话上下文(如 token、cookie)

保证链路间逻辑与数据关联完整

并发压测模拟典型业务负载

1.2.3. 多链路组合压测

目的:模拟系统在真实运行中多个业务并发执行的场景

应用场景:

高并发、多业务并行的系统(如收发消息、云文档编辑等)

验证资源争抢、锁冲突、数据库并发能力

典型日常负载/高峰期混合负载模拟

设计要素:

链路权重配置(如收发消息 40%,文档编辑 30%,文档分享 30%)

设置不同业务比例组合并发

引入高峰期行为模拟

1.2.4. 全链路压测

目的:模拟生产环境真实高负载下系统全景运行状态,验证系统承压能力、瓶颈位置、异常恢复能力

应用场景:

上线前全链路压测

灰度环境大促演练

微服务架构压力传播路径验证

设计要素:

构造真实生产级数据(用户、商品、订单等)

覆盖所有核心业务路径

后台任务、消息队列、缓存等全部纳入

引入 Chaos、限流、降级等机制联动演练

典型示例:

模拟双 11 零点流量冲击整个系统

从用户访问首页→浏览→下单→支付→发货的全链路,打通缓存、搜索、DB、MQ、第三方接口等

关键关注点:

系统限流、熔断、降级机制是否生效

整体资源使用(带宽、内存、CPU、连接池)

异常恢复能力(如服务节点故障、网络波动)

1.3. 环境与数据准备1.3.1. 环境准备

环境准备的原则:

真实性优先:环境应尽量接近生产,模拟出真实负载下的行为和瓶颈

隔离性保障:确保测试行为不会影响真实用户和业务数据

成本可控:压测环境不必 100% 按照生产资源规格建设,可适当缩小规模,但要评估比例影响

监控完备:监控能力必须和生产持平甚至更强,否则无法正确定位性能瓶颈

环境类型

特点

适用场景

生产环境压测(影子压测)

数据最真实,但风险高

核心系统灰度验证

准生产环境(beta)

与生产相似,推荐首选

上线前性能验证

独立压测环境

资源可控,安全性高

新功能验证、接口

1.3.2. 测试数据准备

性能测试的数据准备,不是随便造几条数据,而是要覆盖真实业务场景 + 满足测试维度多样性 + 可重复使用。

1. 数据维度设计

维度

说明

示例

用户数据

有效用户量、登录态

生成 x 万用户

群聊/私聊结构

群成员分布、群数量

x 人大群,x 人小群

...

内容敏感

...

2. 数据构造方法

离线构造脚本(推荐):使用 Python/Golang 编写批量注册/造数脚本

数据库直接导入(需谨慎):适合大体量测试数据

Mock 服务:对依赖系统未就绪部分进行 mock 返回

动态预热脚本(常用):每次压测前动态登录、获取 token、构建上下文

1.4. 脚本开发

脚本开发是连接 “性能测试需求分析” 与 “压测执行” 的桥梁环节。无论是单接口压测,还是复杂的多链路全链路压测,脚本都是整个过程的执行载体。

1.4.1. 输入准备

输入项

说明

接口定义

接口 URL、请求方式、Headers、参数结构等

用例场景

关键接口链路、参数组合、依赖顺序

数据依赖

例如接口依赖登录的 token

响应断言

是否成功(status code、字段内容等)

TPS 目标

用于设计线程数、请求频率的依据

1.4.2. 脚本设计方式(单接口→全链路)

单接口:

验证接口的稳定性与性能瓶颈(如登录、搜索)

设计并发参数:用户、QPS、持续时间等

搭配断言 + 数据文件驱动测试(如 CSV)

单链路脚本开发:

模拟一次完整操作流程,如:登录→搜索商品→下单→查询订单

关键点:参数关联(如 token、订单 ID)、请求顺序与依赖、用户行为还原

多链路/业务流程脚本开发:

支持多个角色(买家/卖家/系统任务等)

并行执行多个链路压测,体现真实业务压力结构

1.4.3. 可维护性与复用性建议

参数化设计:将业务参数抽出,支持脚本复用

模块化结构:按链路或模块拆分,便于组合使用

封装通用函数:如签名计算、断言逻辑、动态提取

支持回归验证:加入功能正确性断言,提前发现错误响应

敏感信息隔离:Token、密码参数放置于 config 文件或 secrets 环境变量中

1.5. 测试执行

根据预设场景和目标,稳定、可控地施加压力,并采集关键性能指标,辅助问题定位与性能评估。

1.5.1. 执行前准备 Checklist

项目

说明

压测环境准备

环境隔离,配置一致,监控联通

数据初始化

测试数据准备好,并且数据状态正常

服务监控接入

Prometheus/Grafana/APM 工具等

日志、链路追踪打开

包括 Nginx、应用服务、数据库慢查询

观察指标定义

RT、TPS、错误率、CPU、内存、GC 等

脚本冒烟

小流量压测验证逻辑正确性

依赖方沟通

告知被测系统负责人,避免误报警

1.5.2. 流量控制与压测模式

1. 常见压测流量模型

模型

说明

示例

恒定并发

模拟固定用户数持续操作

50 并发持续 10 分钟

阶梯增长

模拟高峰来临过程

每 5 分钟增加 10 并发

峰值冲击

快速打满系统能力

高并发短时间强打压

混合场景

多接口/多链路同时发压

收发消息,打开文件并行

波浪式

模拟系统高峰低谷流量模式

凌晨压测流量 1 倍,工 10 倍

2. 发压策略建议

从小流量逐步升压,观察系统响应变化;

每个阶段稳定观察 10~30 分钟,确保性能趋势稳定;

压测过程中持续观察:RT 是否持续上升?错误率是否激增?后台是否出现线程阻塞、慢查询、GC 卡顿等?

1.6. 结果监控与收集 压测过程的核心是采数据、看变化。以下的数据只是一小部分的维度,实际上的问题排查可能会涉及更多性能数据的分析与评估对比。

1.6.1. 监控维度

维度

指标

工具

应用层

RT、TPS、错误率、接口 P95/P99

JMeter、Locust

系统层

CPU、内存、GC、负载、磁盘 IO、网络 IO

Prometheus、Grafana

数据库

连接数、慢查询、QPS、锁等待、缓存命中率

MySQL Dashboard

中间件

Kafka TPS、Redis QPS、MQ 消息堆积

业务自研平台

链路追踪

某一请求经过的服务链路耗时分布

SkyWalking、Jaeger

1.6.2. 异常识别与瓶颈定位

问题类型

特征

定位手段

接口超时

RT 飙高,JMeter 报超时

链路追踪 + 服务日志

错误率升高

TPS 下跌,5xx、4xx 增多

日志分析 + 接口返回码

CPU 撑满

TPS 持平但延迟高

top/Grafana 观测线程

GC 卡顿

RT 波动大,GC 次数/耗时高

jstat/GC 日志分析

数据库瓶颈

连接数满、锁等待、慢 SQL

explain+slowlog 分析

缓存穿透/雪崩

Redis 请求激增,DB 被打爆

Redis 监控/fallback

1.7. 分析与报告 在这里的核心目标是:

1. 汇总并分析压测期间的关键性能指标

2. 发现性能瓶颈,定位异常

3. 评估系统是否满足业务性能目标

4. 为优化和容量规划提供决策依据

5. 对外形成结构清晰、结论明确的性能测试报告

1.7.1. 压测结果的核心指标分析

1. 压测数据指标

指标

说明

分析关注点

TPS/QPS

每秒处理请求数

是否达到预期目标

响应时间(RT)

平均、P90、P95、P99

是否符合 SLA 要求

成功率

有效响应数/总请求数

是否出现错误

错误率

5xx/超时/断言失败等

哪些类型最多?集中在哪?

并发数

实际活跃线程数

压力是否真实落到系统

2. 系统服务资源

指标

说明

分析关注点

系统资源

CPU、内存、IO、网络流量、连接数等

有无资源瓶颈

3. 中间件核心性能指标

Redis(缓存)

指标

说明

instantaneous_ops_per_sec

每秒命令执行数(类似 QPS)

keyspace_hits/misses

命中率,命中低代表缓存不生效

latency

响应时间,高峰期时尤为重要

used_memory_rss, used_memory_peak

实际占用内存,是否接近上限

connected_clients

当前连接数,是否稳定,是否打满

evicted_keys, expired_keys

是否频繁淘汰,是否存在热点键被清除问题

MySQL(数据库)

类别

指标

性能

Queries, QPS, Slow_queries

性能

Threads_running

资源

CPU, Buffer pool usage, IO wait

连接

Threads_connected, Max_used_connections

异常

InnoDB row lock wait, Deadlocks

1.8. 优化与验证 “优化与验证”是承上启下的关键模块,目标是根据压测分析结果,驱动系统调优并验证优化是否有效,确保最终上线版本性能稳定、可支撑预期业务量。

以后再细聊吧

2. 性能测试场景设计精髓 性能测试的成败,很大程度上取决于场景设计的科学性与贴合实际业务的能力。设计合理的场景不仅能发现真实瓶颈,还能评估系统是否具备承接未来增长的能力。

2.1. 识别关键业务场景(用户旅程)

常见识别方式:

业务日志分析(如接口调用量、慢接口)

产品功能矩阵分析

用户核心操作路径(注册→浏览→下单→支付)

报警日志/问题记录回溯(历史抖动点)

新业务或核心流程变更部分优先保障

示例:IM 系统

登录鉴权→获取好友列表→获取历史消息→发消息→收消息→群发

2.2. 设计负载模型 负载模型决定了压测目标和策略。应根据业务发展阶段、测试目的不同,匹配不同类型的压测模型。

2.2.1. 负载测试(阶梯式、波浪式)

目的:模拟真实业务压力下的系统表现

阶梯式增长(线性上涨,观察系统是否能逐步抗压)

波浪式压力(高低起伏模拟真实日常高峰、波谷)

适用:日常容量验证、上线前回归测试等

2.2.2. 压力测试(摸高)

目的:突破系统瓶颈上限,发现故障点

施加超过正常预期的负载

观察 TPS 崩溃点、错误率、系统反应(降级 or 崩溃)

适用:容量规划、服务保护策略验证

2.2.3. 稳定性测试

目的:验证系统在长时间运行下的稳定性

运行 8h~72h 不等,重点关注内存泄漏、连接泄漏、数据积压,其实我们跑的是 7*24 小时。

2.2.4. 并发测试

目的:验证系统对并发突发请求的处理能力

一般用于秒杀、拼团等突发流量场景

要求场景中包含随机性、冲突性(如同一个商品库存扣减)

2.3. 模拟真实用户行为2.3.1. 用户分布

模拟不同角色/客户端/地区/终端比例

如 IM:普通用户:运营账号=95:5;移动端:Web 端=9:1

避免单一用户压爆系统,影响结果真实性

2.3.2. 数据参数化

用户 ID、Token、订单号等避免重复数据导致缓存命中、幂等化绕开问题。

支持动态生成、从 CSV/数据库中加载。

2.3.3. 接口关联

登录→获取 token→用 token 访问后续接口

场景逻辑需要前后数据串联,如订单创建后的订单 ID→查询支付状态

2.3.4. 设计有效的断言和事务

判断接口响应是否成功、关键字段是否存在

防止 “压测跑通了,业务其实报错”

建议使用响应码 + 响应值校验双保险

Copyright © 2088 俄罗斯世界杯主题曲_世界杯下一届 - pin8pin8.com All Rights Reserved.
友情链接