Node.js + socket.io确定每个实例的最大客户端数量

我被要求粗略计算一个大的EC2实例(16Gb Ram,4 Core Xeon)上的单个socket.io实例句柄的数量。

我更新了简单的socket.io基准的样本。

Serever:

var io = require('socket.io').listen(80); var exec = require('child_process').exec; io.configure(function() { io.set('log level', 1); var transport = process.argv.length >= 2 ? process.argv[2] : null; if (transport) { io.set('transports', [transport]); } }); var payload = "Payload: Payload line item " + "Payload: Payload line item " + "Payload: Payload line item " + "Payload: Payload line item " + "Payload: Payload line item " + "Payload: Payload line item " + "Payload: Payload line item " + "Payload: Payload line item " + "Payload: Payload line item " + "Payload: Payload line item " + "Payload: Payload line item " + "Payload: Payload line item " + "Payload: Payload line item " + "Payload: Payload line item " + "Payload: Payload line item " + "Payload: Payload line item " + "Payload: Payload line item " + "Payload: Payload line item " + "Payload: Payload line item "; var users = 0; function roundNumber(num, precision) { return parseFloat(Math.round(num * Math.pow(10, precision)) / Math.pow(10, precision)); } setInterval(function() { io.sockets.emit("message", payload); console.log("Users: " + users); }, 3000); io.sockets.on('connection', function(socket) { users++; socket.on('disconnect', function() { users--; }) }); 

客户

 var io = require('socket.io-client'); var message = "o bispo de constantinopla nao quer se desconstantinopolizar"; var receivedMessages = 0; function user(shouldBroadcast, host, port) { var socket = io.connect('http://' + host + ':' + port, { 'force new connection': true }); socket.on("message", function(){ receivedMessages += 1; }) }; var argvIndex = 2; var users = parseInt(process.argv[argvIndex++]); var rampUpTime = parseInt(process.argv[argvIndex++]) * 1000; // in seconds var newUserTimeout = rampUpTime / users; var shouldBroadcast = process.argv[argvIndex++] === 'broadcast' ? true : false; var host = process.argv[argvIndex++] ? process.argv[argvIndex - 1] : 'localhost'; var port = process.argv[argvIndex++] ? process.argv[argvIndex - 1] : '3000'; for(var i=0; i<users; i++) { setTimeout(function() { user(shouldBroadcast, host, port); }, i * newUserTimeout); }; setInterval(function() { console.log("Messages received: " + receivedMessages); receivedMessages = 0; }, 3000); 

我运行这个示例,客户端在中型实例上启动,服务器在大型。 我收到的消息的结果数量每3秒4500左右。

但networking,CPU和RAM使用率在2-10%的范围内。

是否有可能增加服务连接的数量?

服务器操作系统是Windows Server 2008 R2。

这很可能是客户端和服务器之间的延迟,也可能是客户端的传出连接数限制,以及服务器上连接的操作系统限制。 请注意,Windows有一个比其他操作系统低的方法。

你也会期望的CPU,RAM和带宽使用率低,因为你正在做的操作既不是计算,内存或带宽大。

请看Apache Bench作为testing你的服务器的一种方式,而不是写一个可能或不可能是最佳实现的客户端: https : //en.wikipedia.org/wiki/ApacheBench

无论如何,请使用来自不同networking的更多客户端计算机,以便将我们的本地交换机或路由器视为瓶颈