性能压力测试套件
水务管理系统性能压力测试工具集,覆盖 REST API、WebSocket、MQTT IoT、数据库查询四大模块。
📁 文件说明
| 文件 |
说明 |
locustfile.py |
REST API 压力测试 (Locust 框架) |
websocket_stress.py |
WebSocket 长连接并发测试 |
mqtt_iot_stress.py |
IoT MQTT 设备并发模拟 |
db_query_stress.py |
大数据量数据库查询性能测试 |
run_all_benchmarks.sh |
统一压测入口脚本 |
report_template.md |
压测报告模板 |
requirements.txt |
Python 依赖 |
🚀 快速开始
1. 安装依赖
cd tests/performance
pip install -r requirements.txt
2. 运行全部测试
# 完整测试(约 30 分钟)
bash run_all_benchmarks.sh
# 快速模式(约 5 分钟,适合 CI/CD)
bash run_all_benchmarks.sh --quick
# 指定输出目录
bash run_all_benchmarks.sh --output-dir ./my-report
3. 运行单项测试
REST API 压测
# 图形界面模式(浏览器打开 http://localhost:8089)
locust -f locustfile.py --host=http://localhost:8080
# 无头模式,100 并发,运行 5 分钟
locust -f locustfile.py --host=http://localhost:8080 \
--headless -u 100 -r 10 --run-time 5m
# 梯度负载测试
locust -f locustfile.py --host=http://localhost:8080 \
--headless --class-picker StepLoadShape
WebSocket 压测
# 100 并发连接,60 秒
python websocket_stress.py --clients 100 --duration 60
# 梯度测试 (100/500/1000/5000)
python websocket_stress.py --step --output ws_result.json
MQTT IoT 压测
# 模拟 500 设备,每 5 秒上报,运行 2 分钟
python mqtt_iot_stress.py --devices 500 --duration 120 --freq 5
# 梯度测试
python mqtt_iot_stress.py --step --output mqtt_result.json
# 高频上报 (1 秒)
python mqtt_iot_stress.py --devices 1000 --freq 1 --duration 60
数据库查询压测
# 生成 100 万条数据 + 运行查询测试 + 索引对比
python db_query_stress.py --generate-data 1000000 --index-compare
# 跳过数据生成(已有数据)
python db_query_stress.py --skip-data-gen --index-compare
# 指定数据库连接
python db_query_stress.py --host db.example.com --db water_management \
--user admin --password secret --generate-data 500000
📊 解读报告
REST API 报告
| 指标 |
说明 |
参考阈值 |
| 平均响应时间 |
所有请求的平均耗时 |
< 200ms |
| P95 响应时间 |
95% 请求的耗时上限 |
< 1000ms |
| P99 响应时间 |
99% 请求的耗时上限 |
< 3000ms |
| 吞吐量 (RPS) |
每秒处理请求数 |
越高越好 |
| 错误率 |
失败请求占比 |
< 1% |
WebSocket 报告
| 指标 |
说明 |
参考阈值 |
| 连接成功率 |
成功建立连接的比例 |
> 99% |
| 消息延迟 |
消息从发送到收到的时间 |
< 100ms |
| 断连率 |
连接断开的比例 |
< 5% |
| 内存消耗 |
服务器内存使用 |
视硬件而定 |
MQTT 报告
| 指标 |
说明 |
参考阈值 |
| 连接成功率 |
设备连接成功率 |
> 99% |
| 发布延迟 |
消息发布时间 |
< 50ms |
| 吞吐量 |
每秒消息处理量 |
视配置而定 |
数据库报告
| 指标 |
说明 |
参考阈值 |
| 简单查询 |
单表查询耗时 |
< 100ms |
| 聚合查询 |
GROUP BY 聚合耗时 |
< 500ms |
| JOIN 查询 |
多表关联耗时 |
< 1000ms |
| GIS 查询 |
空间查询耗时 |
< 500ms |
⚙️ 环境变量配置
| 变量 |
默认值 |
说明 |
API_HOST |
localhost |
REST API 地址 |
API_PORT |
8080 |
REST API 端口 |
WS_HOST |
localhost |
WebSocket 地址 |
WS_PORT |
8765 |
WebSocket 端口 |
MQTT_BROKER |
localhost |
MQTT Broker 地址 |
MQTT_PORT |
1883 |
MQTT Broker 端口 |
DB_HOST |
localhost |
数据库地址 |
DB_PORT |
5432 |
数据库端口 |
DB_NAME |
water_management |
数据库名 |
DB_USER |
postgres |
数据库用户 |
DB_PASS |
postgres |
数据库密码 |
❓ 常见问题
Q: Locust 安装失败
pip install --upgrade pip setuptools wheel
pip install locust
Q: psycopg2 安装失败
# Debian/Ubuntu
sudo apt-get install libpq-dev
pip install psycopg2-binary
# macOS
brew install postgresql
pip install psycopg2-binary
Q: WebSocket 连接被拒绝
确认 WebSocket 服务已启动且端口正确:
# 检查端口
ss -tlnp | grep 8765
# 或用 curl 测试
curl -i -N -H "Connection: Upgrade" -H "Upgrade: websocket" http://localhost:8765/ws
Q: MQTT 连接失败
确认 EMQX 或其他 MQTT Broker 已启动:
# Docker 方式启动 EMQX
docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p 18083:18083 emqx/emqx
Q: 数据库查询测试报错
确认 PostgreSQL 已启动且可访问:
psql -h localhost -U postgres -d water_management -c "SELECT 1"
Q: 测试数据太多占磁盘
# 测试完成后清理
psql -h localhost -U postgres -d water_management -c \
"TRUNCATE TABLE perf_sensor_data, perf_alarms, perf_devices"
📈 推荐测试流程
- 先单项测试:分别运行四个测试,确认各自正常
- 再快速模式:
run_all_benchmarks.sh --quick 快速验证全流程
- 最后完整测试:
run_all_benchmarks.sh 执行完整压力测试
- 分析瓶颈:对比各项结果,找出系统瓶颈
- 优化后复测:针对瓶颈优化后重新测试,对比改善效果
📝 License
本项目内部使用,请遵循项目根目录的 LICENSE。