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

时间:2013-09-20 01:33:56

标签: javascript node.js performance socket.io bandwidth

我即将在本地计算机上托管一个小型套接字服务器,我想知道它将使用哪种带宽。在大多数日子里,它将同时连接不超过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');
  });
});

Client.js:

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

2 个答案:

答案 0 :(得分:57)

带宽量将在很大程度上取决于您要从服务器发送的数据量以及客户端将发送的数据量。带宽使用还取决于您正在使用的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,socket.emit()至少为107KB带宽。这些不是确切的数字,因为客户端可能会丢失数据,断开连接,需要重新连接等等。

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

答案 1 :(得分:1)

WebSockets可以保持打开很长时间,因此处理大量并发连接通常意味着您需要扩展该服务以适应增加的负载。对于几乎所有技术而言,这都是相同的,但是在服务器快速下降之前服务器可以处理的最大打开连接数通常是有限的。如果您的流量可能达到峰值,我会考虑调查第三方服务,例如pusherkaazing(免责声明:我还没有尝试过。)

您发布了一个非常模糊的问题(我们对您的应用程序,架构等一无所知 - 只是预期的流量),但希望这有助于指明您正确的方向。话虽如此...根据您的使用案例(偶尔播放一两条小消息),我的直觉告诉我,WebSockets不适合您。

(请注意,带宽可能不应该是一个问题 - 一般来说,如果你通过WebSockets发送许多消息而不是REST,你将发送更少的数据,因为标题,cookie等。)