Files
tokens-reef/tests/performance/gateway-stress-test.js
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

92 lines
2.8 KiB
JavaScript

// Sub2API Gateway 压力测试脚本
// 用于测试系统在极端负载下的表现
// 运行: k6 run --env BASE_URL=http://localhost:8080 --env API_KEY=your_key gateway-stress-test.js
import http from 'k6/http';
import { check, sleep, group } from 'k6';
import { Rate, Trend, Counter } from 'k6/metrics';
import { randomIntBetween } from 'https://jslib.k6.io/k6-utils/1.2.0/index.js';
// 自定义指标
const errorRate = new Rate('error_rate');
const responseTime = new Trend('response_time');
const requestCounter = new Counter('total_requests');
// 压力测试配置 - 更激进的负载
export const options = {
scenarios: {
// 场景1: 快速加压到高并发
rapid_ramp: {
executor: 'ramping-vus',
startVUs: 0,
stages: [
{ duration: '2m', target: 500 }, // 快速加压到500并发
{ duration: '10m', target: 500 }, // 保持10分钟
{ duration: '2m', target: 1000 }, // 加压到1000并发
{ duration: '10m', target: 1000 }, // 保持10分钟
{ duration: '5m', target: 0 }, // 减压
],
gracefulRampDown: '30s',
},
// 场景2: 突发流量测试
spike_test: {
executor: 'ramping-vus',
startVUs: 0,
stages: [
{ duration: '1m', target: 100 }, // 正常负载
{ duration: '30s', target: 2000 }, // 突发到2000并发
{ duration: '2m', target: 2000 }, // 保持突发
{ duration: '30s', target: 100 }, // 恢复正常
{ duration: '2m', target: 100 }, // 观察恢复
],
startTime: '15m', // 在其他测试运行一段时间后开始
},
},
// 压力测试的阈值更宽松
thresholds: {
http_req_duration: ['p(99)<10000'], // 99%请求<10s
http_req_failed: ['rate<0.05'], // 允许5%错误率
},
discardResponseBodies: true,
};
const BASE_URL = __ENV.BASE_URL || 'http://localhost:8080';
const API_KEY = __ENV.API_KEY || 'sk-test-key';
export default function () {
group('Stress Test - Gateway API', () => {
// 主要测试Chat Completions - 最重的端点
testChatCompletionsStress();
sleep(randomIntBetween(1, 3));
});
}
function testChatCompletionsStress() {
const payload = JSON.stringify({
model: 'gpt-3.5-turbo',
messages: [{ role: 'user', content: 'Stress test message' }],
max_tokens: 50,
stream: false,
});
const res = http.post(`${BASE_URL}/v1/chat/completions`, payload, {
headers: {
'Authorization': `Bearer ${API_KEY}`,
'Content-Type': 'application/json',
},
timeout: '60s', // 压力测试允许更长超时
});
const success = check(res, {
'status_is_200_or_429': (r) => r.status === 200 || r.status === 429,
'response_time_under_30s': (r) => r.timings.duration < 30000,
});
errorRate.add(!success);
responseTime.add(res.timings.duration);
requestCounter.add(1);
}