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

我即将在本地计算机上托pipe一个小型套接字服务器,我想知道它将使用什么样的带宽。 在大多数日子里,一次不会有超过50个客户连接,但是一周一次或两次,一次可以有多达5000个客户。 但是,唯一发送的消息将是一次偶然的单个消息给所有连接的客户端,而不需要额外的数据或任何东西。

服务器是否会导致其托pipe的计算机的性能显着下降,或者放慢了我的网速?

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

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

应用程序对性能的影响也因您所运行的应用程序的types以及您的机器和/或networking的性能而异。 但是,无论您的计算机的能力如何,除非您在多个核心上扩展应用程序,否则5000多个客户端将对性能产生相当大的影响。

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

从客户端发送socket.emit(event, args)

  • 如果没有提供eventargs ,则将12个字节发送到服务器。
  • 如果省略args但提供event ,则总大小为22个字节, event的长度。
  • 如果提供了argsevent ,则遵循相同的规则,但结果可能因args的数据types而异。

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

  • 如果没有提供eventargs ,则将8个字节发送给客户端。
  • 如果省略了args ,但提供了event ,则总大小为17个字节, event的长度。
  • 如果提供了argsevent ,则遵循相同的规则,但结果可能因args的数据types而异。

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

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

握手 :每个客户一次

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

因此,对于超过5000个客户端的负载,期望至less3.7MB的握手,3KB / s的心跳以及至less107KB带宽的socket.emit() 。 这些不是确切的数字,因为客户端可能会丢失数据,丢失连接,需要重新连接等。

总的来说,你的networking可能会持续下去,但主要关心的应该是networking必须处理的并发连接数量。 许多并发连接也可能是CPU密集型的,所以您应该考虑跨核心进行集群。 还要记住Socket.IO服务器必须处理的心跳数量。 与50个并发用户,这是平均每秒2心跳。 在5000多个并发用户中,每秒钟有200个以上的心跳,我想这比networking密集型(2.8KB / s)更占用CPU资源。

WebSocket可以保持打开很长时间,所以处理大量的并发连接通常意味着您需要扩展该服务以适应增加的负载。 对于几乎所有的技术来说,这都是一样的,但是在事情快速下滑之前,服务器可以处理的最大打开连接数通常是有限制的。 如果你可能在交通方面有这么高峰,我会考虑考虑像push或kaazing第三方服务(免责声明:我还没有尝试过)。

你已经发布了一个非常模糊的问题(我们对你的应用程序,架构等一无所知 – 只是期望的stream量),但希望这有助于指导你正确的方向。 这就是说…基于你的用例(偶尔广播一两个小信息),我的直觉告诉我,WebSocket对你来说不是合适的技术。

(请注意,带宽可能不应该是一个问题 – 一般来说,如果你要通过WebSockets发送很多消息与REST,你会发送更less的数据,由于标头,cookies等)