1、性能测试核心指标;QPS、TPS、RT、吞吐量、并发用户数、错误率、资源利用率
核心指标释义
- QPS(Queries Per Second)每秒查询数:每秒收到的请求数;侧重接口查询请求;http接口场景常用。
- TPS(Transactions Per Second)每秒事务数:每秒完成的业务事务数。一个事务可以包含多个接口请求(比如下单事务:登录‑选商品‑提交订单‑支付)。
注意:QPS≠TPS,1个TPS可以产生多个QPS。
- RT(Response Time 响应时间):从发请求到收到完整响应的耗时;一般看平均RT、P50/P95/P99。P99:99%的请求耗时小于该值;P95是性能最重要指标,比平均RT更有参考价值。
- 吞吐量(Throughput):单位时间传输的数据量,单位 KB/s、MB/s,关注网络层面。
- 并发用户数:
- 虚拟并发:压测工具同一时刻发起请求的线程数;
- 业务并发:真实同时在线操作的用户。
并发线程数 ≠ 真实用户数,中间有思考时间。
- 错误率:失败请求占总请求比例,5xx、4xx、业务码异常都算错误;性能压测下错误率一般要求≤0.5%。
- 资源利用率:服务器硬件资源消耗
- CPU使用率、内存占用、磁盘IO、网络IO;数据库:连接数、慢查询、锁等待。
性能目标:在可接受RT、错误率前提下,看系统能支撑多大QPS/TPS,同时资源不打满。
2、负载、压力、稳定性、容量测试区别
| 类型 | 目的 | 特点 |
|---|---|---|
| 负载测试 Load Test | 逐步加压,找到系统在预期业务负载下的性能表现 | 按照线上预估流量,看RT、资源、错误率,验证是否满足业务指标;不打垮系统 |
| 压力测试 Stress Test | 超过预期负载,不断加压,找到系统性能拐点、崩溃临界点 | 不断加大并发,观察什么时候RT陡增、错误率飙升;找到系统最大承载上限;会把系统压到极限 |
| 稳定性测试(耐久测试) | 长时间持续压力,验证长时间运行是否稳定 | 在中等业务负载下持续跑几小时~几天;观察内存泄漏、连接泄漏、GC抖动、线程泄露;重点看随时间指标变化 |
| 容量测试 Capacity Test | 验证数据量级对性能影响,比如数据库千万级数据下接口性能 | 构造大存量数据,测试接口、SQL随数据量变大的表现;评估数据库容量上限 |
简单记忆:
- 负载:预期流量下表现;
- 压力:压到极限找上限;
- 稳定性:长时间跑看会不会慢慢变坏;
- 容量:大数据量下性能。
3、如何设计合理性能测试场景;实际例子
设计性能测试场景步骤
- 梳理业务模型:提取核心业务接口,统计线上业务占比(流量配比);哪些是高频核心链路。
- 获取线上基线:线上真实QPS、P95RT、并发量,预估未来流量(峰值系数,比如大促2‑3倍日常)。
- 拆分场景:
- 基准场景:单接口基准,低并发,获取基准RT;
- 日常业务混合场景:按照业务流量比例混合多个接口;
- 峰值场景:大促峰值流量;
- 稳定性场景:持续耐久跑;
- 异常场景:数据库慢查询、第三方依赖超时。
- 设置指标阈值:P95RT、错误率、CPU上限;
- 准备测试数据:存量业务数据、压测用户账号,避免脏数据;隔离测试环境;
- 监控埋点:服务器、JVM、数据库、中间件监控。
实际举例:电商下单链路性能场景
业务:首页浏览‑商品查询‑下单‑支付,线上日常QPS 2000,大促峰值预估5000。
- 基准场景:每个接口单独压测,获取单接口基线性能;
- 混合业务场景,流量配比:商品查询70%,下单20%,支付10%;目标QPS=2000,持续30min,验证日常;
- 峰值场景:QPS=5000,短时间压测,观察性能拐点;
- 稳定性场景:3000QPS持续运行8小时,观察内存、GC、连接泄露;
- 指标要求:P95RT<200ms,错误率<0.5%,CPU<75%。
4、JMeter常用组件;参数化、关联
JMeter常用组件
- 测试计划:根节点
- 线程组Thread Group:虚拟用户、循环次数、调度时间;
- 取样器Sampler:HTTP请求、JDBC请求,真正发送请求;
- 控制器Controller:if控制器、循环控制器;组织业务流程;
- 配置元件:HTTP请求默认值、CSV数据文件设置、用户定义变量;
- 前置处理器:请求发送前执行;
- 后置处理器:提取返回数据,正则表达式提取器、JSON提取器(做关联);
- 断言:响应断言、JSON断言,校验返回结果;
- 监听器:查看结果树、聚合报告,查看性能指标。
参数化
目的:每次请求使用不同数据,避免缓存、重复账号。
- CSV数据文件设置:读取csv/txt,多组账号、参数;
- 用户定义变量;
- 函数助手:__Random随机数,__time时间戳。
关联
A接口返回的结果,作为B接口入参。
- JSON提取器(优先):针对json响应,提取token、orderId;
- 正则表达式提取器:文本、html返回;
- 把提取结果保存为变量,后续接口通过
${变量名}引用。
注意:性能压测时,禁用查看结果树,监听器会消耗大量性能,影响压测结果。
5、内存泄漏;服务端、Android、iOS排查思路
内存泄漏:程序申请内存,使用完毕后没有释放;随着运行时间内存持续上涨,最终OOM内存溢出。
内存泄露≠内存溢出;泄露是过程,OOM是最终结果。
服务端Java内存泄漏排查
- 现象:服务运行时间越长,内存持续走高,FullGC频繁,最终OOM崩溃。
- 工具:
- jstat:查看GC实时统计;
- jmap:dump堆快照;
- MAT(Memory Analyzer Tool)分析dump文件;
- 排查点:集合没有清理、静态集合持有大对象、线程未关闭、连接池连接泄漏。
Android内存泄漏
现象:App越用内存越高,卡顿、闪退。
工具:Android Studio Profiler,LeakCanary(自动检测泄露)。
常见原因:Activity/Fragment被静态引用、匿名内部类、Handler内存泄漏、注册监听未反注册。
iOS内存泄漏
工具:Xcode Instruments‑Leaks工具。
原因:循环引用(block、delegate未weak)、对象没有释放。
6、移动端稳定性测试怎么做;Monkey测试开展;日志关注点
移动端稳定性测试
- Monkey压力测试;
- 长时间App前台后台切换;
- 反复安装卸载;
- 弱网、网络切换;
- 多任务,App切后台、杀进程重启;
- 长时间运行,观察Crash、ANR、内存、CPU、电量。
Monkey测试开展(Android)
adb命令向app发送随机伪事件:点击、滑动、按键等。
adb shell monkey-pcom.xxx.app--throttle300100000参数说明:
-p指定被测应用包名;--throttle事件之间延时ms;- 数字:总事件次数;
-s指定种子,复现问题;- 输出日志保存到文件。
Monkey日志重点关注
- Crash:应用崩溃;
- ANR:应用无响应;
- Exception异常堆栈;
- 内存OOM;
- 系统异常;
只要出现crash/anr,提取对应复现种子seed,复现问题给开发。
iOS没有monkey;使用X‑CTest‑Monkey。
7、线上偶发超时,定位排查思路
偶发超时,不是必现,优先分层排查:
- 客户端日志:确认是客户端发起就超时,还是服务端返回慢;区分DNS、TCP建连、SSL耗时。
- 网关/nginx层:看网关日志,请求到达网关时间、网关转发耗时;是否网关限流、连接数打满。
- 应用服务端:
- 查看服务日志,接口处理耗时;看线程池是否打满,线程阻塞;
- GC日志:是否GC停顿STW导致响应变慢;
- 中间件:Redis、MQ,是否慢查询、连接耗尽;
- 数据库:慢SQL、锁等待、数据库CPU/IO打满;事务过长;
- 第三方依赖:调用外部接口偶发超时;
- 网络层面:网络抖动、DNS解析问题;
- 链路追踪:SkyWalking/Pinpoint全链路追踪,看每个阶段耗时,定位是哪一段耗时长。
8、什么是GC;GC日志分析;常见GC算法
GC(Garbage Collection)垃圾回收:Java虚拟机自动识别回收不再使用的对象,释放堆内存。STW:Stop‑The‑World,GC时业务线程暂停,暂停时间越长对接口RT影响越大。
GC日志分析
开启GC日志参数,输出gc log。重点观察:
- 新生代、老年代内存占用;
- Young GC频率、耗时;
- Full GC频率、耗时;FullGC频繁是严重问题;
- STW停顿时间;
- 看内存是否持续上涨,判断内存泄漏。
工具:GCViewer分析GC日志。
常见GC算法
- 标记‑清除 Mark‑Sweep:标记垃圾对象,直接清除;会产生内存碎片。
- 标记‑复制 Mark‑Copy:把存活对象复制到新区域;无碎片;需要双倍内存;新生代常用。
- 标记‑整理 Mark‑Compact:标记存活对象,向一端压缩整理;消除碎片;开销大;老年代。
JVM收集器(组合上面算法)
- Serial:单线程;
- ParallelGC:多线程并行;
- CMS:并发标记清除,追求低停顿;
- G1:分区,兼顾吞吐量和停顿;
- ZGC:低延迟收集器,大堆优选。
9、全链路压测;和单接口压测区别
单接口压测:只压某一个接口,隔离其他系统;简单,容易实施;缺点:无法模拟真实业务调用链,没有上下游依赖,压测结果偏乐观。
全链路压测:模拟真实用户完整业务链路,多个系统同时施压;流量从网关进来,流经网关‑应用‑中间件‑数据库整条链路;会对上下游所有服务产生压力。
核心:流量染色,压测流量打标记,压测数据隔离,不能污染真实生产数据。
两者对比
| 单接口压测 | 全链路压测 | |
|---|---|---|
| 压测对象 | 单个接口 | 完整业务链路,多服务协同 |
| 数据风险 | 风险小 | 需要流量染色,隔离压测数据 |
| 实施难度 | 低 | 高,协调多团队,环境、数据准备复杂 |
| 价值 | 单接口性能瓶颈定位 | 模拟真实线上流量,发现链路、依赖、数据库瓶颈 |
使用场景:迭代阶段做单接口压测;大促前做全链路压测。
10、弱网测试开展;弱网模拟工具
弱网:模拟2G/3G、网络抖动、高延迟、丢包、带宽受限,验证App/接口在恶劣网络下表现。
弱网测试关注点
- 请求超时处理、页面loading提示;
- 重复提交、幂等;
- 断网重连,缓存逻辑;
- 大文件上传下载;
- 异常提示文案,不能ANR、Crash。
弱网模拟工具
- Charles:代理工具,配置带宽、延迟、丢包率,移动端最常用;
- Fiddler:弱网模拟;
- tc(Linux traffic‑control):服务器端弱网,命令行;
- JMeter插件:模拟网络延迟;
- iOS:Network Link Conditioner;
- Android:模拟器自带网络模拟。
原理:代理层人为增加延迟、丢包、限制上下行带宽。