- 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
92 lines
2.8 KiB
JavaScript
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);
|
|
}
|