mengboxin137-blip 6e7c0d8350 feat: 初始化 Maas-Model-platform 项目 il y a 1 jour
..
README.md 6e7c0d8350 feat: 初始化 Maas-Model-platform 项目 il y a 1 jour
aigcspace_test_plan.jmx 6e7c0d8350 feat: 初始化 Maas-Model-platform 项目 il y a 1 jour
billing_perf_test_v3.jmx 6e7c0d8350 feat: 初始化 Maas-Model-platform 项目 il y a 1 jour
run_billing_test.sh 6e7c0d8350 feat: 初始化 Maas-Model-platform 项目 il y a 1 jour
run_tests.sh 6e7c0d8350 feat: 初始化 Maas-Model-platform 项目 il y a 1 jour
stress_ramp_test.jmx 6e7c0d8350 feat: 初始化 Maas-Model-platform 项目 il y a 1 jour
user_data.csv 6e7c0d8350 feat: 初始化 Maas-Model-platform 项目 il y a 1 jour

README.md

JMeter 性能测试方案

文件清单

文件 用途
billing_perf_test.jmx 账单专项测试(验证本次优化效果,优先用这个)
aigcspace_test_plan.jmx 全功能稳定性测试(登录/模型列表/余额/非流式对话)
stress_ramp_test.jmx 阶梯压力测试(10→50→100→200 并发,找崩溃点)
run_billing_test.sh 账单测试运行脚本
run_tests.sh 全功能测试运行脚本
user_data.csv 测试账号数据(需要手动填写)

第一步:准备工作

1. 安装 JMeter

jmeter.apache.org 下载 5.6.x,解压后把 bin/ 加入 PATH。

验证安装:

jmeter --version

2. 填写测试账号

编辑 docs/jmeter/user_data.csv,把占位符换成真实账号:

username,password,encrypted
testuser1,明文密码,false
testuser2,明文密码,false
testuser3,明文密码,false

注意

  • encrypted=false 表示密码是明文,后端会直接验证
  • 多填几个账号,并发时会轮流使用(CSV 循环读取)
  • 账号需要有余额,否则流式对话会返回 402

3. 确认接口地址

默认目标地址是 https://aigc-api.wangxunai.com。如果要测本地或其他环境,运行时用 -Jbase_url= 覆盖。


第二步:验证优化效果(账单专项测试)

这是本次优化的核心测试,覆盖所有改动点:

场景 接口 验证的优化
场景1 GET /api/billing/records 14表串行 → 单表查询
场景2 GET /api/billing/summary 20+次聚合 → 4次SQL
场景3 GET /api/billing/balance check_balance 减少一次查询
场景4 GET /api/billing/consumption-logs 分页查询效果
场景5 POST /api/llm/chat (stream=true) db连接提前关闭修复

运行方式

cd docs/jmeter

# 快速验证(20并发,5分钟)—— 日常验证用这个
bash run_billing_test.sh quick

# 完整测试(50并发,15分钟)—— 正式测试用这个
bash run_billing_test.sh full

也可以直接用 JMeter 命令行:

cd docs/jmeter

# 快速验证
jmeter -n \
  -t billing_perf_test.jmx \
  -Jbase_url=https://aigc-api.wangxunai.com \
  -Jthread_count=20 \
  -Jramp_up=30 \
  -Jduration=300 \
  -l results/billing_quick.jtl \
  -e -o results/billing_quick_report/

查看报告

# 打开 HTML 报告(Windows)
start results/billing_quick_report/index.html

# macOS
open results/billing_quick_report/index.html

第三步:优化前后对比测试

这是验证优化效果最直接的方式:

# 1. 切换到优化前的代码
git stash   # 或 git checkout <优化前的commit>

# 2. 重启后端服务

# 3. 跑一次测试,记录结果目录
bash run_billing_test.sh quick
# 记录:results/billing_quick_report_20250429_XXXXXX/

# 4. 切换回优化后的代码
git stash pop   # 或 git checkout main

# 5. 重启后端服务

# 6. 再跑一次
bash run_billing_test.sh quick
# 记录:results/billing_quick_report_20250429_YYYYYY/

# 7. 对比两次报告

查看对比说明:

bash run_billing_test.sh compare

重点关注指标

打开 HTML 报告后,在 Statistics 页面看这几列:

接口 优化前预期 优化后预期 关注列
GET /api/billing/records P95 > 800ms P95 < 200ms 95th pct
GET /api/billing/summary P95 > 500ms P95 < 150ms 95th pct
GET /api/billing/balance P95 > 300ms P95 < 150ms 95th pct
POST /api/llm/chat(stream) 错误率 > 0 错误率 = 0 Error %

第四步:稳定性测试(全功能)

验证系统在持续负载下不会出现内存泄漏、连接池耗尽等问题:

cd docs/jmeter

# 稳定性测试:20并发,30分钟
bash run_tests.sh stability

# 压力测试:100并发,10分钟
bash run_tests.sh stress

# 阶梯加压:10→50→100→200并发
bash run_tests.sh ramp

常见问题

Q: 登录一直失败(断言报错)

检查 user_data.csv 里的账号密码是否正确,以及 encrypted 字段是否设为 false

Q: 流式对话返回 402

账号余额不足,充值后重试。

Q: 报告里看不到 P95

JMeter 默认报告包含 P95,在 Statistics 页面的 95th pct 列。如果没有,检查 -e -o 参数是否正确传入。

Q: 想在 GUI 模式下调试

jmeter -t billing_perf_test.jmx

在 GUI 里手动点 Run,先确认每个请求都能正常返回,再切命令行模式正式跑。

Q: 想修改并发数或时长

命令行用 -J 参数覆盖:

jmeter -n -t billing_perf_test.jmx \
  -Jthread_count=50 \
  -Jduration=600 \
  ...

或者直接在 GUI 里修改 ThreadGroup 的 Number of ThreadsDuration