![]() |
![]() |
![]()
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%) ![]() ![]() |
W wolnej chwili pobawiłem się https://github.com/M6Web/websocket-bench którego również można użyć do zwykłych websocketów, ale dodatkowo ma zaimplementowane kilka innych popularnych implementacji websocketów. Korzystając z twojego przykładu potrzebowałem 1655.41 na wysłanie i odebranie 10k emitów. Kiedy zamykałem narzędzia developerskie, odświeżałem stronę i dopiero otwierałem konsole, wynik bywał lepszy 1517.0100000000002, a czasami nawet 100ms mniej. Ale teraz ci pokażę dlaczego twój test nie jest miarodajny.
(IMG:http://i.imgur.com/anog3hW.png) 10k wiadomości w 4.5 sekundy? Słabo nie ? Pójdźmy dalej i dodajmy trochę więcej wiadomości: (IMG:http://i.imgur.com/IHU57A4.png) 100k wiadomości w 4.5 sekundy? Coś tutaj jest nie tak, według twojego testu, nie powinno takie coś mieć miejsca. Pójdźmy dalej, dodajmy trochę więcej wiadomości: (IMG:http://i.imgur.com/NYh3Ael.png) milion wiadomości w 4.5k sekundy? Zobaczmy jak daleko możemy się posunąć: (IMG:http://i.imgur.com/gy6EsV2.png) 10 milionów, czas? Wciąż 4.5 sekundy. Damy radę 100 milionów ? (IMG:http://i.imgur.com/2W1vNVk.png) Damy, czas się nie zmienia, czas odpowiedzi wciąż zbliżony. Ciekawe jak pójdzie z miliardem wiadomości: (IMG:http://i.imgur.com/tCwq4fk.png) No i tutaj już zaczynają się schody, widać że to jest próg. Mój plik generator.js: Kod module.exports = { /** * On client connection (required) * @param {client} client connection * @param {done} callback function(err) {} */ onConnect : function(client, done){ done(); }, /** * Send a message (required) * @param {client} client connection * @param {done} callback function(err) {} */ sendMessage : function(client, done){ client.emit('request', 'hello'); done(); } }; Nie ma sensu sprawdzania ile jedno połączenie jest w stanie przetworzyć wiadomości na sekundę, bo nigdy takiej ilości nie będziesz wysyłać na jednym połączeniu. Jak i nie ma sensu wysyłania emitów które kompletnie nic nie robią, bo czas odpowiedzi to nie wszystko, trzeba jeszcze przesłane dane przerobić, zapisać do bazy, czy też odczytać z bazy, albo przekazać dalej. Ten post edytował by_ikar 25.04.2016, 13:27:45 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 2.10.2025 - 18:35 |