k6 pressure test

This commit is contained in:
M1ngdaXie
2026-02-03 16:13:59 -08:00
parent 0ec58ca866
commit 35c4aa2580
5 changed files with 405 additions and 3 deletions

91
loadtest/loadtest_1000.js Normal file
View File

@@ -0,0 +1,91 @@
import ws from 'k6/ws';
import { check, sleep } from 'k6';
import { Counter, Trend, Rate } from 'k6/metrics';
// =============================================================================
// CUSTOM METRICS
// =============================================================================
const connectionTime = new Trend('ws_connection_time_ms');
const messageRTT = new Trend('ws_message_rtt_ms');
const connectionsFailed = new Counter('ws_connections_failed');
const messagesReceived = new Counter('ws_messages_received');
const messagesSent = new Counter('ws_messages_sent');
const connectionSuccess = new Rate('ws_connection_success');
// =============================================================================
// 1000 USERS TEST
// =============================================================================
export const options = {
stages: [
{ duration: '10s', target: 200 },
{ duration: '10s', target: 500 },
{ duration: '10s', target: 1000 },
{ duration: '60s', target: 1000 }, // Hold at 1000 for 1 minute
{ duration: '10s', target: 0 },
],
thresholds: {
'ws_connection_time_ms': ['p(95)<500'],
'ws_message_rtt_ms': ['p(95)<100'],
'ws_connection_success': ['rate>0.95'],
},
};
export default function () {
const roomId = `loadtest-room-${__VU % 10}`; // 10 rooms, 100 users each
const url = `ws://localhost:8080/ws/loadtest/${roomId}`;
const connectStart = Date.now();
const res = ws.connect(url, {}, function (socket) {
const connectDuration = Date.now() - connectStart;
connectionTime.add(connectDuration);
connectionSuccess.add(1);
let pingStart = 0;
socket.on('message', (data) => {
messagesReceived.add(1);
if (pingStart > 0) {
const rtt = Date.now() - pingStart;
messageRTT.add(rtt);
pingStart = 0;
}
});
socket.on('error', (e) => {
connectionsFailed.add(1);
});
// Send message every 500ms
socket.setInterval(function () {
const payload = new Uint8Array([1, 0]);
pingStart = Date.now();
socket.sendBinary(payload.buffer);
messagesSent.add(1);
}, 500);
socket.setTimeout(function () {
socket.close();
}, 90000);
});
const connected = check(res, {
'WebSocket connected': (r) => r && r.status === 101,
});
if (!connected) {
connectionsFailed.add(1);
connectionSuccess.add(0);
}
sleep(0.1);
}
export function setup() {
console.log('========================================');
console.log(' Load Test: 1000 Users');
console.log('========================================');
console.log('10 rooms x 100 users each');
console.log('========================================');
}