
性能测试基础概念
大约 6 分钟
性能测试基础概念
🎯 性能测试入门第一课:搞懂这些"行话",你就不是小白了!
就像学开车要先认识油门刹车一样,做性能测试也要先搞懂这些基本概念。
别担心,我用最接地气的方式给你讲明白!🚗
🤔 什么是性能测试?
想象一下,你是一家餐厅的老板:
- 平时:10个客人,2个服务员,井井有条
- 周末:50个客人,还是2个服务员,开始手忙脚乱
- 节假日:100个客人,2个服务员,彻底崩溃!
性能测试就是在"开业"之前,先模拟各种客流量,看看餐厅能承受多少客人!
🎯 性能测试的三大目标
- 🔍 摸底调查:我的系统最多能支持多少用户?
- 🚨 风险预警:在什么情况下系统会"罢工"?
- ⚡ 持续优化:怎么让系统跑得更快更稳?
📊 核心性能指标详解
1. 🏃♂️ TPS/QPS - 系统的"跑步速度"
TPS (Transactions Per Second):每秒事务数 QPS (Queries Per Second):每秒查询数
生活类比:就像收银员每分钟能处理多少个客人
- 新手收银员:1分钟处理5个客人
- 熟练收银员:1分钟处理15个客人
- 自助收银机:1分钟处理30个客人
# 简单计算公式
TPS = 总事务数 / 总时间(秒)
# 例如:10分钟内处理了6000个订单
TPS = 6000 / (10 * 60) = 10 TPS经验值参考:
- 简单查询接口:单机100-500 QPS
- 复杂业务接口:单机10-50 TPS
- 数据库写操作:单机5-20 TPS
2. ⏱️ RT - 系统的"反应速度"
RT (Response Time):响应时间
生活类比:从点餐到上菜的时间
- 快餐店:2分钟上菜 ✅
- 普通餐厅:15分钟上菜 ⚠️
- 高档餐厅:30分钟上菜 ❌
关键指标:
- 平均响应时间:所有请求的平均耗时
- P95响应时间:95%的请求在这个时间内完成
- P99响应时间:99%的请求在这个时间内完成
# 为什么要关注P95、P99?
# 假设100个用户访问:
# - 90个用户:100ms响应 (很快)
# - 9个用户:500ms响应 (还行)
# - 1个用户:5000ms响应 (超慢!)
# 平均响应时间 = (90*100 + 9*500 + 1*5000) / 100 = 185ms
# 看起来不错,但实际上有用户等了5秒!经验值参考:
- 简单接口:P99 < 200ms
- 复杂接口:P99 < 1000ms
- 数据库查询:P95 < 100ms
3. 👥 并发用户数 - 系统的"承载能力"
Concurrent Users:同时在线的用户数
生活类比:餐厅里同时就餐的客人数量
- 小餐厅:同时容纳20人
- 大餐厅:同时容纳200人
- 美食广场:同时容纳2000人
重要区别:
- 在线用户:登录了但可能在发呆
- 活跃用户:正在操作的用户
- 并发用户:同一时刻发请求的用户
# 经验公式
并发用户数 = (总QPS × 平均响应时间) / 1000
# 例如:系统QPS=1000,平均RT=200ms
并发用户数 = (1000 × 200) / 1000 = 2004. 💥 错误率 - 系统的"可靠性"
Error Rate:请求失败的比例
生活类比:餐厅上错菜的概率
- 优秀餐厅:错误率 < 0.01% (万里挑一)
- 普通餐厅:错误率 < 0.1% (千里挑一)
- 差劲餐厅:错误率 > 1% (百里挑一)
常见错误类型:
- 4xx错误:客户端问题(点了没有的菜)
- 5xx错误:服务器问题(厨房出故障)
- 超时错误:响应太慢(等菜等到花儿都谢了)
🏋️♂️ 性能测试的四种"训练模式"
1. 🏃♂️ 基准性能测试 - "单项测试"
目标:测试单个功能的极限性能
类比:测试收银员单独收银的最快速度
# 测试场景示例
def benchmark_test():
"""基准性能测试"""
# 只测试登录接口
# 逐步增加并发,找到最大TPS
for concurrent in [10, 50, 100, 200, 500]:
result = load_test(
url="/api/login",
concurrent_users=concurrent,
duration="5min"
)
print(f"并发{concurrent}: TPS={result.tps}, RT={result.avg_rt}")2. 🏋️♀️ 容量性能测试 - "综合测试"
目标:测试系统整体承载能力
类比:测试整个餐厅在高峰期的服务能力
# 测试场景示例
def capacity_test():
"""容量性能测试"""
# 模拟真实业务比例
scenarios = [
{"name": "浏览商品", "weight": 50, "url": "/api/products"},
{"name": "加购物车", "weight": 30, "url": "/api/cart/add"},
{"name": "下单支付", "weight": 20, "url": "/api/order/create"}
]
# 逐步增加总体压力
for total_users in [100, 500, 1000, 2000]:
result = mixed_load_test(scenarios, total_users, "10min")3. 🕐 稳定性测试 - "耐力测试"
目标:测试系统长时间运行的稳定性
类比:测试餐厅连续营业12小时会不会出问题
# 测试场景示例
def stability_test():
"""稳定性测试"""
# 70%容量压力下持续运行
max_capacity = 1000 # 之前测出的最大容量
stable_load = int(max_capacity * 0.7) # 70%压力
result = load_test(
concurrent_users=stable_load,
duration="24h", # 持续24小时
ramp_up="30min" # 30分钟内逐步加压
)4. 💣 异常场景测试 - "压力测试"
目标:测试系统在异常情况下的表现
类比:测试餐厅在停电、缺人手等异常情况下的应对能力
# 测试场景示例
def chaos_test():
"""异常场景测试"""
scenarios = [
"数据库连接池满了",
"Redis缓存挂了",
"网络延迟突然增加",
"某个微服务下线",
"磁盘空间不足"
]
for scenario in scenarios:
print(f"注入故障: {scenario}")
inject_fault(scenario)
result = load_test(concurrent_users=500, duration="10min")
analyze_impact(result)📈 TPS与RT的"爱恨情仇"
这是性能测试中最重要的关系图:
TPS ↑
| C (最大TPS)
| /|\
| / | \
|B/ | \
|/ | \D
A| | \
| | \
+----+------+----→ RT
| |
舒适区 危险区阶段解析:
- A→B阶段:TPS上升,RT基本稳定(系统很轻松)
- B→C阶段:TPS继续上升,RT开始增加(系统有压力但还能撑)
- C点:TPS达到峰值(系统极限)
- C→D阶段:TPS下降,RT急剧上升(系统开始崩溃)
生活类比:就像餐厅的服务能力
- A→B:客人不多,服务很快
- B→C:客人增多,稍微等等
- C点:餐厅满座,刚好能应付
- C→D:客人太多,服务质量下降,有人离开
🎯 性能测试成功的关键
1. 🎪 真实场景模拟
不要只测单接口,要测业务流程!
# ❌ 错误做法:只测登录接口
def bad_test():
for i in range(1000):
login_api()
# ✅ 正确做法:模拟真实用户行为
def good_test():
user = create_user()
user.login()
user.browse_products(random_time=2-5) # 浏览2-5秒
user.add_to_cart()
user.think_time(10-30) # 思考10-30秒
user.checkout()
user.logout()2. 📊 全面监控
不仅要看应用指标,还要看系统资源!
监控指标清单:
应用层:
- TPS/QPS
- 响应时间
- 错误率
- 线程池使用率
系统层:
- CPU使用率
- 内存使用率
- 磁盘IO
- 网络带宽
数据库:
- 连接数
- 慢查询
- 锁等待
- 缓存命中率3. 🔍 问题定位
发现问题要能快速定位根因!
# 性能问题排查思路
def performance_troubleshooting():
"""性能问题排查流程"""
# 1. 确认现象
symptoms = check_symptoms()
# 2. 分析监控数据
if symptoms.high_response_time:
check_database_performance()
check_network_latency()
check_gc_performance()
# 3. 定位瓶颈
bottleneck = find_bottleneck()
# 4. 制定优化方案
optimization_plan = create_plan(bottleneck)
return optimization_plan🚀 下一步学习建议
恭喜你!掌握了这些基础概念,你已经不是性能测试小白了!
接下来建议学习:
记住:性能测试不是为了把系统搞崩溃,而是为了让系统在关键时刻能够稳如泰山! 🏔️
💡 小贴士:理论学会了,一定要找个项目练练手。就像学游泳,光看书是学不会的,得下水扑腾几下!🏊♂️
