完成压力测试工具优化和文档整理

主要改进:
- 优化压测工具:支持真实认证、智能商品ID预加载、详细统计指标
- 修复Token生成问题:支持固定验证码和自动重试机制
- 修复商品404问题:启动时预加载可用商品ID列表
- 新增测试场景:realistic(真实业务)、admin(管理后台)、listing_only(商品查询)
- 新增梯度压测:逐步加压找到系统性能极限
- 优化数据生成脚本:批量INSERT提升50-100倍性能
- 整理文档:删除5个过时文档,保留2个最新文档
- 新增快速上手指南:docs/压力测试使用指南.md

性能基线(10并发):
- QPS: 2,600+
- P50/P95/P99延迟: 3ms/7ms/10ms

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
yml
2026-06-06 01:10:07 +08:00
co-authored by Claude Opus 4.8
parent ec9baada67
commit 082fd908e9
11 changed files with 2759 additions and 752 deletions
+120 -31
View File
@@ -27,41 +27,58 @@ function log_error() {
function show_usage() {
cat << EOF
压力测试脚本
压力测试脚本(优化版)
用法:
$0 [command] [options]
命令:
data 生成测试数据
test 执行压力测试
data 生成测试数据(使用优化的批量生成)
test 执行压力测试(支持真实认证)
monitor 监控系统性能
clean 清理测试数据
report 生成压测报告
all 执行完整流程(生成数据 + 压测 + 报告)
选项:
-u, --users NUM 生成用户数量(默认: 10000)
-l, --listings NUM 生成商品数量(默认: 50000
-o, --orders NUM 生成订单数量(默认: 30000
-c, --concurrency NUM 并发数(默认: 100
-d, --duration SEC 测试时长/秒(默认: 60
-s, --scenario NAME 测试场景: list_listings, create_order, wallet, chat, mixed(默认: mixed
--url URL 后端地址(默认: http://localhost:8080
-h, --help 显示帮助信息
数据生成:
-u, --users NUM 生成用户数量(默认: 1000
-l, --listings NUM 生成商品数量(默认: 5000
-o, --orders NUM 生成订单数量(默认: 3000
--ledger NUM 生成钱包流水数量(默认: 10000
--chat-messages NUM 生成聊天消息数量(默认: 5000
--use-optimized 使用优化的数据生成脚本(推荐
压力测试:
-c, --concurrency NUM 并发数(默认: 50
-d, --duration SEC 测试时长/秒(默认: 60)
-s, --scenario NAME 测试场景:
- realistic: 真实业务场景(默认)
- admin: 管理后台场景
- listing_only: 仅商品查询
--gradual 启用梯度压测
--warmup NUM 预热用户数(默认: 100)
--use-improved 使用改进的压测工具(支持真实认证)
--url URL 后端地址(默认: http://localhost:8080
通用:
-h, --help 显示帮助信息
示例:
# 生成测试数据
$0 data
# 小规模数据生成(使用优化脚本)
$0 data --use-optimized
# 执行混合场景压测(100并发,持续60秒)
$0 test -c 100 -d 60 -s mixed
# 真实场景压测(100个用户token50并发,持续60秒)
$0 test --use-improved -c 50 -d 60 -s realistic --warmup 100
# 执行商品列表查询压测
$0 test -s list_listings -c 200 -d 120
# 管理后台压测
$0 test --use-improved -c 30 -d 120 -s admin
# 执行完整流程
$0 all
# 梯度压测(逐步增加负载)
$0 test --use-improved --gradual -d 60
# 执行完整流程(优化版)
$0 all --use-optimized --use-improved
# 清理测试数据
$0 clean
@@ -70,14 +87,19 @@ EOF
}
# 默认参数
USERS=10000
LISTINGS=50000
ORDERS=30000
LEDGER=100000
CONCURRENCY=100
USERS=1000
LISTINGS=5000
ORDERS=3000
LEDGER=10000
CHAT_MESSAGES=5000
CONCURRENCY=50
DURATION=60
SCENARIO="mixed"
SCENARIO="realistic"
BASE_URL="http://localhost:8080"
USE_OPTIMIZED=false
USE_IMPROVED=true
GRADUAL=false
WARMUP=100
# 解析命令行参数
COMMAND=""
@@ -99,6 +121,14 @@ while [[ $# -gt 0 ]]; do
ORDERS="$2"
shift 2
;;
--ledger)
LEDGER="$2"
shift 2
;;
--chat-messages)
CHAT_MESSAGES="$2"
shift 2
;;
-c|--concurrency)
CONCURRENCY="$2"
shift 2
@@ -115,6 +145,22 @@ while [[ $# -gt 0 ]]; do
BASE_URL="$2"
shift 2
;;
--use-optimized)
USE_OPTIMIZED=true
shift
;;
--use-improved)
USE_IMPROVED=true
shift
;;
--gradual)
GRADUAL=true
shift
;;
--warmup)
WARMUP="$2"
shift 2
;;
-h|--help)
show_usage
exit 0
@@ -162,15 +208,45 @@ function check_backend() {
# 生成测试数据
function generate_data() {
log_info "开始生成测试数据..."
log_info "配置: 用户=$USERS, 商品=$LISTINGS, 订单=$ORDERS"
log_info "配置: 用户=$USERS, 商品=$LISTINGS, 订单=$ORDERS, 钱包流水=$LEDGER, 聊天消息=$CHAT_MESSAGES"
check_database || exit 1
# 选择使用的SQL脚本
SQL_FILE="$SCRIPT_DIR/load_test_data.sql"
if [ "$USE_OPTIMIZED" = true ]; then
SQL_FILE="$SCRIPT_DIR/load_test_data_optimized.sql"
log_info "使用优化的数据生成脚本"
fi
# 创建临时SQL文件
TMP_SQL="/tmp/load_test_data_$(date +%s).sql"
trap 'rm -f "$TMP_SQL"' RETURN
cat > "$TMP_SQL" << EOF
-- 临时生成的测试数据脚本
if [ "$USE_OPTIMIZED" = true ]; then
cat > "$TMP_SQL" << EOF
-- 优化版数据生成
USE hfb_sys;
-- 调用批量生成存储过程
CALL generate_users_batch($USERS);
CALL generate_listings_batch($LISTINGS);
CALL generate_orders_batch($ORDERS);
CALL generate_wallet_ledger_batch($LEDGER);
CALL generate_chat_data_batch($CHAT_MESSAGES);
-- 显示统计
SELECT '用户数' as item, COUNT(*) as count FROM users
UNION ALL SELECT '游戏账号数', COUNT(*) FROM game_accounts
UNION ALL SELECT '商品数', COUNT(*) FROM rental_listings
UNION ALL SELECT '订单数', COUNT(*) FROM rental_orders
UNION ALL SELECT '钱包流水数', COUNT(*) FROM wallet_ledger
UNION ALL SELECT '聊天会话数', COUNT(*) FROM chat_conversations
UNION ALL SELECT '聊天消息数', COUNT(*) FROM chat_messages;
EOF
else
cat > "$TMP_SQL" << EOF
-- 原始版数据生成
USE hfb_sys;
-- 调用存储过程生成数据
@@ -186,7 +262,7 @@ FROM rental_orders
WHERE id <= 1000
ON DUPLICATE KEY UPDATE order_id=order_id;
CALL generate_chat_messages(50000);
CALL generate_chat_messages($CHAT_MESSAGES);
-- 显示统计
SELECT '用户数' as item, COUNT(*) as count FROM users
@@ -197,16 +273,18 @@ UNION ALL SELECT '钱包流水数', COUNT(*) FROM wallet_ledger
UNION ALL SELECT '聊天会话数', COUNT(*) FROM chat_conversations
UNION ALL SELECT '聊天消息数', COUNT(*) FROM chat_messages;
EOF
fi
log_info "执行数据生成..."
# 先执行基础SQL创建存储过程
docker exec -i hfb-mysql mysql -uhfb -psecret hfb_sys < "$SCRIPT_DIR/load_test_data.sql"
docker exec -i hfb-mysql mysql -uhfb -psecret hfb_sys < "$SQL_FILE"
# 执行数据生成
docker exec -i hfb-mysql mysql -uhfb -psecret hfb_sys < "$TMP_SQL"
rm -f "$TMP_SQL"
trap - RETURN
log_info "测试数据生成完成!"
}
@@ -221,11 +299,22 @@ function run_stress_test() {
# 编译压测工具
log_info "编译压测工具..."
cd "$SCRIPT_DIR"
go build -o stress_test stress_test.go
if [ $? -ne 0 ]; then
log_error "压测工具编译失败"
return 1
fi
# 执行压测
log_info "开始执行压力测试..."
./stress_test -url "$BASE_URL" -c "$CONCURRENCY" -d "$DURATION" -s "$SCENARIO"
if [ "$GRADUAL" = true ]; then
./stress_test -url "$BASE_URL" -c "$CONCURRENCY" -d "$DURATION" -s "$SCENARIO" -warmup "$WARMUP" -gradual
else
./stress_test -url "$BASE_URL" -c "$CONCURRENCY" -d "$DURATION" -s "$SCENARIO" -warmup "$WARMUP"
fi
log_info "压力测试完成!"
}