Socket.io: Anzahl der verbundenen Clients / Sockets

Erstellt am 14. Aug. 2011  Β·  53Kommentare  Β·  Quelle: socketio/socket.io

Hallo,

Ich verwende io.sockets.clients().length , um die Anzahl aller derzeit verbundenen Clients zu ermitteln, aber nach einiger Zeit ist diese Anzahl viel zu hoch. Viele nicht verbundene Clients sind noch in diesem Array vorhanden.

Unten ein Bild von io.sockets.clients().length , das 24 Stunden lang alle 5 Minuten aufgezeichnet wird. Sobald die Anzahl ΓΌber ~ 2k erreicht war, startete ich den Server neu, ungefΓ€hr 200 bis 300 Clients wurden wieder verbunden, was die richtige Anzahl ist.

Connected Clients

Ist dies der falsche Weg, um die Anzahl aller verbundenen Clients zu ermitteln? Ich habe auch versucht, die Verbindungen und Verbindungen manuell zu zΓ€hlen, aber nach einem Tag gab es mehr Verbindungen als Verbindungen, die Anzahl war negativ.

Siehe auch: https://github.com/LearnBoost/socket.io/issues/349

Performance bug

Hilfreichster Kommentar

L2C FAF IT RTFM !!!
β–‘β–‘β–‘β–‘β–‘β–„β–„β–„β–„β–€β–€β–€β–€β–€β–€β–€β–€β–„β–„β–„β–„β–„β–„β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘
β–‘β–‘β–‘β–‘β–‘β–ˆβ–‘β–‘β–‘β–‘β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–‘β–‘β–€β–€β–„β–‘β–‘β–‘β–‘
β–‘β–‘β–‘β–‘β–ˆβ–‘β–‘β–‘β–’β–’β–’β–’β–’β–’β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–’β–’β–’β–‘β–‘β–ˆβ–‘β–‘β–‘
β–‘β–‘β–‘β–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–„β–ˆβ–ˆβ–€β–„β–„β–‘β–‘β–‘β–‘β–‘β–„β–„β–„β–‘β–‘β–‘β–‘β–ˆβ–‘β–‘
β–‘β–„β–€β–’β–„β–„β–„β–’β–‘β–ˆβ–€β–€β–€β–€β–„β–„β–ˆβ–‘β–‘β–‘β–ˆβ–ˆβ–„β–„β–ˆβ–‘β–‘β–‘β–‘β–ˆβ–‘
β–ˆβ–‘β–’β–ˆβ–’β–„β–‘β–€β–„β–„β–„β–€β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–‘β–‘β–‘β–’β–’β–’β–’β–’β–‘β–ˆ
β–ˆβ–‘β–’β–ˆβ–‘β–ˆβ–€β–„β–„β–‘β–‘β–‘β–‘β–‘β–ˆβ–€β–‘β–‘β–‘β–‘β–€β–„β–‘β–‘β–„β–€β–€β–€β–„β–’β–ˆ
β–‘β–ˆβ–‘β–€β–„β–‘β–ˆβ–„β–‘β–ˆβ–€β–„β–„β–‘β–€β–‘β–€β–€β–‘β–„β–„β–€β–‘β–‘β–‘β–‘β–ˆβ–‘β–‘β–ˆβ–‘
β–‘β–‘β–ˆβ–‘β–‘β–‘β–€β–„β–€β–ˆβ–„β–„β–‘β–ˆβ–€β–€β–€β–„β–„β–„β–„β–€β–€β–ˆβ–€β–ˆβ–ˆβ–‘β–ˆβ–‘β–‘
β–‘β–‘β–‘β–ˆβ–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–€β–ˆβ–„β–„β–„β–ˆβ–„β–„β–ˆβ–„β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–ˆβ–‘β–‘β–‘
β–‘β–‘β–‘β–‘β–ˆβ–‘β–‘β–‘β–‘β–€β–€β–„β–‘β–ˆβ–‘β–‘β–‘β–ˆβ–‘β–ˆβ–€β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘β–ˆβ–‘β–‘
β–‘β–‘β–‘β–‘β–‘β–€β–„β–‘β–‘β–‘β–‘β–‘β–€β–€β–„β–„β–„β–ˆβ–„β–ˆβ–„β–ˆβ–„β–ˆβ–„β–€β–‘β–‘β–ˆβ–‘β–‘
β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–€β–„β–„β–‘β–’β–’β–’β–’β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–’β–‘β–‘β–‘β–ˆβ–‘
β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–€β–€β–„β–„β–‘β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–‘β–‘β–‘β–‘β–ˆβ–‘
β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–€β–„β–„β–„β–„β–„β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–‘β–‘
β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–€β–€β–€β–€β–€β–€β–€β–€β–‘β–‘β–‘

