一. 性能测试/负载测试/压力测试的定义
- 性能测试 (Performance Testing)
广义概念,指评估系统在特定条件下的响应速度、稳定性和资源消耗的测试活动。包含负载测试、压力测试等子类。 - 负载测试 (Load Testing)
模拟预期生产环境并发用户量,验证系统能否处理正常业务压力,关注性能指标是否达标(如响应时间≤2秒)。 - 压力测试 (Stress Testing)
逐步增加负载超过系统设计容量(如200%并发用户),探测系统极限和失效点,观察资源耗尽时的表现(如内存泄漏、服务雪崩)。
二. 区别与核心指标
区别对比
| 测试类型 | 目标 | 负载水平 | 关注重点 |
|---|---|---|---|
| 性能测试 | 综合评估系统能力 | 多场景覆盖 | 整体性能基线 |
| 负载测试 | 验证生产环境容量 | 设计峰值压力 | 稳定性与SLA达标 |
| 压力测试 | 探测系统极限和失效模式 | 超设计极限负载 | 故障恢复与降级策略 |
核心性能指标
| 指标 | 说明 | 行业参考标准 |
|---|---|---|
| 响应时间 | 请求发出到接收到响应的时间(网络+服务处理+渲染) | API≤500ms, 页面≤3s |
| 并发用户数 | 同时向系统发起请求的用户数(注意区分业务并发与技术并发) | 根据业务模型测算 |
| TPS/QPS | 每秒处理事务数(业务维度)/ 每秒查询数(技术维度) | 金融系统通常≥1000 TPS |
| 吞吐量(Throughput) | 系统单位时间内处理的数据量(MB/s)或请求量 | 受网络带宽和服务器限制 |
| 错误率 | 失败请求占比(HTTP 5xx/超时/业务逻辑错误) | ≤0.1% (关键系统≤0.01%) |
| 资源利用率 | CPU(≤70%安全线)、内存(警惕泄漏)、磁盘I/O(读写延迟)、网络带宽(饱和度) | 云环境需关注容器配额 |
三. 完整的性能测试流程
graph TD
A[需求分析] --> B[场景设计]
B --> C[脚本录制与增强]
C --> D[压测执行]
D --> E[监控与数据采集]
E --> F[瓶颈定位与调优]
F --> G{是否达标?}
G -->|否| B
G -->|是| H[输出报告]
阶段详解:
- 需求分析
- 明确性能目标(如支持5000并发下单)
- 识别核心业务场景(登录→浏览→支付)
- 确定指标阈值(CPU≤80%, TPS≥800)
- 场景设计
- 基准测试(单用户基线性能)
- 负载场景(阶梯递增:100→500→1000并发)
- 压力场景(突增流量/长时间稳定性测试)
- 并发模型(思考时间、用户分布)
- 脚本录制与增强
- 使用JMeter/LoadRunner录制业务流
- 参数化(动态数据替换)
- 关联处理(提取token等动态值)
- 添加断言(验证业务正确性)
- 压测执行
- 预热阶段(避免冷启动偏差)
- 梯度增压(50→100→200并发/分钟)
- 持续高压(峰值压力保持30分钟)
- 突发流量模拟(瞬间增加300%用户)
- 监控与数据采集
- 基础设施:Prometheus+Grafana监控服务器/容器
- 中间件:Redis慢查询、MySQL线程池、Kafka堆积
- 应用层:APM工具(SkyWalking/Dynatrace)追踪调用链
- 日志:ELK收集错误日志关联压测时间戳
- 瓶颈定位与调优
- 典型步骤:
graph LR
A[高错误率] --> B[查日志定位超时点]
B --> C{数据库慢SQL?}
C -->|是| D[SQL优化+索引调整]
C -->|否| E[检查线程阻塞]
E --> F[JVM线程堆栈分析]
- 调优方向:
- 代码层:算法优化、异步化改造
- 数据库:分库分表、查询缓存
- 架构:CDN静态化、限流降级
四. 常用性能测试工具
| 工具 | 适用场景 | 优势 | 局限 |
|---|---|---|---|
| JMeter | Web/API压测、开源定制化 | 插件生态丰富(Kafka/JDBC支持) | 高并发下资源消耗较大 |
| LoadRunner | 企业级复杂场景(含SAP/Oracle协议) | 强大的事务分析器、IP欺骗功能 | 商业许可昂贵 |
| Gatling | 高并发低资源消耗场景 | 基于Scala的高性能引擎、实时报告 | DSL脚本需要学习成本 |
| Locust | 分布式压测+代码驱动场景 | Python脚本灵活扩展 | 监控能力较弱 |
| k6 | 云原生/DevOps集成 | 支持JavaScript、与CI/CD无缝集成 | 社区版功能有限 |
选型建议:
- 互联网企业:JMeter/Gatling + Prometheus
- 金融电信:LoadRunner + AppDynamics
五. TPS上不去的常见原因
分层排查框架:
典型案例:
- 数据库锁竞争:某电商下单场景,更新库存的
SELECT...FOR UPDATE导致死锁,TPS卡在200 - 线程池耗尽:Tomcat默认200线程被占满,日志中出现
RejectedExecutionException - 物理资源瓶颈:AWS t2.micro实例CPU持续100%,需升级实例类型
六. 性能瓶颈分析与定位
方法论:分层定位 + 工具链组合
- 全局监控定位问题层
top/htop→ 定位高CPU进程(如Java进程)iftop/nethogs→ 查网络流量瓶颈dstat→ 综合磁盘IO/CPU/网络
- 应用层深度分析
- Java应用:
jstack [pid]→ 分析线程阻塞(重点关注BLOCKED状态)jstat -gcutil→ 观察GC频率(YoungGC>50次/秒需优化)- Arthas实战:
# 监控方法调用耗时
trace com.example.service.OrderService createOrder
# 查看线程阻塞原因
thread -b
- 内存分析:
jmap -dump导出堆转储 → 用MAT分析内存泄漏(如HashMap未清除)
- 数据库/中间件层
- MySQL:
SHOW PROCESSLIST;-- 查看阻塞会话
SELECT * FROM sys.schema_table_lock_waits; -- 8.0+锁等待查询
- Redis:
SLOWLOG GET分析慢命令
- 高级工具
- 火焰图(FlameGraph):定位CPU热点方法
perf record -F 99 -g -p [pid] -- sleep 30
perf script | FlameGraph/stackcollapse-perf.pl | FlameGraph/flamegraph.pl > cpu.svg
- 动态追踪:BPF/BCC工具包分析内核态瓶颈
调优闭环:
- 通过监控发现CPU飙升 → 2. Arthas定位到频繁Full GC → 3. MAT分析发现大对象缓存未释放 → 4. 修复代码增加缓存淘汰策略 → 5. 重新压测验证
总结
性能测试是系统工程,需掌握:
- 分层定位思想(网络→系统→应用→DB)
- 工具链组合拳(JMeter压测 + APM监控 + Arthas分析)
- 调优辩证思维(80%性能问题由20%代码导致,避免过度优化)
建议建立性能基线库,持续跟踪版本迭代的性能衰减。

被折叠的 条评论
为什么被折叠?



