You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Socket.IO服务器多客户端性能测试遇阻,求可行解决方案

Socket.IO服务器多客户端测试解决方案

方案一:自定义Node.js测试脚本(最灵活可控)

直接基于socket.io-client编写脚本,完全自定义测试逻辑,不受第三方工具限制,能精准实现50个客户端连接、消息收发、时间记录与指标统计。

步骤:

  1. 安装依赖:
npm install socket.io-client
  1. 编写测试脚本(示例):
const { io } = require('socket.io-client');
const clients = [];
const metrics = {
  totalRequests: 0,
  totalLatency: 0,
  successfulRequests: 0,
  errorCount: 0
};
const SERVER_ADDR = 'http://你的Socket.IO服务器地址:端口';
const CLIENT_NUM = 50;

// 批量创建客户端连接
for (let index = 0; index < CLIENT_NUM; index++) {
  const client = io(SERVER_ADDR, {
    transports: ['websocket'], // 强制使用WebSocket,避免轮询影响测试数据
    reconnection: false // 关闭自动重连,避免测试干扰
  });

  client.on('connect', () => {
    console.log(`客户端 ${index} 连接成功`);
    // 发送测试消息,记录发送时间
    const sendTimestamp = Date.now();
    // 假设你的自定义事件名为"test-request",附带发送时间戳用于后续计算延迟
    client.emit('test-request', { sender: index, sendTime: sendTimestamp });
  });

  // 监听服务器广播的消息
  client.on('broadcast-notify', (data) => {
    const receiveTimestamp = Date.now();
    const latency = receiveTimestamp - data.sendTime;
    
    metrics.totalRequests++;
    metrics.successfulRequests++;
    metrics.totalLatency += latency;
    
    console.log(`客户端 ${data.sender} 广播消息延迟: ${latency}ms`);
  });

  client.on('error', (err) => {
    console.error(`客户端 ${index} 出错:`, err);
    metrics.errorCount++;
  });

  client.on('disconnect', () => {
    console.log(`客户端 ${index} 断开连接`);
  });

  clients.push(client);
}

// 测试结束后输出统计结果
setTimeout(() => {
  console.log('\n===== 测试统计结果 =====');
  console.log(`总请求数: ${metrics.totalRequests}`);
  console.log(`成功请求数: ${metrics.successfulRequests}`);
  console.log(`错误数: ${metrics.errorCount}`);
  if (metrics.successfulRequests > 0) {
    console.log(`平均延迟: ${(metrics.totalLatency / metrics.successfulRequests).toFixed(2)}ms`);
  }
  // 关闭所有客户端连接
  clients.forEach(client => client.disconnect());
  process.exit(0);
}, 15000); // 运行15秒后结束测试,可按需调整时长
  1. 运行脚本:
node socket-test.js

方案二:使用k6进行性能测试(自带指标统计)

k6是一款开源性能测试工具,支持WebSocket协议,能轻松模拟多虚拟用户,自带延迟、吞吐量等指标统计,无需手动开发统计逻辑。

步骤:

  1. 安装k6(根据系统选择对应安装方式)
  2. 编写k6测试脚本(适配Socket.IO v4示例):
import ws from 'k6/ws';
import { check, sleep } from 'k6';

export const options = {
  vus: 50, // 模拟50个并发客户端
  duration: '10s', // 测试持续时长
};

export default function () {
  // Socket.IO WebSocket连接地址(注意EIO版本要和服务器匹配,这里是v4)
  const wsUrl = 'ws://你的Socket.IO服务器地址:端口/socket.io/?EIO=4&transport=websocket';
  
  const res = ws.connect(wsUrl, {}, (socket) => {
    socket.on('open', () => {
      console.log('客户端连接成功');
      const sendTime = Date.now();
      // Socket.IO v4的消息格式:前缀"42"表示事件消息,后面是JSON数组[事件名, 数据]
      socket.send(`42["test-request",{"sendTime":${sendTime}}]`);
    });

    socket.on('message', (rawData) => {
      // 解析Socket.IO消息
      if (rawData.startsWith('42')) {
        const [eventName, data] = JSON.parse(rawData.slice(2));
        if (eventName === 'broadcast-notify') {
          const latency = Date.now() - data.sendTime;
          // 验证延迟是否符合预期
          check(latency, {
            '延迟低于500ms': (l) => l < 500,
          });
        }
      }
    });

    socket.on('close', () => console.log('客户端断开连接'));
    socket.on('error', (err) => console.error('连接错误:', err));
  });

  // 验证连接是否成功升级为WebSocket
  check(res, { '连接状态码为101': (r) => r.status === 101 });
  sleep(1);
}
  1. 运行测试:
k6 run k6-socket-test.js

运行后k6会自动输出详细统计报告,包括平均延迟、p95/p99延迟、请求成功率等。

方案三:修复JMeter Socket.IO插件问题(若坚持使用JMeter)

如果一定要用JMeter,可尝试以下步骤排查插件故障:

  • 确认JMeter版本与插件兼容:比如Peter的Socket.IO插件可能仅支持JMeter 5.x版本,避免版本不匹配
  • 手动安装插件:从插件仓库下载对应jar包,放到JMeter的lib/ext目录后重启JMeter
  • 匹配Socket.IO版本:插件可能仅支持特定版本的Socket.IO(如v2/v3),需与服务器版本一致
  • 检查传输方式:测试时强制选择WebSocket传输,避免轮询模式干扰
  • 查看JMeter日志:通过jmeter.log定位插件报错细节(如依赖缺失),补充对应依赖jar包

内容的提问来源于stack exchange,提问作者The Trainer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 19:15:35