- user-apikey-lifecycle: /api/v1/keys -> /api/v1/api-keys (24 occurrences) - admin-users: balance payload uses balance+operation+notes - admin-groups: rate-multiplier already uses correct format
12 KiB
12 KiB
Sub2API 性能测试计划
1. 概述
本文档定义了 Sub2API 的全面性能测试计划,旨在:
- 了解系统当前性能基线
- 识别性能瓶颈
- 为后续优化提供数据支持
2. 测试环境
2.1 硬件环境
| 组件 | 配置 | 备注 |
|---|---|---|
| CPU | 8 核 | 本地测试环境 |
| 内存 | 16GB | |
| 磁盘 | SSD 512GB | |
| 网络 | 100Mbps |
2.2 软件环境
| 组件 | 版本 | 备注 |
|---|---|---|
| 操作系统 | Windows 11 | |
| Go | 1.25+ | |
| PostgreSQL | 15+ | 本地运行 |
| Redis | 7+ | 本地运行 (127.0.0.1:6379) |
| Node.js | 18+ | 前端构建 |
2.3 测试工具
| 工具 | 用途 | 状态 |
|---|---|---|
| Go Benchmark | 单元级性能测试 | ✅ 已内置 8 个 benchmark 文件 |
| Artillery | 负载测试 | ✅ 技能可用 |
| K6 | 负载测试 | ✅ 技能可用 |
| Playwright | 前端性能测试 | ✅ 已配置 |
3. 测试类型
3.1 微基准测试 (Micro-Benchmarks)
已存在的 Go Benchmark 测试:
| 文件 | 测试范围 |
|---|---|
gateway_service_benchmark_test.go |
Session Hash 生成, 内容提取 |
gateway_anthropic_apikey_passthrough_benchmark_test.go |
SSE 解析, 使用统计 |
openai_account_scheduler_benchmark_test.go |
账号选择器 |
openai_ws_pool_benchmark_test.go |
WebSocket 连接池 |
openai_ws_forwarder_benchmark_test.go |
WebSocket 转发 |
openai_json_optimization_benchmark_test.go |
JSON 优化 |
http_upstream_benchmark_test.go |
HTTP 上游请求 |
concurrency_cache_benchmark_test.go |
并发缓存 |
运行命令
# 运行所有 benchmark
cd backend
go test -bench=. -benchmem ./...
# 运行特定 benchmark
go test -bench=BenchmarkGenerateSessionHash -benchmem ./internal/service/...
# 生成 CPU profile
go test -bench=. -cpuprofile=cpu.prof ./...
go test -bench=. -memprofile=mem.prof ./...
3.2 负载测试 (Load Tests)
使用 Artillery/K6 进行 API 负载测试。
测试场景
| 场景 | 描述 | 并发数 |
|---|---|---|
| 登录 | 用户登录 | 10, 50, 100, 500 |
| 获取账号列表 | 管理员获取账号列表 | 10, 50, 100 |
| API 转发 | 核心 API 转发 (模拟用户请求) | 10, 50, 100, 500, 1000 |
| WebSocket | 流式响应 | 10, 50, 100 |
| 混合场景 | 组合负载 | 100 |
测试脚本位置
tests/
├── performance/ # 性能测试
│ ├── artillery/ # Artillery 测试
│ │ ├── login.yml
│ │ ├── api-gateway.yml
│ │ ├── websocket.yml
│ │ └── mixed.yml
│ ├── k6/ # K6 测试
│ │ ├── login.js
│ │ ├── api-gateway.js
│ │ └── mixed.js
│ └── reports/ # 测试报告
└── ...
Artillery 配置示例
# tests/performance/artillery/api-gateway.yml
config:
target: "http://localhost:8080"
phases:
- duration: 60
arrivalRate: 10
name: "Warm up"
- duration: 120
arrivalRate: 50
name: "Load test"
- duration: 60
arrivalRate: 100
name: "Stress test"
processor: "./processors.js"
scenarios:
- name: "Chat Completions API"
flow:
- post:
url: "/v1/chat/completions"
json:
model: "gpt-4"
messages:
- role: "user"
content: "Hello"
stream: true
beforeRequest: "setAuthHeader"
3.3 压力测试 (Stress Tests)
逐步增加负载直到系统崩溃,确定系统极限。
| 指标 | 目标 | 告警阈值 |
|---|---|---|
| RPS (请求/秒) | > 500 | < 100 |
| 延迟 P99 | < 500ms | > 1000ms |
| 错误率 | < 1% | > 5% |
| CPU 使用率 | < 80% | > 90% |
| 内存使用 | < 80% | > 90% |
3.4 持久连接测试
测试 WebSocket 和长连接性能。
// K6 WebSocket 测试
import ws from 'k6/ws';
export const options = {
vus: 100,
duration: '60s',
};
export default function() {
ws.connect('ws://localhost:8080/v1/chat/completions', {}, function(socket) {
socket.on('message', (data) => {
// 处理消息
});
socket.send(JSON.stringify({
model: 'gpt-4',
messages: [{ role: 'user', content: 'Hello' }],
stream: true
}));
socket.close();
});
}
3.5 数据库性能测试
| 测试项 | 描述 |
|---|---|
| 连接池 | PostgreSQL 连接池大小测试 |
| 查询性能 | 复杂查询响应时间 |
| 写入性能 | 高并发写入测试 |
| 索引效率 | 查询计划分析 |
已实现的基准测试文件
| 文件 | 测试内容 |
|---|---|
internal/repository/database_benchmark_test.go |
基础数据库操作 |
internal/repository/database_concurrency_benchmark_test.go |
并发数据库操作 |
基准测试项目
基础操作:
BenchmarkDB_AccountSelectByID- 按 ID 查询账号BenchmarkDB_AccountList- 账号分页查询BenchmarkDB_AccountListAll- 查询所有账号BenchmarkDB_AccountFilterByPlatform- 按平台筛选BenchmarkDB_AccountUpdateLastUsed- 更新最后使用时间BenchmarkDB_GroupSelectByID- 查询分组BenchmarkDB_GroupList- 分组列表查询BenchmarkDB_GroupWithAccounts- 分组+账号关联查询BenchmarkDB_APIKeySelectByKey- API Key 查询BenchmarkDB_APIKeyListByUser- 用户 API Keys 查询BenchmarkDB_UsageLogInsert- 使用日志写入BenchmarkDB_UsageLogQueryByUser- 使用日志查询
并发操作:
BenchmarkDB_ConcurrentAccountReads- 并发账号读取BenchmarkDB_ConcurrentUsageLogWrites- 并发日志写入BenchmarkDB_ConcurrentAPIKeyLookups- 并发 Key 查询BenchmarkDB_AccountPoolQuery- 账号池查询 (调度器模拟)
# 运行数据库基准测试 (需要 integration tag)
cd backend
go test -tags=integration -bench=DB -benchmem ./internal/repository/...
3.6 Redis 性能测试
| 测试项 | 描述 |
|---|---|
| 缓存命中 | 缓存读写性能 |
| 会话存储 | Session 读写性能 |
| 分布式锁 | 锁竞争性能 |
3.7 前端性能测试
使用 Playwright 进行前端性能测试。
// tests/performance/frontend-perf.spec.ts
import { test, expect } from '@playwright/test';
test('dashboard page performance', async ({ page }) => {
const metrics = [];
page.on('request', (request) => {
metrics.push({ url: request.url(), timing: Date.now() });
});
await page.goto('http://localhost:8080/dashboard');
// 等待页面加载完成
await page.waitForLoadState('networkidle');
// 测量 Core Web Vitals
const metrics = await page.evaluate(() => {
return JSON.parse(JSON.stringify(performance));
});
console.log('FCP:', metrics.domContentLoaded);
console.log('LCP:', metrics.loadEventEnd);
});
4. 测试指标
4.1 核心指标
| 指标 | 说明 | 目标值 |
|---|---|---|
| TPS | 事务/秒 | > 1000 |
| QPS | 查询/秒 | > 2000 |
| 延迟 Avg | 平均响应时间 | < 100ms |
| 延迟 P50 | 中位数响应时间 | < 50ms |
| 延迟 P95 | 95% 分位响应时间 | < 200ms |
| 延迟 P99 | 99% 分位响应时间 | < 500ms |
| 错误率 | 失败请求比例 | < 0.1% |
| CPU | CPU 使用率 | < 70% |
| Memory | 内存使用率 | < 80% |
4.2 API 特定指标
| API 端点 | 目标 TPS | 目标延迟 P99 |
|---|---|---|
/v1/chat/completions (流式) |
500 | 500ms |
/v1/chat/completions (非流式) |
1000 | 300ms |
/v1/completions |
1000 | 300ms |
/v1/models |
2000 | 50ms |
/v1/user/info |
2000 | 50ms |
| 管理 API | 500 | 200ms |
4.3 资源指标
| 资源 | 基准 | 告警 |
|---|---|---|
| Go 堆内存 | < 500MB | > 1GB |
| PostgreSQL 连接 | < 50 | > 80 |
| Redis 连接 | < 100 | > 150 |
| Goroutines | < 1000 | > 5000 |
5. 测试用例
5.1 认证模块
| 用例 | 描述 | 预期结果 |
|---|---|---|
| TC-AUTH-01 | 10 并发登录 | P99 < 200ms |
| TC-AUTH-02 | 100 并发登录 | P99 < 500ms |
| TC-AUTH-03 | 连续登录 1000 次 | 错误率 < 0.1% |
5.2 API 网关
| 用例 | 描述 | 预期结果 |
|---|---|---|
| TC-GW-01 | 100 并发 API 请求 | P99 < 300ms |
| TC-GW-02 | 500 并发 API 请求 | P99 < 500ms |
| TC-GW-03 | 1000 并发 API 请求 | 系统稳定 |
| TC-GW-04 | 流式响应 (100 并发) | 吞吐量 > 50 msg/s |
5.3 管理后台
| 用例 | 描述 | 预期结果 |
|---|---|---|
| TC-ADMIN-01 | 获取账号列表 (100 条) | < 500ms |
| TC-ADMIN-02 | 获取账号列表 (1000 条) | < 2s |
| TC-ADMIN-03 | 创建账号 | < 1s |
| TC-ADMIN-04 | 更新账号 | < 500ms |
5.4 调度器
| 用例 | 描述 | 预期结果 |
|---|---|---|
| TC-SCHED-01 | 账号选择 (10 个账号) | < 10ms |
| TC-SCHED-02 | 账号选择 (100 个账号) | < 50ms |
| TC-SCHED-03 | 账号选择 (1000 个账号) | < 200ms |
6. 测试数据准备
6.1 测试账号
| 类型 | 数量 | 用途 |
|---|---|---|
| 测试用户 | 100 | 登录/并发测试 |
| 上游账号 | 1000 | 调度测试 |
| API Key | 5000 | 网关测试 |
6.2 数据生成脚本
# 生成测试数据
cd tests/scripts
node generate-test-data.js --users=100 --accounts=1000 --keys=5000
7. 执行计划
Phase 1: 基准测试 (Week 1)
- 运行现有 Go Benchmark
- 建立性能基线
- 分析热点函数
Phase 2: 负载测试 (Week 2)
- Artillery/K6 脚本开发
- 单场景测试
- 混合场景测试
Phase 3: 瓶颈分析 (Week 3)
- Profiling 分析
- 数据库慢查询分析
- 资源瓶颈识别
Phase 4: 优化验证 (Week 4)
- 针对性优化
- 复测验证
- 性能报告
8. 报告模板
8.1 测试摘要
## 测试摘要
| 项目 | 结果 |
|------|------|
| 测试日期 | YYYY-MM-DD |
| 测试版本 | vX.X.X |
| 测试环境 | 本地/测试环境 |
| 总请求数 | X,XXX,XXX |
| 成功率 | XX.X% |
| 平均 TPS | XXX |
| P99 延迟 | XXXms |
### 通过/失败
- [ ] TC-AUTH-01
- [ ] TC-AUTH-02
- ...
8.2 详细指标
## 详细指标
### 延迟分布
| 百分位 | 延迟 (ms) |
|--------|-----------|
| P50 | XX |
| P90 | XX |
| P95 | XX |
| P99 | XX |
### 资源使用
| 资源 | 峰值使用 | 告警 |
|------|---------|------|
| CPU | XX% | 是/否 |
| 内存 | XX% | 是/否 |
8.3 瓶颈分析
## 瓶颈分析
### 热点函数
1. func.A - XX% CPU
2. func.B - XX% CPU
3. func.C - XX% CPU
### 建议优化
1. 优化 func.A - 预计提升 XX%
2. 增加缓存 - 预计提升 XX%
9. 工具脚本
9.1 运行所有基准测试
# tests/scripts/run-benchmarks.sh
#!/bin/bash
echo "Running Go benchmarks..."
cd ../backend
# 所有 benchmark
go test -bench=. -benchmem -count=5 ./... > ../tests/reports/benchmark-results.txt
# 特定模块
go test -bench=Scheduler -benchmem ./internal/service/...
go test -bench=Gateway -benchmem ./internal/service/...
go test -bench=Pool -benchmem ./internal/service/...
echo "Benchmark complete. Results saved to ../tests/reports/"
9.2 运行负载测试
# tests/scripts/run-load-tests.sh
#!/bin/bash
ARTILLERY="npx artillery"
TARGET="http://localhost:8080"
echo "Starting load tests..."
# 登录测试
$ARTILLERY run performance/artillery/login.yml -o performance/reports/login.json
# API 网关测试
$ARTILLERY run performance/artillery/api-gateway.yml -o performance/reports/api-gateway.json
# WebSocket 测试
$ARTILLERY run performance/artillery/websocket.yml -o performance/reports/websocket.json
# 生成 HTML 报告
$ARTILLERY report performance/reports/*.json
echo "Load tests complete."
10. 注意事项
- 测试隔离: 每次测试前清理缓存和连接池
- 数据重置: 测试后重置测试数据
- 监控: 测试期间监控系统和数据库
- 日志: 收集测试日志用于分析
- 可重复: 确保测试可重复执行
文档版本: v1.0
创建日期: 2026-03-24
维护人: Sub2API Team