2012-06-11 14 views
5

Chcę porównać mój serwer socket.io. Chcę przetestować liczbę równoległych połączeń i komunikatów obsługiwanych przez serwer.Benchmarkt socket.io

Ale moja awarii serwera socket.io po kilku minutach, gdy zaczynam benchmark z około 200 websockets.

Próbowałem użyć modułu klastra node.js, aby udostępnić proces rdzeniom. Kiedy korzystam z modułu klastra, niektóre połączenia zostają rozłączone po pewnym czasie.

Serwer, używać do badania jest serwera wirtualnego w chmurze AmazoniÄ ogłoszenia:

  • 7 GB pamięci
  • 20 EC2 Obliczenie jednostek (8 wirtualne rdzenie 2,5 jednostek EC2 Compute każdy)
  • 1690 GB pamięci instancji
  • 64-bitowej platformie
  • I/o Wydajność: Wysoka nazwa
  • API c1.xlarge

Oto kod z benchmark-client:

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

I tu kod socket.io serwera:

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

Czy istnieją jakieś mechanizmy zabezpieczające na gnieździe. io, która blokuje tak wiele równoległych komunikatów i połączeń z klientem?

Czy ktoś może mi pomóc?

+0

Jaki błąd node.js druk na katastrofie? –

+0

node.js drukuje tylko po zawieszeniu się słowa "Killed". – CodeChiller

+0

Może to być po prostu dlatego, że brakuje ci deskryptorów plików. Spróbuj uruchomić 'ulimit -n' jako tego samego użytkownika, na którym działa node.js (jeśli masz przynajmniej Linuksa). Możesz zmienić tę wartość, używając 'ulimit' lub, trwale, w pliku konfiguracyjnym, takim jak'/etc/security/limits. {Conf, d} '. –

Odpowiedz

4

I porównywana Implementacje serwerów Socket.IO i SockJS.

Wyniki można znaleźć tutaj: http://mrjoes.github.com/2011/12/15/sockjs-bench.html

Test Suite jest tutaj: https://github.com/mrjoes/sock-benchmarking

napisany w języku Java, obsługuje 3 transporty: Socket.IO 0.7+, SockJS 0.2 i surowe WebSockets. Nie ma skompilowanego pliku binarnego, ale można go skompilować za pomocą Eclipse lub po prostu użyć javac z wiersza poleceń.

+0

Dziękuję za odpowiedź, mam jedno pytanie. Jak stworzyłeś Socket.io Benchmark z 2000 WebSockets? Mogę otworzyć tylko około 1000 gniazd. Jeśli chcę otworzyć więcej, serwer zostanie rozbity lub nie będzie dostępny. – CodeChiller

+0

Upewnij się, że zwiększasz limity zgodnie z opisem podanym tutaj: http://serverfault.com/questions/48717/practical-maximum-open-file-descriptors-ulimit-n-for-a-igh-volume-system – Joes

+0

@Joes był twoim benchmark na 45k na sekundę w węźle na rdzeń lub w klastrze? Edycja: Nevermind: "używanie pojedynczego rdzenia", wow, 45k wychodzących? To szalone. Dziękuję za porównanie !! –

0

Możesz sprawdzić Akinji

Otwiera jednoczesnych gniazd na serwerze i nasłuchuje dana wiadomość i wydrukować je

http://github.com/sonsuzdongu/akinji

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