Socket.IO服务器性能和带宽使用情况

Joe*_*ris 24 javascript performance bandwidth node.js socket.io

我即将在本地计算机上托管一个小型套接字服务器,我想知道它将使用哪种带宽.在大多数日子里,它将同时连接不超过50个客户端,但每周一次或两次可以同时拥有多达5,000多个客户端.但是,发送的唯一消息将是偶尔向所有连接的客户端发送的单个消息,没有额外的数据或任何内容.

服务器是否会导致其托管的计算机性能显着下降或者降低我的网速?

Server.js:

var app = require('http').createServer(handler)
   , io = require('socket.io').listen(app)
   , fs = require('fs')

 app.listen(8001);

function handler (req, res) {
fs.readFile(__dirname + '/index.html',
  function (err, data) {
    if (err) {
      res.writeHead(500);
      return res.end('Error loading index.html');
    }

    res.writeHead(200);
    res.end(data);
  });
}

io.sockets.on('connection', function (socket) {
  socket.on('SendDefault', function(data) {
    socket.broadcast.emit('GetDefault');
  });
});
Run Code Online (Sandbox Code Playgroud)

Client.js:

setTimeout( function( ){ 
  socket = io.connect('[IP Address]:8001');
  socket.on('GetDefault', function(data) {
    DoStuff( );
  );
} ); }, 10000 );
Run Code Online (Sandbox Code Playgroud)

hex*_*ide 59

带宽量将在很大程度上取决于您要从服务器发送的数据量以及客户端将发送的数据量.带宽使用还取决于您正在使用的Socket.IO传输以及应用程序的心跳间隔.

应用程序对性能的影响也因您运行的应用程序类型以及计算机和/或网络的性能而异.但是,除非您跨多个核心扩展应用程序,否则5000+客户端将对性能产生相当大的影响,无论您的计算机的功能如何.

我使用代理进行了一些测量.结果如下:

从客户发出:socket.emit(event, args)

  • 如果eventargs未提供,则将12个字节发送到服务器.
  • 如果args省略但是event提供,则总大小为22个字节,长度为event.
  • 如果argsevent提供,则遵循相同的规则,但结果可能会根据数据类型而有所不同args.

从服务器发出:与客户端格式相同

  • 如果eventargs未提供,则向客户端发送8个字节.
  • 如果args省略但是event提供,则总大小为17个字节,长度为event.
  • 如果argsevent提供,则遵循相同的规则,但结果可能会根据数据类型而有所不同args.

服务器到客户端心跳:每个客户端每25秒

  • 服务器5个字节
  • 9字节客户端响应

握手:每个客户一次

  • 服务器的216个字节
  • 来自客户端的431字节响应
  • 从服务器跟进129个字节

因此,对于5000多个客户端,预计握手至少为3.7MB,心跳为3KB/s,带宽至少为107KB socket.emit().这些不是确切的数字,因为客户端可能会丢失数据,断开连接,需要重新连接等.

最后,您的网络可能会停滞不前,但主要关注点应该是您的网络必须处理的并发连接数量.许多并发连接也可能是CPU密集型的,因此您应该考虑跨核心进行群集.还要记住Socket.IO服务器必须处理的心跳量.有50个并发用户,平均每秒2次心跳.在5000多个并发用户中,这是每秒200多次心跳,我认为这比CPU密集型(2.8KB/s)更加占用CPU.

  • 是的,你是对的.在我的计算中,我没有考虑应用层以下的任何内容. (2认同)