2013-03-15 80 views
2

客户要求我执行的许多连接如何挑选一个大EC2实例(16GB内存,4核至强)​​socket.io实例句柄粗略计算的最高金额。的Node.js + 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条消息的结果数量。

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

是否有可能提高服务的连接数?

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

+0

所以CPU不是瓶颈,可能你的IO在某个地方。 – UpTheCreek 2013-03-15 13:38:32

+0

相关问题:[我可以通过socket.emit发送多少数据?](http://stackoverflow.com/q/12977719/201952) – josh3736 2013-03-15 14:35:32

回答

1

这是最有可能你的客户端和服务器之间的延迟,也可能是从客户端的传出连接数的限制,并在您的服务器上进来的连接操作系统的限制。请注意,Windows有比其他操作系统低的限制。

而且你所期望的CPU,内存和带宽占用低,因为你正在做的工作既不是计算,内存和带宽重。

请看Apache的替补身份测试服务器,而不是写这可能是也可能不是最佳的实现客户端的方式:https://en.wikipedia.org/wiki/ApacheBench

在任何情况下,使用更多的客户端计算机,从不同的网络,所以你可以把我们的本地交换机或路由器当作瓶颈