5.4 KiB
5.4 KiB
压力测试方案总结
快速开始
1. 生成测试数据
./scripts/stress_test.sh data
2. 执行压力测试
# 混合场景测试(推荐)
./scripts/stress_test.sh test -c 100 -d 60 -s mixed
# 商品列表查询测试
./scripts/stress_test.sh test -c 200 -d 120 -s list_listings
# 订单创建测试
./scripts/stress_test.sh test -c 50 -d 60 -s create_order
3. 查看报告
./scripts/stress_test.sh report
4. 清理数据
./scripts/stress_test.sh clean
已创建的压测工具
1. 数据生成脚本
文件: scripts/load_test_data.sql
功能:
- 批量生成10,000个用户
- 批量生成50,000个租号商品
- 批量生成30,000个订单
- 批量生成100,000条钱包流水
- 批量生成50,000条聊天消息
特点:
- 使用存储过程提高生成效率
- 每1000条自动提交一次
- 模拟真实的业务数据分布
- 支持自定义数量
2. Go压测工具
文件: scripts/stress_test.go
测试场景:
list_listings: 商品列表查询(高频读)create_order: 订单创建(写操作)wallet: 钱包流水查询chat: 聊天消息查询mixed: 混合场景(模拟真实流量比例)
使用示例:
cd scripts
go build -o stress_test stress_test.go
./stress_test -url http://localhost:8080 -c 100 -d 60 -s mixed
3. 一键压测脚本
文件: scripts/stress_test.sh
功能:
data: 生成测试数据test: 执行压力测试monitor: 监控系统性能clean: 清理测试数据report: 生成压测报告all: 执行完整流程
4. 压测指南文档
文件: docs/stress-test-guide.md
包含内容:
- 测试环境准备
- 数据库优化配置
- 索引优化建议
- 性能监控方法
- 常见瓶颈与优化方案
- 持续监控建议
核心压力点分析
高频读场景
-
商品列表查询:
- 带复杂筛选条件(状态、审核状态、价格区间)
- 需要优化索引:
idx_rental_listings_filter - 建议添加Redis缓存
-
订单列表查询:
- 多角色视角(租客、号主)
- 关联查询多张表
- 优化: 使用游标分页代替OFFSET
-
钱包流水查询:
- 数据量大(10万+)
- 需要按时间倒序
- 优化: 复合索引
idx_user_created_desc
高频写场景
-
订单创建和支付:
- 涉及多表事务
- 钱包扣款+订单创建+通知
- 需要确保事务隔离级别
-
聊天消息发送:
- 高并发写入
- 需要更新会话最后消息时间
- 考虑消息队列异步处理
数据库优化要点
关键索引:
-- 商品查询
ALTER TABLE rental_listings
ADD INDEX idx_status_review_published (status, review_status, published_at DESC);
-- 订单查询
ALTER TABLE rental_orders
ADD INDEX idx_renter_status_created (renter_id, status, created_at DESC);
ADD INDEX idx_owner_status_created (owner_id, status, created_at DESC);
-- 钱包流水
ALTER TABLE wallet_ledger
ADD INDEX idx_user_created_desc (user_id, created_at DESC);
ADD INDEX idx_user_biz_created (user_id, biz_type, created_at DESC);
连接池配置:
DB_MAX_OPEN_CONNS=100
DB_MAX_IDLE_CONNS=20
DB_CONN_MAX_LIFETIME=3600
性能目标
响应时间
- 商品列表: P95 < 100ms
- 订单查询: P95 < 80ms
- 钱包流水: P95 < 100ms
- 创建订单: P95 < 300ms
吞吐量
- 读操作: QPS > 1000
- 写操作: QPS > 200
- 混合场景: QPS > 500
监控命令
实时监控
# 容器资源使用
docker stats hfb-backend hfb-mysql hfb-redis
# MySQL连接数
docker exec hfb-mysql mysql -uhfb -psecret -e "SHOW STATUS LIKE 'Threads_connected';"
# 慢查询
docker exec hfb-mysql mysql -uhfb -psecret -e "SHOW STATUS LIKE 'Slow_queries';"
# 正在执行的查询
docker exec hfb-mysql mysql -uhfb -psecret -e "SHOW FULL PROCESSLIST;"
慢查询分析
# 查看慢查询日志
docker exec hfb-mysql tail -100 /var/log/mysql/slow.log
常见问题排查
问题1: 商品列表查询慢
现象: 查询耗时 > 100ms
排查:
EXPLAIN SELECT * FROM rental_listings
WHERE status = 'active' AND review_status = 'approved'
ORDER BY published_at DESC LIMIT 20;
优化: 添加覆盖索引,避免回表
问题2: 大偏移量分页慢
现象: page > 100 时性能急剧下降
优化: 使用游标分页
SELECT * FROM rental_orders
WHERE renter_id = ? AND id < ?
ORDER BY id DESC LIMIT 20;
问题3: 连接池耗尽
现象: 大量 "too many connections" 错误
优化:
- 增加
max_connections - 优化查询,减少慢查询
- 检查是否有连接泄漏
下一步优化建议
- 缓存层: Redis缓存热点数据(商品详情、用户信息)
- 读写分离: 主库写入,从库读取
- 分库分表: 当单表超过千万级时考虑
- 异步处理: 使用消息队列处理非关键路径操作
- CDN加速: 静态资源和图片使用CDN
完整流程示例
# 1. 启动开发环境
./scripts/dev.sh
# 2. 生成测试数据
./scripts/stress_test.sh data
# 3. 执行压测
./scripts/stress_test.sh test -c 100 -d 300 -s mixed
# 4. 监控(另开终端)
./scripts/stress_test.sh monitor
# 5. 查看报告
./scripts/stress_test.sh report
# 6. 清理数据
./scripts/stress_test.sh clean
详细文档请查看: docs/stress-test-guide.md