# 压力测试方案总结 ## 快速开始 ### 1. 生成测试数据 ```bash ./scripts/stress_test.sh data ``` ### 2. 执行压力测试 ```bash # 混合场景测试(推荐) ./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. 查看报告 ```bash ./scripts/stress_test.sh report ``` ### 4. 清理数据 ```bash ./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`: 混合场景(模拟真实流量比例) **使用示例**: ```bash 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` **包含内容**: - 测试环境准备 - 数据库优化配置 - 索引优化建议 - 性能监控方法 - 常见瓶颈与优化方案 - 持续监控建议 ## 核心压力点分析 ### 高频读场景 1. **商品列表查询**: - 带复杂筛选条件(状态、审核状态、价格区间) - 需要优化索引: `idx_rental_listings_filter` - 建议添加Redis缓存 2. **订单列表查询**: - 多角色视角(租客、号主) - 关联查询多张表 - 优化: 使用游标分页代替OFFSET 3. **钱包流水查询**: - 数据量大(10万+) - 需要按时间倒序 - 优化: 复合索引 `idx_user_created_desc` ### 高频写场景 1. **订单创建和支付**: - 涉及多表事务 - 钱包扣款+订单创建+通知 - 需要确保事务隔离级别 2. **聊天消息发送**: - 高并发写入 - 需要更新会话最后消息时间 - 考虑消息队列异步处理 ### 数据库优化要点 **关键索引**: ```sql -- 商品查询 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); ``` **连接池配置**: ```bash 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 ## 监控命令 ### 实时监控 ```bash # 容器资源使用 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;" ``` ### 慢查询分析 ```bash # 查看慢查询日志 docker exec hfb-mysql tail -100 /var/log/mysql/slow.log ``` ## 常见问题排查 ### 问题1: 商品列表查询慢 **现象**: 查询耗时 > 100ms **排查**: ```sql EXPLAIN SELECT * FROM rental_listings WHERE status = 'active' AND review_status = 'approved' ORDER BY published_at DESC LIMIT 20; ``` **优化**: 添加覆盖索引,避免回表 ### 问题2: 大偏移量分页慢 **现象**: page > 100 时性能急剧下降 **优化**: 使用游标分页 ```sql SELECT * FROM rental_orders WHERE renter_id = ? AND id < ? ORDER BY id DESC LIMIT 20; ``` ### 问题3: 连接池耗尽 **现象**: 大量 "too many connections" 错误 **优化**: - 增加 `max_connections` - 优化查询,减少慢查询 - 检查是否有连接泄漏 ## 下一步优化建议 1. **缓存层**: Redis缓存热点数据(商品详情、用户信息) 2. **读写分离**: 主库写入,从库读取 3. **分库分表**: 当单表超过千万级时考虑 4. **异步处理**: 使用消息队列处理非关键路径操作 5. **CDN加速**: 静态资源和图片使用CDN ## 完整流程示例 ```bash # 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`