![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 555 Pomógł: 84 Dołączył: 20.02.2008 Skąd: Małopolska Ostrzeżenie: (0%) ![]() ![]() |
Hej,
testuje sobie dzisiaj wydajność interfejsów websocket dostępnych w róznych językach programowania i trafiłem na problem z socket.io. Napisałem sobie prosty skrypcik, który ma mi zmierzyć czas przesyłania 10 tys. żądań ws. Niestety używając tego skryptu dostaję mierne wyniki rzędu ~1.500 req/s. Przy analogicznym teście z użyciem ratchet w PHP dostaję wyniki ~27.5 tys., czyli prawie 20 razy więcej. Dodatkowo test samego protokołu HTTP w js daje mi wynik prawie 4 tys. żądań. Całość wygląda jakby każde żądanie socket.io nawiązywało nowe połączenie zamiast używać starego, ale zdarzenie connect leci tylko raz, więc to nie powinno być przyczyną. Może mi ktoś powiedzieć co jest w tym teście źle? Server: Kod var app = require('express')(); var http = require('http').Server(app); var io = require('socket.io')(http); app.get('/', function(req, res) { res.sendfile(__dirname + '/index.html'); }); io.on('connection', function(socket) { socket.emit('connection'); socket.on('req', function() { socket.emit('ans', 'hello'); }); }); http.listen(3000, function() { console.log('listening on *:3000'); }); Client Kod var socket = io();
var cnt = 0; var startTime = 0; var endTime = 0; socket.on('ans', function(message) { if (++cnt === 10000) { endTime = performance.now(); console.log(endTime-startTime); } }); socket.on('connection', function() { startTime = performance.now(); for (var i=0; i<10000; i++) { socket.emit('req', 'hello'); } }); Ten post edytował Skie 21.04.2016, 19:33:20 |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 1 798 Pomógł: 307 Dołączył: 13.05.2009 Skąd: Gubin/Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Node.js działa jedno-wątkowo, więc jeżeli masz na tej maszynie ~8 rdzeni, out of box node ci tego nie obsłuży, dlatego że sposób działania node.js jest inny od tego jak działa PHP. Dla PHP każdy request to jest nowy wątek, w przypadku node.js takie coś trzeba sobie dorobić samemu, bo nie jest to aplikacja bezstanowa, jak w przypadku PHP. Sprawdź ile wątków utworzył PHP aby obsłużyć te 27k emitów, i przelicz to na ile jeden wątek jest w stanie udźwignąć takich emitów i będziesz miał porównanie z node.js.
Nie ma czegoś takiego w websocketach jak request, jest emit, jest handshake, w twoim przypadku są to emity. socket.io nie jest "prostą" bilbioteką jak tą którą użyłeś w PHP, tutaj masz takie rzeczy jak namespace, jak roomy, jak możliwość skalowania na wiele maszyn, wciąż korzystając przestrzeni nazw/pokoi. socket.io to również fallback do xhr-poolingu kiedy nie ma websocketów, czy są zablokowane przez jakieś antywirusy czy firewalle (w większości firm admini blokują wszystkie inne protokoły z wyjątkiem http/https). Socket.io to również możliwość przesyłania całych blobów. To dużo więcej niż tylko pub/sub.. Ten post edytował by_ikar 21.04.2016, 22:03:43 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 26.09.2025 - 14:11 |