负载测试(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")
|
测试结果:
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
| def normal_load(): users = 8000 duration = "1h"
def peak_load(): users = 10000 duration = "30m"
def overload(): users = 12000 duration = "15m"
|
3. 执行负载测试
1 2 3 4 5 6
| 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 step_load = 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 压力: - 负载:预期负载、验证性能 - 压力:超出预期、找出极限
|