Alle 53 Kommentare

+1. Ich denke in meinem Fall ist dies ein letztes Problem, das Speicherprobleme verursacht (wΓ€chst bis zum Segmentierungsfehler).

Ja, stΓΌrzt hier ungefΓ€hr zweimal am Tag mit einem Segmentierungsfehler ab.

es ist in der "Dokumentation" vermerkt:
http://labs.learnboost.com/socket.io/

im Abschnitt Socket.IO Node.JS Server / Listener (In-Page-Suche nach "Spleiß" durchführen). Zitieren:

"Ein Array von Clients. Wichtig: Nicht verbundene Clients werden auf null gesetzt, das Array wird nicht gespleißt."

Um vom Gedanken ΓΌber den Code bis zur Dokumentation zu gelangen, muss es einen Grund geben, warum nicht verbundene Benutzer nicht aus diesem Array entfernt werden. Ich kann nur nicht erraten, was dieser Grund ist. Das beste Szenario ist, dass es das Verfolgen von CONNECTED-Benutzern zu einem Problem macht und im schlimmsten Fall zu einem Mangel an StabilitΓ€t in einer node.js / socket.io-Serverimplementierung beitrΓ€gt.

Als Leistungsfehler markiert.

Ich habe das gleiche Problem.

und ich mache meine Nummer basierend auf einem var mit i +1 wΓ€hrend des Verbindungsereignisses und -1 wΓ€hrend des Trennens. (Das ist also kein Nullproblem)

Benutzeranzahl:

https://skitch.com/tomekotomek/f4867/dock

ZENTRALPROZESSOR:

https://skitch.com/tomekotomek/f489w/dock

ERINNERUNG:

https://skitch.com/tomekotomek/f4eyy/graph.php-747x374

Übrigens.

Es ist mehr als ein Leistungsproblem, es senkt nur unsere Betriebszeit auf weniger als eine Woche.

Die Art und Weise, wie ich das herausgefunden habe, bestand darin, einen Redis-Satz der Client-IDs zu verwenden, die Verbindung zu socket.io hinzuzufΓΌgen und beim Trennen aus dem Satz zu entfernen. Mit dem Befehl SCARD erhalten Sie die Anzahl der verbundenen Clients und SMEMBERS alle IDs.

Ja, das Array muss gelΓΆscht werden oder es muss ein besserer Weg gefunden werden, um Clients zu halten.

+1

+1

+1
Dies ist definitiv mehr als nur ein Problem mit der Array-LΓ€nge.
Das Inkrementieren und Dekrementieren eines ZÀhlers beim Verbinden / Trennen führt immer noch zu einem immer grâßeren ZÀhler.

+1

+1

+1

+1

+1

Hat jemand versucht, dies auf die verschiedenen Transporte zu isolieren? IE Überprüfen Sie, ob es in funktioniert
Websocket, Flashsocket, Xhr-Polling usw.

Dies ist definitiv ein wichtiges Problem, da der Server ohne Neustart nicht konsistent laufen kann. Ich kann nicht einmal einen Tag ohne mindestens einen Neustart verbringen, da der Speicher weiter wΓ€chst. HINWEIS: In Knoten 0.4. * Ist der Speicher fΓΌr mich VIEL BESSER.

+1

Ich habe das gleiche Problem entdeckt - mein GedΓ€chtnis wird gerade voll. etwa 1 mb / pro Minute

mit ca. 1500 Steckdosen, die sich aufgrund von Klicks auf der Website wieder verbinden.

Aufgrund des Speicherverlusts muss es tΓ€glich neu gestartet werden

