Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Socket.IO服务器性能和带宽使用率_Javascript_Node.js_Performance_Socket.io_Bandwidth - Fatal编程技术网

Javascript Socket.IO服务器性能和带宽使用率

Javascript Socket.IO服务器性能和带宽使用率,javascript,node.js,performance,socket.io,bandwidth,Javascript,Node.js,Performance,Socket.io,Bandwidth,我将在本地计算机上托管一个小型套接字服务器,我想知道它将使用什么样的带宽。在大多数情况下,它一次连接的客户端不会超过50个,但每周一到两次,一次连接的客户端可能多达5000多个。但是,唯一发送的消息将是偶尔一次发送给所有连接的客户端的单个消息,没有额外的数据或任何东西 服务器是否会导致其所在计算机的性能显著下降或降低我的互联网速度 Server.js: var app = require('http').createServer(handler) , io = require('socke

我将在本地计算机上托管一个小型套接字服务器,我想知道它将使用什么样的带宽。在大多数情况下,它一次连接的客户端不会超过50个,但每周一到两次,一次连接的客户端可能多达5000多个。但是,唯一发送的消息将是偶尔一次发送给所有连接的客户端的单个消息,没有额外的数据或任何东西

服务器是否会导致其所在计算机的性能显著下降或降低我的互联网速度

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 );

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

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

我用代理做了一些测量。结果如下:

从客户端发出
socket.emit(事件,参数)

  • 如果未提供
    事件
    参数
    ,则会向服务器发送12个字节
  • 如果省略了
    args
    ,但提供了
    event
    ,则总大小为22字节,
    event
    的长度
  • 如果提供了
    args
    event
    ,则遵循相同的规则,但结果可能因
    args
    的数据类型而异
从服务器发出:与从客户端发出的格式相同

  • 如果未提供
    事件
    参数
    ,则会向客户端发送8个字节
  • 如果省略了
    args
    ,但提供了
    event
    ,则总大小为17字节,
    event
    的长度
  • 如果提供了
    args
    event
    ,则遵循相同的规则,但结果可能因
    args
    的数据类型而异
服务器到客户端心跳信号:每个客户端每25秒一次

  • 来自服务器的5个字节
  • 9字节客户端响应
握手:每个客户端一次

  • 来自服务器的216字节
  • 来自客户端的431字节响应
  • 从服务器跟进129字节
因此,对于5000多个客户端的负载,握手至少需要3.7MB,心跳至少需要3KB/s,socket.emit()至少需要107KB的带宽。这些数字并不准确,因为客户端可能会丢失数据、断开连接、需要重新连接等


总之,您的网络可能会正常工作,但主要关注的是您的网络必须处理的并发连接数量。许多并发连接也可能是CPU密集型的,所以您应该考虑跨核心集群。还要记住Socket.IO服务器必须处理的心跳量。对于50个并发用户,平均每秒2次心跳。在5000多个并发用户的情况下,即每秒200多个心跳,我认为这比网络密集型(2.8KB/s)更需要CPU密集型。

WebSocket可以在很长时间内保持打开状态,因此处理大量并发连接通常意味着您需要扩展该服务以适应增加的负载。这对于几乎任何技术都是一样的,但在事情迅速恶化之前,服务器可以处理的最大打开连接数通常是有限制的。如果你可能在交通上有这样的高峰,我会考虑寻找一个第三方服务,或者(免责声明:我还没有尝试过)。 您发布了一个相当模糊的问题(我们对您的应用程序、体系结构等一无所知-只是预期的流量),但希望这能帮助您找到正确的方向。话虽如此。。。基于您的用例(偶尔广播一两条小消息),我的直觉告诉我WebSocket不是适合您的技术


(请注意,带宽可能不应该是一个问题-一般来说,如果您通过WebSocket发送许多消息,而不是REST,那么由于标头、Cookie等原因,您将发送更少的数据。)

另请参见:我将向服务器发送一个数据包,然后立即向每个客户端发送一个数据包。这种情况每天可能只发生一到三次。我没有向数据包中添加任何数据,所以我假设它是尽可能少的数据量——不管是什么,“如果没有提供事件和参数,12个字节被发送到服务器。”等等,以太网/IP/TCP开销不是占主导地位吗?您希望单个以太网帧至少有64个字节。是的,您是正确的。在我的计算中,我没有考虑应用层以下的任何内容。