性能测试
性能测试是评估系统性能指标的重要手段,通过压力测试、负载测试等方式,发现系统性能瓶颈,为性能优化提供依据。
📋 性能测试类型
🎯 性能测试指标
1. 响应时间指标
指标定义:
- 平均响应时间:所有请求的平均响应时间
- P50响应时间:50%的请求响应时间
- P95响应时间:95%的请求响应时间
- P99响应时间:99%的请求响应时间
- 最大响应时间:最慢请求的响应时间
参考标准:
| 接口类型 | 平均响应时间 | P95响应时间 | P99响应时间 |
|---|---|---|---|
| 查询接口 | < 100ms | < 200ms | < 500ms |
| 写入接口 | < 200ms | < 500ms | < 1000ms |
| 批量接口 | < 1000ms | < 2000ms | < 5000ms |
2. 吞吐量指标
指标定义:
- TPS(Transactions Per Second):每秒事务数
- QPS(Queries Per Second):每秒查询数
- RPS(Requests Per Second):每秒请求数
计算公式:
TPS = 总事务数 / 测试时间
QPS = 总查询数 / 测试时间
RPS = 总请求数 / 测试时间3. 并发指标
指标定义:
- 并发用户数:同时在线用户数
- 并发请求数:同时处理的请求数
- 峰值并发:系统能够承受的最大并发数
4. 资源利用率指标
系统资源:
- CPU使用率:CPU使用百分比
- 内存使用率:内存使用百分比
- 磁盘I/O:磁盘读写速率
- 网络带宽:网络流量大小
参考标准:
| 资源类型 | 正常范围 | 告警阈值 | 危险阈值 |
|---|---|---|---|
| CPU使用率 | < 70% | 70-85% | > 85% |
| 内存使用率 | < 80% | 80-90% | > 90% |
| 磁盘I/O | < 80% | 80-90% | > 90% |
| 网络带宽 | < 80% | 80-90% | > 90% |
🎯 性能测试工具
1. JMeter
JMeter是Apache开源的性能测试工具,功能强大。
1.1 JMeter 测试计划
测试计划结构:
1.2 JMeter 测试脚本
基础测试脚本:
xml
<TestPlan version="1.2">
<ThreadGroup>
<stringProp name="ThreadGroup.num_threads">100</stringProp>
<stringProp name="ThreadGroup.ramp_time">10</stringProp>
<stringProp name="ThreadGroup.duration">60</stringProp>
<HTTPSamplerProxy>
<stringProp name="HTTPSampler.domain">api.example.com</stringProp>
<stringProp name="HTTPSampler.path">/api/v1/users</stringProp>
<stringProp name="HTTPSampler.method">GET</stringProp>
</HTTPSamplerProxy>
<ResponseAssertion>
<stringProp name="Assertion.test_type">16</stringProp>
<stringProp name="Assertion.response_code">200</stringProp>
</ResponseAssertion>
</ThreadGroup>
<ResultCollector>
<objProp>
<name>filename</name>
<value>/tmp/jmeter-results.jtl</value>
</objProp>
</ResultCollector>
</TestPlan>1.3 JMeter 性能测试场景
场景1:负载测试
bash
# 运行负载测试
jmeter -n -t test-plan.jmx -l results.jtl
# 查看结果
jmeter -g results.jtl -o report/场景2:压力测试
- 逐步增加并发用户数
- 观察系统性能变化
- 找出系统性能极限
场景3:稳定性测试
- 长时间运行测试
- 观察系统稳定性
- 检测内存泄漏
参考资源:
- JMeter 官方文档
- 视频推荐:JMeter 性能测试实战
- 书籍推荐:《JMeter性能测试实战》
2. Gatling
Gatling是基于Scala的高性能负载测试工具。
特点:
- 高性能:比JMeter性能更高
- DSL语法:使用Scala DSL编写测试脚本
- 详细报告:生成详细的HTML报告
测试脚本示例:
scala
class UserApiSimulation extends Simulation {
val httpProtocol = http
.baseUrl("https://api.example.com")
.acceptHeader("application/json")
val scn = scenario("User API Test")
.exec(http("Get User")
.get("/api/v1/users/1")
.check(status.is(200)))
.pause(1)
.exec(http("Create User")
.post("/api/v1/users")
.body(StringBody("""{"name":"John","email":"john@example.com"}"""))
.check(status.is(201)))
setUp(
scn.inject(
rampUsers(100) during (10 seconds),
constantUsersPerSec(10) during (60 seconds)
)
).protocols(httpProtocol)
}参考资源:
3. K6
K6是现代化的性能测试工具,使用JavaScript编写测试脚本。
特点:
- 现代化:使用ES6+语法
- 云原生:支持容器化部署
- 实时监控:支持实时监控指标
测试脚本示例:
javascript
import http from 'k6/http';
import { check, sleep } from 'k6';
export let options = {
stages: [
{ duration: '10s', target: 100 },
{ duration: '1m', target: 100 },
{ duration: '10s', target: 0 },
],
};
export default function () {
let res = http.get('https://api.example.com/api/v1/users/1');
check(res, {
'status is 200': (r) => r.status === 200,
'response time < 200ms': (r) => r.timings.duration < 200,
});
sleep(1);
}参考资源:
📋 性能测试流程
1. 测试准备
准备步骤:
- 明确测试目标:确定要测试的性能指标
- 准备测试环境:搭建测试环境
- 准备测试数据:准备测试数据
- 编写测试脚本:编写性能测试脚本
2. 执行测试
执行步骤:
- 基准测试:测试系统基准性能
- 负载测试:逐步增加负载
- 压力测试:测试系统极限
- 稳定性测试:长时间运行测试
3. 结果分析
分析内容:
- 性能指标分析:分析响应时间、吞吐量等指标
- 瓶颈定位:定位性能瓶颈
- 问题分析:分析性能问题原因
- 优化建议:提出性能优化建议
4. 性能调优
调优步骤:
- 代码优化:优化代码逻辑
- 配置优化:优化系统配置
- 架构优化:优化系统架构
- 验证效果:验证优化效果
📋 性能测试最佳实践
1. 测试环境
环境要求:
- 与生产环境一致:测试环境应尽可能接近生产环境
- 独立环境:测试环境应独立,不影响其他环境
- 可重现性:测试环境应可重现
2. 测试数据
数据准备:
- 真实数据:使用真实或接近真实的数据
- 数据量充足:准备足够的数据量
- 数据多样性:准备多样化的测试数据
3. 测试场景
场景设计:
- 真实场景:模拟真实用户行为
- 典型场景:测试典型业务场景
- 极端场景:测试极端情况
4. 结果分析
分析方法:
- 多维度分析:从多个维度分析结果
- 对比分析:与基准结果对比
- 趋势分析:分析性能趋势
📖 学习资源
视频教程
书籍推荐
- 《性能测试实战》 - 专门讲解性能测试
- 《JMeter性能测试实战》 - JMeter使用指南
- 《软件性能测试过程详解与案例剖析》 - 性能测试方法和案例
- 《高性能网站建设指南》 - 网站性能优化
网站资源
工具推荐
- 性能测试工具:JMeter、Gatling、K6、Locust
- 监控工具:Prometheus、Grafana、New Relic
- 分析工具:JProfiler、VisualVM、Arthas
✅ 性能测试检查清单
- [ ] 性能测试计划已制定
- [ ] 测试环境已准备
- [ ] 测试脚本已编写
- [ ] 性能测试已执行
- [ ] 测试结果已分析
- [ ] 性能瓶颈已定位
- [ ] 优化方案已制定
- [ ] 优化效果已验证