Ten problem dotyczy w szczególności Nodejitsu, ale podobne efekty wydają się występować w innych systemach VPS. Mam grę działającą w czasie rzeczywistym przy użyciu socket.io, a jedną rzecz, którą zauważyłem, jest to, że serwer od czasu do czasu czeka zbyt długo. Jeśli w tym okresie zostanie wysłanych wiele żądań, zachowują się tak, jakby wszystkie zostały umieszczone w kolejce i przetworzone jednocześnie. Podejrzewam, że jest niejasno skorelowany z obecnością innych użytkowników na udostępnianym sprzęcie (jak w przypadku każdego VPS).Wysoka latencja z NodeJS
W każdym razie, aby przetestować ten się (i upewnij się, że nie było ze względu na kod Mój gry), zbudowałem minimalny przypadek testowy:
express = require('express')
http = require('http')
app = express()
server = http.Server(app)
io = require('socket.io').listen(server)
io.sockets.on('connection', function(sock){
sock.on('perf', function(data, cb){
cb([Date.now()]); //respond with the current time
})
})
app.get('/', function(req, res){
res.header("Access-Control-Allow-Origin", "*")
res.header("Access-Control-Allow-Methods", "HEAD,GET,PUT,POST,DELETE")
res.header("Access-Control-Allow-Headers", "X-Requested-With")
res.end(JSON.stringify([Date.now().toString()])); //http equivalent of perf function
})
server.listen(process.env.PORT || 6655, function(){
console.log('listening now')
})
miałem prostą pustą stronę HTML z gniazdka. io, które okresowo wysyłają zdarzenie i czas, o czasie, który trwało do wywołania zwrotnego. I nadal pokazuje to samo:
pamiętać, że długość pręta reprezentuje pierwiastek kwadratowy z ilości czasu, nie ilość liniowy.
Kiedy zamiast polegać na socket.io, używam XHR do podobnego pomiaru bieżącego czasu odpowiedzi, wynik jest bardzo podobny, wiele odpowiedzi o małym opóźnieniu (choć z wyższą linią bazową niż websockets, zgodnie z oczekiwaniami) i sporadyczne skoki, które wydają się zbierać.
Dziwne jest to, że jeśli otworzysz go w wielu oknach przeglądarki i różnych przeglądarkach, wydaje się, że istnieje korelacja między różnymi przeglądarkami (i faktem, że jest ona całkowicie nieobecna lub znacznie rzadziej na niektórych serwerach), co wydaje się być sugerować, że jest to zjawisko po stronie serwera. Jednak w niektórych przeglądarkach występują opóźnienia, ale nie inne, a dwa okna Chrome z tej samej sesji wydają się być dokładnie dokładnymi duplikatami, co sugeruje, że dzieje się to lokalnie (na komputer lub przeglądarkę, sieć) mądry).
Od lewej do prawej: Incognito Chrome, Chrome (regularny), Firefox, Chrome (regularny)
Zresztą zostało to mylące mnie przez kilka miesięcy i naprawdę chciałbym, aby zrozumieć, co powoduje to i naprawia.
Jestem ciekawy, czy można otworzyć lokalne połączenie bezpośrednio na serwerze (być może z czymś podobnym do phantomjs) i wykonać te same pomiary, jeśli zobaczysz podobne skoki lub nie. Ciekawi mnie też, z jakiej wersji przeglądarek korzystasz i czy wracają one do flashowania, długiego sondowania czy iframe. Wygląda na to, że używasz ekspresu bez sesji, więc nie wydaje się, że jest to sesja związana z GC lub coś podobnego, i masz pewność, że serwer nie uruchamia się ponownie lub coś podobnego (co najprawdopodobniej oznacza wzrost cen wszystkich przeglądarek na poziomie w tym samym czasie, więc prawdopodobnie nie, ale po prostu zapytać). – hoonto
Zgaduję, że już monitorowałeś statystyki serwera również podczas tych? Ciekawe, czy w tym samym czasie występują jakiekolwiek skorelowane skoki lub spadki pamięci lub procesora. Jeśli miałbyś dostęp do centrum danych, mógłbyś podłączyć się do lokalnego przełącznika i wyeliminować większość zakłóceń sieciowych, ale to prawdopodobnie nie jest opcja ... byłoby miło, gdyby oferowały usługę monitorowania socket.io z wnętrza danych Centrum. – hoonto
W rzeczywistości można napisać lokalnego klienta węzła socket.io i uruchomić go lokalnie na tym samym serwerze, a także zmierzyć. Przepraszam, że tak bardzo cię spamuję, problemy z wydajnością mogą być jak igły w stogu siana, więc po prostu próbując wyrzucić wszystko, co tylko mogę o tym myśleć, może pomóc zawęzić problem do określonego obszaru. – hoonto