3

大規模なEC2インスタンス(16Gb Ram、4コアXeon)で単一のsocket.ioインスタンスが処理できる接続数の大まかな計算を実行するように求められます。

単純なsocket.ioベンチマークのサンプルを更新しました。

サーバー:

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%の範囲でした。

提供される接続の数を増やすことは可能ですか?

サーバーOSはWindowsServer2008R2です。

4

1 に答える 1

2

クライアントとサーバー間のレイテンシである可能性が最も高く、クライアントからの発信接続数の制限、およびサーバーでの着信接続の OS 制限である可能性もあります。Windows の制限は、他のオペレーティング システムよりもはるかに低いことに注意してください。

また、実行している操作は計算、RAM、または帯域幅の負荷が高くないため、CPU、RAM、および帯域幅の使用率が低いと予想されます。

最適な実装である場合とそうでない場合があるクライアントを作成する代わりに、サーバーをテストする方法として Apache Bench を検討してください: https://en.wikipedia.org/wiki/ApacheBench: https://en.wikipedia.org/wiki/ApacheBench

いずれにせよ、異なるネットワークからより多くのクライアント コンピューターを使用して、ローカル スイッチまたはルーターをボトルネックとして扱うことができます。

于 2013-03-15T14:09:18.430 に答える