2012-06-11 38 views
5

Quiero comparar mi servidor socket.io. Quiero probar cuántas conexiones y mensajes en paralelo puede manejar el servidor.Benchmarkt socket.io

Pero mi servidor socket.io se cuelga después de algunos minutos cuando comienzo el benchmark con aproximadamente 200 websockets.

Intenté utilizar el módulo de clúster de node.js para compartir el proceso con los núcleos. Cuando uso el módulo de clúster, algunas conexiones se desconectan después de un tiempo.

El servidor que utilizo para la prueba es un servidor virtual en la nube de Amazon con estas propiedades:

  • 7 GB de memoria
  • 20 Unidades Compute EC2 (8 núcleos virtuales con 2,5 unidades EC2 cada uno)
  • 1690 GB de almacenamiento de instancia
  • 64-bit plataforma
  • Rendimiento I/O: High nombre
  • API: c1.xlarge

Este es el código de la referencia en el cliente:

var fs = require('fs'); 
var io = require("socket.io-client"); 
var host = "http://localhost:3000"; 
var timeLog = fs.createWriteStream(__dirname+'/public/time.log',{flags:'a',mode:0666, encoding:'encoding'}); 
var count = 200; 
var sockets = []; 
var total = 0; 
var countTime = 0; 
var echo = exports; 
echo.start = function() { 
    fs.writeFile('public/time.log',"",function(err){ 
     if(err) throw err; 
    }); 

    for(var i=0;i<count;i++){ 
     var socket = io.connect(host,{"force new connection":true}); 
     sockets.push(socket); 
     //console.log(i); 
     socket.on("message",function(message){ 
      countTime++; 
      time = new Date().getTime()-message; 
      total+=time; 
      timeLog.write(time+"\n"); 
      socket.send(new Date().getTime()); 
     }); 
     socket.on("disconnect",function(){ 
      console.log("disconnect"); 
     }); 
    } 

    parallelSockets(); 
    var j = 0; 
} 

function parallelSockets(){ 
    for(var i = 0 ;i<count;i++){ 
     sockets[i].send(new Date().getTime()); 
    } 
} 

Y aquí el código de la socket.io-servidor:

socket.on('message',function(message){ 
    start = new Date().getTime(); 
    socket.send(message); 
    end = new Date().getTime() - start; 
    logfile.write(end+"\n"); 
}); 

¿Hay algún mecanismo de seguridad en zócalo. io que bloquea tantos mensajes paralelos y conexiones forman un cliente?

¿Alguien me puede ayudar?

+0

¿Qué error de impresión en Node.js accidente? –

+0

node.js imprime solo al bloquear la palabra "Asesinado". – CodeChiller

+0

Puede ser simplemente porque se está quedando sin descriptores de archivo. Intenta ejecutar 'ulimit -n' como el mismo usuario que ejecuta node.js (si estás en Linux, al menos). Puede cambiar este valor usando 'ulimit' o, más permanentemente, en un archivo de configuración como'/etc/security/limits. {Conf, d} '. –

Respuesta

4

I Benchmarked Implementaciones de servidor Socket.IO y SockJS.

Los resultados se pueden encontrar aquí: http://mrjoes.github.com/2011/12/15/sockjs-bench.html

El banco de pruebas está aquí: https://github.com/mrjoes/sock-benchmarking

escrito en Java, compatible con 3 transportes: Socket.IO 0.7+, SockJS 0.2 o superior, WebSockets primas. No hay ningún binario compilado, pero puede obtener Eclipse para compilarlo o simplemente usar javac de línea de comandos.

+0

Gracias por su respuesta, tengo una pregunta. ¿Cómo hizo Socket.io Benchmark con 2000 WebSockets? Solo puedo abrir unos 1000 sockets. Si quiero abrir más, el servidor se bloqueará o no estará disponible. – CodeChiller

+0

Asegúrese de aumentar los límites como se describe aquí: http://serverfault.com/questions/48717/practical-maximum-open-file-descriptors-ulimit-n-for-a-high-volume-system – Joes

+0

@Joes era su punto de referencia en 45k por segundo en el nodo por núcleo o agrupado? Edit: Nevermind: 'using single core', wow, 45k de salida? Eso es una locura ¡Gracias por el punto de referencia! –

0

Es posible comprobar Akinji

Se abre tomas simultáneas en un servidor y escucha determinado mensaje e imprimirlas

http://github.com/sonsuzdongu/akinji

python akinji.py -c 100 --host localhost --port 3000 --waitFor 100 --on "some msg"