2016-07-06 20 views
2

Ich mache ein Online-Browser-Spiel mit Websockets und einem Node-Server und wenn ich etwa 20-30 Spieler habe, ist die CPU in der Regel etwa 2% und RAM bei 10-15%. Ich benutze nur ein billiges Digital Ocean Tröpfchen, um es zu hosten.Der Knotenserver stößt nach dem Zufallsprinzip zu 100% und stürzt dann ab. Wie zu diagnostizieren?

Allerdings scheint alle 20-30 Minuten die Server-CPU-Auslastung für 10 Sekunden auf 100% zu steigen und schließlich abzustürzen. Bis zu diesem Zeitpunkt schwankt die CPU normalerweise um 2% und das Spiel läuft sehr flüssig.

Ich kann nicht für das Leben von mir sagen, was dies auslöst, da es keine Fehler in den Protokollen gibt und nichts im Spiel, das ich sehen kann, verursacht es. Scheint einfach ein zufälliges Ereignis zu sein, das den Server zum Absturz bringt.

Es gibt auch einige kleinere Spikes, die den Server nicht zum Absturz bringen, sich aber bald selbst auflösen. Hier ist ein Bild:

http://i.imgur.com/EH3o8ue.png

Ich glaube nicht, daß ich die Blockierung der Ereignisschleife überall und ich habe keine Ausführungspfade, die lange Lauf zu sein scheinen. Die Pakete zu und von dem Server sind normalerweise zwei pro Sekunde pro Benutzer, so dass nicht viel Bandbreite verwendet wird. Und der Server ist meistens nur ein Relay mit wenig Verarbeitung von Paketen außer der Validierung, so dass ich nicht sicher bin, welcher Codepfad so intensiv sein könnte.

Was kann ich tun, um dies zu profilieren und herauszufinden, wo ich anfangen soll zu untersuchen, was diese Stacheln verursacht? Ich würde mir gerne vorstellen, dass es einen Codepfad gibt, den ich vergessen habe, der unter Last erstaunlich langsam ist, oder vielleicht fehlt mir eine Knotenflagge, die es auflösen würde, aber ich weiß es nicht.

+0

haben Sie diese http://techblog.netflix.com/2014/11/nodejs-in-flames.html überprüft? oder diese http://stackoverflow.com/questions/13375735/node-js-cpu-100/13376256#13376256? Können Sie bestätigen, dass die Last vom Node-Prozess über Top oder ähnliches stammt? –

+0

@ mh-cbon: top bestätigt, es war alles von der Knoten-App –

+0

Haben Sie in Betracht gezogen, einen Blick auf newrelic zu werfen? Kann auch helfen. –

Antwort

1

Ich denke, ich könnte es herausgefunden haben.

Ich benutze meist WebSockets für mein Spiel und ich lief htop und bemerkte, dass, wenn jemand große Pakete sendet (eine Tonne von Aktionen in kurzer Zeit), die CPU zu 100% aussetzt. Ich habe mich gefragt, warum das so war, als ich mich daran erinnerte, dass ich eine binary-packer verwendete, um die Bandbreitennutzung zu reduzieren.

Ich habe versucht, den Parser auf JSON stattdessen zu ändern, um die Pakete nicht zu komprimieren und zu packen und unabhängig davon, wie groß die Pakete waren die CPU-Auslastung bei 2% die gesamte Zeit.

Also ich denke, was den Absturz verursacht hat, war, wenn ein Spieler eine Menge Daten in kurzer Zeit senden würde und der Server wäre überwältigt davon, alles zu packen und es rechtzeitig zu versenden.

Dies ist möglicherweise nicht die tatsächliche Antwort, aber es ist zumindest etwas, das behoben werden muss. Zum Glück verwendet das Spiel sehr wenig Bandbreite, und Bandbreite ist nicht der Flaschenhals, so dass ich es einfach als JSON belasse.

Das einzige Problem ist, dass mit JSON-Codierung, dass Benutzer die Pakete in der Chrome-Entwickler-Konsole Netzwerk Registerkarte lesen können, die ich nicht mag .. macht es viel einfacher herauszufinden, wie das Spiel funktioniert und möglicherweise Cheats finden/Exploits ..