L2C FAF IT RTFM !!!
β–‘β–‘β–‘β–‘β–‘β–„β–„β–„β–„β–€β–€β–€β–€β–€β–€β–€β–€β–„β–„β–„β–„β–„β–„β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘
β–‘β–‘β–‘β–‘β–‘β–ˆβ–‘β–‘β–‘β–‘β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–‘β–‘β–€β–€β–„β–‘β–‘β–‘β–‘
β–‘β–‘β–‘β–‘β–ˆβ–‘β–‘β–‘β–’β–’β–’β–’β–’β–’β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–’β–’β–’β–‘β–‘β–ˆβ–‘β–‘β–‘
β–‘β–‘β–‘β–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–„β–ˆβ–ˆβ–€β–„β–„β–‘β–‘β–‘β–‘β–‘β–„β–„β–„β–‘β–‘β–‘β–‘β–ˆβ–‘β–‘
β–‘β–„β–€β–’β–„β–„β–„β–’β–‘β–ˆβ–€β–€β–€β–€β–„β–„β–ˆβ–‘β–‘β–‘β–ˆβ–ˆβ–„β–„β–ˆβ–‘β–‘β–‘β–‘β–ˆβ–‘
β–ˆβ–‘β–’β–ˆβ–’β–„β–‘β–€β–„β–„β–„β–€β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–‘β–‘β–‘β–’β–’β–’β–’β–’β–‘β–ˆ
β–ˆβ–‘β–’β–ˆβ–‘β–ˆβ–€β–„β–„β–‘β–‘β–‘β–‘β–‘β–ˆβ–€β–‘β–‘β–‘β–‘β–€β–„β–‘β–‘β–„β–€β–€β–€β–„β–’β–ˆ
β–‘β–ˆβ–‘β–€β–„β–‘β–ˆβ–„β–‘β–ˆβ–€β–„β–„β–‘β–€β–‘β–€β–€β–‘β–„β–„β–€β–‘β–‘β–‘β–‘β–ˆβ–‘β–‘β–ˆβ–‘
β–‘β–‘β–ˆβ–‘β–‘β–‘β–€β–„β–€β–ˆβ–„β–„β–‘β–ˆβ–€β–€β–€β–„β–„β–„β–„β–€β–€β–ˆβ–€β–ˆβ–ˆβ–‘β–ˆβ–‘β–‘
β–‘β–‘β–‘β–ˆβ–‘β–‘β–‘β–‘β–ˆβ–ˆβ–‘β–‘β–€β–ˆβ–„β–„β–„β–ˆβ–„β–„β–ˆβ–„β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–ˆβ–‘β–‘β–‘
β–‘β–‘β–‘β–‘β–ˆβ–‘β–‘β–‘β–‘β–€β–€β–„β–‘β–ˆβ–‘β–‘β–‘β–ˆβ–‘β–ˆβ–€β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘β–ˆβ–‘β–‘
β–‘β–‘β–‘β–‘β–‘β–€β–„β–‘β–‘β–‘β–‘β–‘β–€β–€β–„β–„β–„β–ˆβ–„β–ˆβ–„β–ˆβ–„β–ˆβ–„β–€β–‘β–‘β–ˆβ–‘β–‘
β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–€β–„β–„β–‘β–’β–’β–’β–’β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–’β–‘β–‘β–‘β–ˆβ–‘
β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–€β–€β–„β–„β–‘β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–‘β–‘β–‘β–‘β–ˆβ–‘
β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–€β–„β–„β–„β–„β–„β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–‘β–‘
β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–€β–€β–€β–€β–€β–€β–€β–€β–‘β–‘β–‘

Ich habe gerade die Flashsocket-Transportserverseite ausgeschaltet und die Speichernutzung UND die CPU-Nutzung sind SO VIEL BESSER. Kann jemand anderes das ausprobieren und sehen, ob das hilft?

+1

Ich nehme es zurΓΌck, die CPU ist besser, aber der Speicher leckt immer noch langsam. Ich nehme an, das liegt daran, dass der Flash-Richtlinienserver ausgeschaltet wird.

Bitte hΓΆr auf, den Feed mit "+1" aufzublΓ€hen, dies ist weder Google Plus noch Facebook ...

Mann, ich muss es tun +1 dazu

Es gibt auch eine Deaktivierungsbenachrichtigung fΓΌr dieses Problem

In meinem Fall ist socket.manager.closed, socket.manager.handshaken mehr als socket.manager.open. und ich weiß nicht, wie ich die nutzlosen Verbindungen klÀren soll

Genau das gleiche hier. Wir mΓΌssen den Server so oft pro Tag neu starten, weil die Verbindungen immer mehr Speicher verbrauchen, bis uns 4 GB Speicher ausgehen.
Ich werde mich sehr freuen, wenn dieses Problem behoben ist, da ich socket.io nicht weiter verwenden kann, wenn ich alle paar Stunden neu starten muss. (Wir haben ungefΓ€hr 2000 Online-Benutzer gleichzeitig, die eine Verbindung herstellen und trennen.)

