负载测试(Load Testing)

负载测试(Load Testing)

一句话总结:测试系统在预期负载下的性能表现。

🌟 快速理解

就像测试电梯承重

1
2
3
4
5
6
7
8
9
10
11
电梯标注:最大载重1000kg

负载测试:
- 500kg(50%负载):运行流畅 ✅
- 800kg(80%负载):运行正常 ✅
- 1000kg(100%负载):运行缓慢 ⚠️
- 1200kg(120%负载):超载警报 ❌

目的:
- 验证电梯在正常负载下能否正常工作
- 找出性能瓶颈

📌 核心概念

什么是负载测试?

负载测试:测试系统在预期负载(用户数、请求数)下的性能表现。

负载测试 vs 压力测试 vs 性能测试

维度 负载测试 压力测试 性能测试
目的 验证正常负载 找出极限 评估性能
负载 预期负载 超出预期 各种负载
关注点 响应时间、吞吐量 崩溃点 全面性能

🎯 真实案例

案例:淘宝双11负载测试

背景:2023年双11,淘宝预计峰值流量

负载测试目标

1
2
3
4
预期负载:
- 并发用户:1000万
- 每秒请求:50万TPS
- 峰值时段:20:00-22:00

负载测试过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
from locust import HttpUser, task, between

class TaobaoUser(HttpUser):
wait_time = between(1, 3)

@task(5)
def browse_products(self):
"""浏览商品(高频操作)"""
self.client.get("/products")

@task(3)
def search(self):
"""搜索商品"""
self.client.get("/search?q=iPhone")

@task(2)
def add_to_cart(self):
"""加入购物车"""
self.client.post("/cart", json={
"product_id": 123,
"quantity": 1
})

@task(1)
def checkout(self):
"""下单(低频但重要)"""
self.client.post("/checkout")

# 负载测试配置
# 用户数:从0逐步增加到1000万
# 增长速率:每秒增加1000用户
# 持续时间:2小时

测试结果

1
2
3
4
5
6
7
8
9
10
11
负载级别 | 并发用户 | 响应时间 | 吞吐量 | CPU | 内存
--------|---------|---------|--------|-----|-----
50% | 500万 | 200ms | 25万TPS | 60% | 50%
80% | 800万 | 500ms | 40万TPS | 80% | 70%
100% | 1000万 | 1000ms | 50万TPS | 90% | 85%
120% | 1200万 | 3000ms | 45万TPS | 95% | 90%

结论:
✅ 系统可以支撑1000万并发用户
⚠️ 响应时间在100%负载时达到1秒
❌ 超过100%负载时性能下降

优化措施

1
2
3
4
1. 增加服务器数量(水平扩展)
2. 优化数据库查询(添加索引)
3. 增加缓存(Redis)
4. 使用CDN加速静态资源

✅ 负载测试流程

1. 确定负载目标

1
2
3
4
5
负载目标:
- 并发用户数:10000
- 每秒请求数(TPS):1000
- 响应时间:< 500ms
- 错误率:< 1%

2. 设计负载场景

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 场景1:正常负载(80%)
def normal_load():
users = 8000
duration = "1h"

# 场景2:峰值负载(100%)
def peak_load():
users = 10000
duration = "30m"

# 场景3:超载(120%)
def overload():
users = 12000
duration = "15m"

3. 执行负载测试

1
2
3
4
5
6
# 使用Locust执行负载测试
locust -f loadtest.py \
--users 10000 \
--spawn-rate 100 \
--run-time 1h \
--host https://example.com

4. 分析测试结果

1
2
3
4
5
6
7
8
9
10
11
12
性能指标:
- 响应时间:平均500ms,P95 1000ms
- 吞吐量:1000 TPS
- 错误率:0.5%
- CPU使用率:80%
- 内存使用率:70%

瓶颈分析:
❌ 数据库查询慢(平均300ms)
❌ API响应慢(平均200ms)
✅ 网络带宽充足
✅ 服务器资源充足

🛠️ 负载测试工具

工具 特点 推荐度
Locust Python、易用、分布式 ⭐⭐⭐⭐⭐
K6 Go、高性能、云原生 ⭐⭐⭐⭐⭐
JMeter Java、功能丰富 ⭐⭐⭐⭐
Gatling Scala、高性能 ⭐⭐⭐⭐

📊 最佳实践

1. 逐步增加负载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 错误做法:直接施加最大负载
users = 10000 # ❌

# 正确做法:逐步增加负载
from locust import LoadTestShape

class StepLoadShape(LoadTestShape):
step_time = 300 # 每个阶段5分钟
step_load = 2000 # 每次增加2000用户

def tick(self):
run_time = self.get_run_time()
current_step = run_time // self.step_time

if current_step < 5:
return (current_step + 1) * self.step_load, 100
else:
return None

2. 监控系统资源

1
2
3
4
5
6
7
8
9
# 监控指标
metrics:
- response_time
- throughput
- error_rate
- cpu_usage
- memory_usage
- disk_io
- network_io

3. 使用真实数据

1
2
3
4
5
6
7
8
# 错误做法:使用固定数据
user_id = 123 # ❌

# 正确做法:使用真实数据
import random

user_ids = range(1, 100000)
user_id = random.choice(user_ids) # ✅

🔗 相关主题

  • [[压力测试]] - 测试系统极限
  • [[性能测试]] - 包含负载测试
  • [[耐力测试]] - 长时间负载测试

💡 快速参考

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
负载测试速查表
================

定义:测试系统在预期负载下的性能表现

核心指标:
⏱️ 响应时间
📊 吞吐量
❌ 错误率
💻 资源使用率

负载测试流程:
1. 确定负载目标
2. 设计负载场景
3. 执行负载测试
4. 分析测试结果

推荐工具:
- Locust(Python、易用)
- K6(Go、高性能)
- JMeter(Java、功能丰富)

最佳实践:
1. 逐步增加负载
2. 监控系统资源
3. 使用真实数据
4. 多次测试验证

负载 vs 压力:
- 负载:预期负载、验证性能
- 压力:超出预期、找出极限