Files
tokens-reef/deploy/docs-backup/PERFORMANCE_TEST_PLAN.md
Developer 349d783fd1 refactor: clean up project structure
- Remove old review reports (keep latest only)
- Move docs/ to deploy/docs-backup/
- Move performance-testing/ to deploy/
- Clean up test output files
- Organize root directory
2026-04-06 23:36:03 +08:00

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)

  1. 运行现有 Go Benchmark
  2. 建立性能基线
  3. 分析热点函数

Phase 2: 负载测试 (Week 2)

  1. Artillery/K6 脚本开发
  2. 单场景测试
  3. 混合场景测试

Phase 3: 瓶颈分析 (Week 3)

  1. Profiling 分析
  2. 数据库慢查询分析
  3. 资源瓶颈识别

Phase 4: 优化验证 (Week 4)

  1. 针对性优化
  2. 复测验证
  3. 性能报告

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. 注意事项

  1. 测试隔离: 每次测试前清理缓存和连接池
  2. 数据重置: 测试后重置测试数据
  3. 监控: 测试期间监控系统和数据库
  4. 日志: 收集测试日志用于分析
  5. 可重复: 确保测试可重复执行

文档版本: v1.0
创建日期: 2026-03-24
维护人: Sub2API Team