Ich verwende socket.io 0.9.10 und den folgenden Code, um die Anzahl der Sockets zu bestimmen:

var socketIO = require ('socket.io'). listen (.....
...
var numberOfSockets = Object.keys (socketIO.connected) .length;

Ich bin mir nicht sicher, wie genau diese Zahl auf die verschiedenen RandfΓ€lle reagiert, aber bis jetzt scheint sie genau zu sein: Jeder Browser, der eine Verbindung herstellt, erhΓΆht die Zahl, jeder geschlossene Browser verringert sie.

Stimmt etwas mit diesem Ansatz nicht?

Abgesehen von den ZΓ€hlproblemen (die umgangen werden kΓΆnnen) - die Speicherprobleme sind hier ziemlich brutal. Gibt es Hoffnung, dass dies in Zukunft behoben wird? Dies bedeutet, dass Socket.io-Bereitstellungen mit langer Laufzeit und hoher AktivitΓ€t sehr schwierig zu verwalten sind.

Kennt jemand Gabeln, bei denen dieses Problem behoben wurde?

Das Problem hΓ€ngt mit dem folgenden Code zusammen (entnommen aus socket.io 0.9.10):

  SocketNamespace.prototype.clients = function (room) {
    var room = this.name + (room !== undefined ? '/' + room : '');

     if (!this.manager.rooms[room]) {
         return [];
     }

     return this.manager.rooms[room].map(function (id) {
         return this.socket(id);
     }, this);
  };

Die Methode this.socket(id) erstellt eine neue Instanz des Sockets. Wenn Sie diese also bei jeder Socket-Verbindung verwenden, fΓΌhrt dies zu einem Speicherverlust.

@dknaus lieferte eine hervorragende

@outbounder Kannst du darauf hinweisen, was diese hervorragende Problemumgehung tatsΓ€chlich war? Denn alles, was ich in diesem Thread sehe, ist eine aktive Socket-Anzahl

@marksyzm

 Object.keys(socketIO.connected).length;

Dies gilt nur, wenn Sie ein GeschΓ€ft an socketio angeschlossen haben. Andernfalls kΓΆnnen Sie sie nur nach benutzerdefinierter Logik wie folgt zΓ€hlen:

 io.on("connection", function(s){ 
   connectedCount += 1; 
   s.on("disconnect", function(){
     connectedCount -= 1;
   });
 });

@outbounder, aber ich dachte, der Sinn dieses Fehlers besteht darin, das Problem mit dem Speicherverlust zu beheben, wenn die Sockets nicht getrennt werden. Vermisse ich etwas

Erinnerung blutet irgendwo aus

https://github.com/LearnBoost/socket.io/issues/1015

https://github.com/sockjs/sockjs-node/issues/81

https://github.com/joyent/node/issues/2328#issuecomment -3190337

Unsicher, ob es sich um einen Websocket oder einen Knoten handelt oder beides

sockjs hat Γ€hnliche Probleme - was bedeutet, dass entweder socket.io und sockjs dieselbe ws lib verwenden, die ein Problem mit node hat - oder es handelt sich nur um ein allgemeines Knotenproblem

+1

Das passiert mir immer noch in der Produktion. Ich habe nicht einmal so viele verbundene Clients, wirklich - 100-200 in der Spitze. Prozesse haben nur noch wenig Speicher und hΓ€ngen oder sterben. Arbeitet jemand an diesem Speicherverlust? Wie kann ich helfen?

Soweit ich das beurteilen kann, ist dies seit Jahrhunderten ein bekanntes Problem, und jeder, der nach tatsΓ€chlichen Bereitstellungen strebt, hat sich von socket.io entfernt. Es gab keine Bewegung in dieser Angelegenheit, und die engine.io scheint ΓΌberhaupt nicht mit den Transportkernen zu spielen, daher gibt es keinen Grund zu der Annahme, dass dies auch jemals behoben wird.

Ehrlich gesagt habe ich nach Beweisen gesucht, dass JEDER Vanilla Socket.io in der Produktion mit einem aktiven Websocket-Transport einsetzt und keine zuverlΓ€ssigen Berichte gefunden hat. Trello ist ein hochkarΓ€tiger Benutzer, aber er hat zugegeben, eine gepatchte Version zu verwenden, die nicht verΓΆffentlicht wurde und nur den Websocket-Transport verwendet (ab wann sollte ΓΌberhaupt socket.io verwendet werden?). Ich habe socket.io komplett verlassen, weil es nicht so aussieht, als wΓΌrde sich dies bald Γ€ndern. Ich kann nicht versprechen, dass sockjs keine Probleme hat, aber ich bin mir sicher, dass es nicht annΓ€hernd so schnell ausfΓ€llt wie socket.io, wenn Sie ein paar tausend Kunden beitreten / verlassen.

Ich habe gerade mit dem gerungen, was ich fΓΌr dieses Problem halte, auf meiner eigenen socket.io/redis App auf Nodejitsu. Es scheint definitiv so, als wΓ€re es der Redis Store von socket.io. Ich werde zu SockJS wechseln und mein eigenes Redis-Management schreiben, denke ich.

Chat-Protokolle von mir, die im Support-Kanal #nodejitsu daran arbeiten:
https://gist.github.com/4146668

+1

Bin ich es oder benutzt socket.io keine Redis mehr?

Wie wΓ€re es mit dem HinzufΓΌgen von this.store.publish ('trennen', ID); zu Manager.prototype.onClientDisconnect
wie hier vorgeschlagen: https://github.com/LearnBoost/socket.io/issues/831

Wird es Probleme beim HinzufΓΌgen dieser Zeile geben? Ich wΓΌrde gerne wissen.

Zweitens das?

+1

+1

Jemand?

Irgendeine Bewegung zu diesem Thema? Ich hoffe, dass ich in naher Zukunft bereitstellen kann, und wΓΌrde jeden Einblick, den Mitarbeiter mit Produktionsbereitstellungen zu diesem Thema haben, wirklich schΓ€tzen.

Fix oben hat bei uns funktioniert ... Last ist deutlich gesunken
Am 4. Juni 2013, 11:01 Uhr, schrieb "patrickod" [email protected] :

Irgendeine Bewegung zu diesem Thema? Ich hoffe, in naher Zukunft und zu implementieren
Ich wΓΌrde jeden Einblick, den Menschen mit Produktionsbereitstellungen haben, wirklich schΓ€tzen
zu diesem Thema.

- -
Antworten Sie direkt auf diese E-Mail oder sehen Sie sie sich unter Gi tHubhttps an: //github.com/LearnBoost/socket.io/issues/463#issuecomment -18927408
.

Flash-Socket-Unterstützung deaktivieren? Die Dokumentation besagt, dass dies jetzt standardmÀßig erfolgt.

Ich habe mich diesem Problem noch nie gestellt, bin aber noch in der Entwicklung und im Benchmarking. Wurde das geklΓ€rt?

Du erzΓ€hlst uns. Sie machen Benchmarking. : D.

Am Donnerstag, 23. Januar 2014, um 7:07 Uhr schrieb Maziyar Panahi [email protected] :

Ich habe mich diesem Problem noch nie gestellt, bin aber noch in der Entwicklung und im Benchmarking.
Wurde das geklΓ€rt?

- -
Antworten Sie direkt auf diese E-Mail oder sehen Sie sie sich auf Gi tHubhttps an: //github.com/LearnBoost/socket.io/issues/463#issuecomment -33126062
.

Du erzΓ€hlst uns. Sie machen Benchmarking. : D.

Ehrlich gesagt habe ich nicht bemerkt, dass ich in großer Zahl gefallen bin. Ich habe gesehen, dass nach 5 bis 6 Minuten nur wenige Verbindungen unterbrochen wurden, wenn ich 1000 Benutzer gleichzeitig verbinde, aber sie stellen die Verbindung sehr schnell wieder her und ich habe über 10.000 Nachrichten pro Sekunde an alle Benutzer. Daher denke ich, dass meine EC2-Instanz (m1.large) einfach nicht stark genug ist, um sie alle am Leben zu erhalten, ohne nur wenige fallen zu lassen.
Ich habe mich gefragt, ob ich in Zukunft mit diesem Problem konfrontiert werde. Meins lΓ€sst nur wenige fallen und verbindet sie im Stresstest wieder. Nachdem ich alle getrennt habe, kann ich sehen, dass die Anzahl der Clients auf 0 fΓ€llt.

+1

Ich hatte seit 10.11 keine Probleme damit ... Ich wΓΌrde es mΓΆglicherweise auf die Verwendung von Ubuntu 10.10 zurΓΌckfΓΌhren? Wie auch immer, scheint jetzt in Ordnung zu sein.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen