☰
【面试题】性能测试面试
2026/10/27 1:44:12 网站建设 项目流程

1、性能测试核心指标;QPS、TPS、RT、吞吐量、并发用户数、错误率、资源利用率

核心指标释义

  1. QPS(Queries Per Second)每秒查询数:每秒收到的请求数;侧重接口查询请求;http接口场景常用。
  2. TPS(Transactions Per Second)每秒事务数:每秒完成的业务事务数。一个事务可以包含多个接口请求(比如下单事务:登录‑选商品‑提交订单‑支付)。

注意:QPS≠TPS,1个TPS可以产生多个QPS。

  1. RT(Response Time 响应时间):从发请求到收到完整响应的耗时;一般看平均RT、P50/P95/P99。P99:99%的请求耗时小于该值;P95是性能最重要指标,比平均RT更有参考价值。
  2. 吞吐量(Throughput):单位时间传输的数据量,单位 KB/s、MB/s,关注网络层面。
  3. 并发用户数:
    • 虚拟并发:压测工具同一时刻发起请求的线程数;
    • 业务并发:真实同时在线操作的用户。

    并发线程数 ≠ 真实用户数,中间有思考时间。

  4. 错误率:失败请求占总请求比例,5xx、4xx、业务码异常都算错误;性能压测下错误率一般要求≤0.5%。
  5. 资源利用率:服务器硬件资源消耗
    • CPU使用率、内存占用、磁盘IO、网络IO;数据库:连接数、慢查询、锁等待。

性能目标:在可接受RT、错误率前提下,看系统能支撑多大QPS/TPS,同时资源不打满。

2、负载、压力、稳定性、容量测试区别

类型目的特点
负载测试 Load Test逐步加压,找到系统在预期业务负载下的性能表现按照线上预估流量,看RT、资源、错误率,验证是否满足业务指标;不打垮系统
压力测试 Stress Test超过预期负载,不断加压,找到系统性能拐点、崩溃临界点不断加大并发,观察什么时候RT陡增、错误率飙升;找到系统最大承载上限;会把系统压到极限
稳定性测试(耐久测试)长时间持续压力,验证长时间运行是否稳定在中等业务负载下持续跑几小时~几天;观察内存泄漏、连接泄漏、GC抖动、线程泄露;重点看随时间指标变化
容量测试 Capacity Test验证数据量级对性能影响,比如数据库千万级数据下接口性能构造大存量数据,测试接口、SQL随数据量变大的表现;评估数据库容量上限

简单记忆:

  • 负载:预期流量下表现;
  • 压力:压到极限找上限;
  • 稳定性:长时间跑看会不会慢慢变坏;
  • 容量:大数据量下性能。

3、如何设计合理性能测试场景;实际例子

设计性能测试场景步骤

  1. 梳理业务模型:提取核心业务接口,统计线上业务占比(流量配比);哪些是高频核心链路。
  2. 获取线上基线:线上真实QPS、P95RT、并发量,预估未来流量(峰值系数,比如大促2‑3倍日常)。
  3. 拆分场景:
    • 基准场景:单接口基准,低并发,获取基准RT;
    • 日常业务混合场景:按照业务流量比例混合多个接口;
    • 峰值场景:大促峰值流量;
    • 稳定性场景:持续耐久跑;
    • 异常场景:数据库慢查询、第三方依赖超时。
  4. 设置指标阈值:P95RT、错误率、CPU上限;
  5. 准备测试数据:存量业务数据、压测用户账号,避免脏数据;隔离测试环境;
  6. 监控埋点:服务器、JVM、数据库、中间件监控。

实际举例:电商下单链路性能场景

业务:首页浏览‑商品查询‑下单‑支付,线上日常QPS 2000,大促峰值预估5000。

  1. 基准场景:每个接口单独压测,获取单接口基线性能;
  2. 混合业务场景,流量配比:商品查询70%,下单20%,支付10%;目标QPS=2000,持续30min,验证日常;
  3. 峰值场景:QPS=5000,短时间压测,观察性能拐点;
  4. 稳定性场景:3000QPS持续运行8小时,观察内存、GC、连接泄露;
  5. 指标要求:P95RT<200ms,错误率<0.5%,CPU<75%。

4、JMeter常用组件;参数化、关联

JMeter常用组件

  1. 测试计划:根节点
  2. 线程组Thread Group:虚拟用户、循环次数、调度时间;
  3. 取样器Sampler:HTTP请求、JDBC请求,真正发送请求;
  4. 控制器Controller:if控制器、循环控制器;组织业务流程;
  5. 配置元件:HTTP请求默认值、CSV数据文件设置、用户定义变量;
  6. 前置处理器:请求发送前执行;
  7. 后置处理器:提取返回数据,正则表达式提取器、JSON提取器(做关联);
  8. 断言:响应断言、JSON断言,校验返回结果;
  9. 监听器:查看结果树、聚合报告,查看性能指标。

参数化

目的:每次请求使用不同数据,避免缓存、重复账号。

  1. CSV数据文件设置:读取csv/txt,多组账号、参数;
  2. 用户定义变量;
  3. 函数助手:__Random随机数,__time时间戳。

关联

A接口返回的结果,作为B接口入参。

  1. JSON提取器(优先):针对json响应,提取token、orderId;
  2. 正则表达式提取器:文本、html返回;
  3. 把提取结果保存为变量,后续接口通过${变量名}引用。

注意:性能压测时,禁用查看结果树,监听器会消耗大量性能,影响压测结果。

5、内存泄漏;服务端、Android、iOS排查思路

内存泄漏:程序申请内存,使用完毕后没有释放;随着运行时间内存持续上涨,最终OOM内存溢出。

内存泄露≠内存溢出;泄露是过程,OOM是最终结果。

服务端Java内存泄漏排查

  1. 现象:服务运行时间越长,内存持续走高,FullGC频繁,最终OOM崩溃。
  2. 工具:
    • jstat:查看GC实时统计;
    • jmap:dump堆快照;
    • MAT(Memory Analyzer Tool)分析dump文件;
  3. 排查点:集合没有清理、静态集合持有大对象、线程未关闭、连接池连接泄漏。

Android内存泄漏

现象:App越用内存越高,卡顿、闪退。
工具:Android Studio Profiler,LeakCanary(自动检测泄露)。
常见原因:Activity/Fragment被静态引用、匿名内部类、Handler内存泄漏、注册监听未反注册。

iOS内存泄漏

工具:Xcode Instruments‑Leaks工具。
原因:循环引用(block、delegate未weak)、对象没有释放。

6、移动端稳定性测试怎么做;Monkey测试开展;日志关注点

移动端稳定性测试

  1. Monkey压力测试;
  2. 长时间App前台后台切换;
  3. 反复安装卸载;
  4. 弱网、网络切换;
  5. 多任务,App切后台、杀进程重启;
  6. 长时间运行,观察Crash、ANR、内存、CPU、电量。

Monkey测试开展(Android)

adb命令向app发送随机伪事件:点击、滑动、按键等。

adb shell monkey-pcom.xxx.app--throttle300100000

参数说明:

  • -p指定被测应用包名;
  • --throttle事件之间延时ms;
  • 数字:总事件次数;
  • -s指定种子,复现问题;
  • 输出日志保存到文件。

Monkey日志重点关注

  1. Crash:应用崩溃;
  2. ANR:应用无响应;
  3. Exception异常堆栈;
  4. 内存OOM;
  5. 系统异常;

只要出现crash/anr,提取对应复现种子seed,复现问题给开发。

iOS没有monkey;使用X‑CTest‑Monkey。

7、线上偶发超时,定位排查思路

偶发超时,不是必现,优先分层排查:

  1. 客户端日志:确认是客户端发起就超时,还是服务端返回慢;区分DNS、TCP建连、SSL耗时。
  2. 网关/nginx层:看网关日志,请求到达网关时间、网关转发耗时;是否网关限流、连接数打满。
  3. 应用服务端:
    • 查看服务日志,接口处理耗时;看线程池是否打满,线程阻塞;
    • GC日志:是否GC停顿STW导致响应变慢;
  4. 中间件:Redis、MQ,是否慢查询、连接耗尽;
  5. 数据库:慢SQL、锁等待、数据库CPU/IO打满;事务过长;
  6. 第三方依赖:调用外部接口偶发超时;
  7. 网络层面:网络抖动、DNS解析问题;
  8. 链路追踪:SkyWalking/Pinpoint全链路追踪,看每个阶段耗时,定位是哪一段耗时长。

8、什么是GC;GC日志分析;常见GC算法

GC(Garbage Collection)垃圾回收:Java虚拟机自动识别回收不再使用的对象,释放堆内存。STW:Stop‑The‑World,GC时业务线程暂停,暂停时间越长对接口RT影响越大。

GC日志分析

开启GC日志参数,输出gc log。重点观察:

  1. 新生代、老年代内存占用;
  2. Young GC频率、耗时;
  3. Full GC频率、耗时;FullGC频繁是严重问题;
  4. STW停顿时间;
  5. 看内存是否持续上涨,判断内存泄漏。
    工具:GCViewer分析GC日志。

常见GC算法

  1. 标记‑清除 Mark‑Sweep:标记垃圾对象,直接清除;会产生内存碎片。
  2. 标记‑复制 Mark‑Copy:把存活对象复制到新区域;无碎片;需要双倍内存;新生代常用。
  3. 标记‑整理 Mark‑Compact:标记存活对象,向一端压缩整理;消除碎片;开销大;老年代。

JVM收集器(组合上面算法)

  • Serial:单线程;
  • ParallelGC:多线程并行;
  • CMS:并发标记清除,追求低停顿;
  • G1:分区,兼顾吞吐量和停顿;
  • ZGC:低延迟收集器,大堆优选。

9、全链路压测;和单接口压测区别

单接口压测:只压某一个接口,隔离其他系统;简单,容易实施;缺点:无法模拟真实业务调用链,没有上下游依赖,压测结果偏乐观。

全链路压测:模拟真实用户完整业务链路,多个系统同时施压;流量从网关进来,流经网关‑应用‑中间件‑数据库整条链路;会对上下游所有服务产生压力。

核心:流量染色,压测流量打标记,压测数据隔离,不能污染真实生产数据。

两者对比

单接口压测全链路压测
压测对象单个接口完整业务链路,多服务协同
数据风险风险小需要流量染色,隔离压测数据
实施难度低高,协调多团队,环境、数据准备复杂
价值单接口性能瓶颈定位模拟真实线上流量,发现链路、依赖、数据库瓶颈

使用场景:迭代阶段做单接口压测;大促前做全链路压测。

10、弱网测试开展;弱网模拟工具

弱网:模拟2G/3G、网络抖动、高延迟、丢包、带宽受限,验证App/接口在恶劣网络下表现。

弱网测试关注点

  1. 请求超时处理、页面loading提示;
  2. 重复提交、幂等;
  3. 断网重连,缓存逻辑;
  4. 大文件上传下载;
  5. 异常提示文案,不能ANR、Crash。

弱网模拟工具

  1. Charles:代理工具,配置带宽、延迟、丢包率,移动端最常用;
  2. Fiddler:弱网模拟;
  3. tc(Linux traffic‑control):服务器端弱网,命令行;
  4. JMeter插件:模拟网络延迟;
  5. iOS:Network Link Conditioner;
  6. Android:模拟器自带网络模拟。

原理:代理层人为增加延迟、丢包、限制上下行带宽。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询