2013-06-10 9 views
31

Porównujemy wydajność węzła za pomocą prostego serwera węzłów Hello World na AWS (EC2).Node.js maxing na 1000 równoczesnych połączeń

Niezależnie od używanej wielkości, Węzeł zawsze ma maksymalną liczbę 1000 połączeń równoczesnych (NIE JEST 1000 na sekundę, ale 1000 może obsłużyć w tym samym czasie). Krótko po tym skoki procesora i węzeł praktycznie zamiera.

v0.10.5 Węzeł

var http = require('http'); 
var server = http.createServer(function (req, res) { 
    res.writeHead(200, {'Content-Type': 'text/plain'}); 
    res.end('loaderio-dec86f35bc8ba1b9b604db6c328864c1'); 
}); 
server.maxHeadersCount = 0; 
server.listen(4000); 

Węzeł powinien być w stanie obsłużyć więcej niż to prawidłowe? Jakiekolwiek propozycje będą mile widziane.

również deskryptory plików (miękkie, twarde, system) są ustawione na 65096)

+1

ile jednoczesnych połączeń czy wreszcie dostać? I na jakiej instancji EC2? – user3526

+1

@ user3526 przeprosiny tego nie widziały. Robimy to, aby skalibrować potencjał, aby sprawdzić, czy połączenia równoległe naszej aplikacji mają sens, a następnie określić najlepszy rozmiar instancji do użycia w cenie podczas skalowania, ponieważ nasza aplikacja przetwarzała 100 milionów zgłoszeń dziennie. To był długi czas (oczywiście), ale myślę, że osiągnęliśmy 3k lub 4k na małym (który był jednym rdzeniem) i zmniejszyło się trochę na rdzeń, gdy zwiększyliśmy rozmiary instancji. Oczywiście od tego czasu EC2 zmieniło specyfikację wszystkich instancji. – jadent

Odpowiedz

28

użyć modułu posix podniesienie limitu na liczbę deskryptorów Twój proces może korzystać.

Install posix

npm install posix 

Następnie w kodzie, który biegnie po uruchomieniu aplikacji ...

var posix = require('posix'); 

// raise maximum number of open file descriptors to 10k, 
// hard limit is left unchanged 
posix.setrlimit('nofile', { soft: 10000 }); 
+0

dziękuję, ale deskryptory plików zostały już ulepszone do 65096 – jadent

+0

daliśmy temu spróbować i zadziałało! Czy wiesz, dlaczego ustawienie ulimit przez etc/security/limits.conf nie działa, ale używa POSIX? – jadent

+2

Limity są stosowane przy logowaniu. Jeśli nie wylogowałeś się z powłoki i nie powrócisz po edycji /etc/security/limits.conf, zobaczysz stare ograniczenia. Możesz sprawdzić aktualne limity za pomocą 'ulimit -a' – Daniel

10

Dodzwoniłeś domyślny limit deskryptorów proces może używać (1024). Możesz sprawdzić limit w wierszu poleceń, uruchamiając "ulimit -n". Aby zmienić limit, musisz edytować plik /etc/security/limits.conf. Dodaj następujący blok:

* soft nofile 65535 
* hard nofile 65535 
root soft nofile 65535 
root hard nofile 65535 

"*" dotyczy wszystkich użytkowników oprócz root. Limity dla root'a należy dodać osobno. Istnieją miękkie i twarde limity. Użytkownicy mogą zmieniać własne limity do miękkiego limitu, ale nie przekraczając twardego limitu.

Po zakończeniu edycji pliku wyloguj się i zaloguj ponownie. Zweryfikuj zmianę, uruchamiając ulimit -n. Zrestartuj proces Node i powinieneś być gotowy.

Istnieje również granica plik deskryptora dla całego systemu, który może zostać zwiększona za pomocą następującego polecenia:

sysctl -w fs.file-max=65535 
+0

Dzięki. Już przed testami podnieśliśmy deskryptory plików do 65096 (zarówno miękkie, twarde, jak i systemowe) – jadent

Powiązane problemy