Maximale gleichzeitige Socket.IO-Verbindungen

123

Diese Frage wurde zuvor gestellt, aber nicht in letzter Zeit und nicht mit einer klaren Antwort.

Gibt es bei Verwendung von Socket.io eine maximale Anzahl gleichzeitiger Verbindungen, die beibehalten werden können, bevor Sie einen weiteren Server hinzufügen müssen?

Kennt jemand aktive Produktionsumgebungen, in denen Websockets (insbesondere socket.io) in großem Umfang verwendet werden? Ich würde wirklich gerne wissen, welche Art von Setup für maximale Verbindungen am besten ist.

Da Websockets auf TCP basieren, besteht meines Erachtens die Bindung an das 64-KB-Portlimit, sofern die Ports nicht zwischen Verbindungen geteilt werden. Ich habe aber auch Berichte über 512K-Verbindungen mit Gretty gesehen . Also ich weiß es nicht.

Andrew
quelle
3
Trello verwendet Sockets in großem Umfang (speziell socket.io).
James
Ich habe gelesen, dass Trello den Socket.io-Code aufgrund einer Verbindungsobergrenze von 10.000 ändern musste und in der Lage war, "viele tausend" Verbindungen aufrechtzuerhalten, bevor Server hinzugefügt wurden. Immer noch eine große Kluft zwischen dem und 512K anderer Serversysteme.
Andrew
1
Wie alt ist dieser Artikel? Trello hat kürzlich über 1 Million aktive Benutzer pro Monat erreicht, daher würde ich mir vorstellen, dass sie jetzt mehr als 10.000 aktive Sockets verwenden. Trello verwendet Redis , um für Skalierbarkeit auf socket.io zu sitzen
James
2
Trello hat jetzt anscheinend über 4 Millionen Benutzer, aber sie führen das sicherlich auf einer großen Anzahl von Servern aus, oder? Das bringt mich zurück zu meiner ursprünglichen Frage: Wie hoch ist die tatsächliche maximale Anzahl gleichzeitiger Benutzer pro Server (oder der anderer)? Es wäre auch gut zu wissen, welche Art von Server / Container sie verwenden. Und laufen sie immer noch mit ihrer eigenen Gabel oder sind sie zurück zum Ursprung / Meister? Mein einziger Zweck bei der Beantwortung dieser Frage bestand darin, festzustellen, ob mein Unternehmen es sich (zu diesem Zeitpunkt) leisten konnte, eine Socket.io-Anwendung für wahrscheinlich 120.000 gleichzeitige Verbindungen zu verwalten.
Andrew
1
In Bezug auf die Hafengrenze, ich glaube , die Erklärung dafür , warum ist das kein Problem erklärt hier . Grundsätzlich wird auf Ihrem System nur der Port verwendet, an dem Sie gerade lauschen. Für jede Verbindung werden Sockets erstellt, die Dateideskriptoren verwenden, jedoch keine Ports auf Ihrer Box.
Paul Lynch

Antworten:

77

Dieser Artikel kann Ihnen dabei helfen: http://drewww.github.io/socket.io-benchmarking/

Ich habe mich die gleiche Frage gestellt und am Ende einen kleinen Test (mit XHR-Polling) geschrieben, um festzustellen, wann die Verbindungen ausfielen (oder zurückfielen). Ich stellte (in meinem Fall) fest, dass die Sockets bei ungefähr 1400-1800 gleichzeitigen Verbindungen zu funktionieren begannen.

Dies ist eine kurze Zusammenfassung, die ich gemacht habe, ähnlich dem Test, den ich verwendet habe: https://gist.github.com/jmyrland/5535279

MARMELADE
quelle
7
Mir ist klar, dass dies ein älteres Thema ist, aber ich habe es zuerst gefunden, als ich nach einer Frage zu meiner Antwort gesucht habe, und letztendlich festgestellt, dass dies hilfreich ist: rtcamp.com/tutorials/linux/increase-open-files-limit Das Limit für offene Dateien pro Prozess kann Standardmäßig ist ein Soft-Limit von 1024 und ein Hard-Limit von 4096 festgelegt. Da jeder offene TCP-Port eine Datei darstellt, ist es wichtig, diese Limits zu berücksichtigen, wenn Sie bestimmen, wie viele offene Sockets ein Computer zulässt, bevor Sie versuchen, die Bibliothek maximal zu nutzen.
DeeperID
2
@JAM Haben Sie jemals herausgefunden, warum Ihre Web-Sockets zwischen 1400 und 1800 Verbindungen hergestellt haben? Ich habe das gleiche Problem und meine Dateilimits sind auf 100.000 festgelegt. Ich weiß also, dass dies nicht das Problem ist. Jede Hilfe wäre sehr dankbar. Danke dir.
Seth
@seth: Es ist eine Weile her, seit ich dies das letzte Mal überprüft habe, aber ich denke, dies war die Schlussfolgerung: XHR-Umfragen haben zu viele Ressourcen in Anspruch genommen (im Vergleich zu anderen Transportmethoden). Bei Verwendung von Websockets war die Anzahl der gleichzeitigen Verbindungen höher.
JAM
@ Jam danke für die Antwort. Ich sehe die gleichen Probleme mit dem ws-Modul, nicht mit socket.io, daher sollte es keine XHR-Abfrage mit dem ws-Modul geben. Hier habe ich Probleme bei der Fehlerbehebung. Die Suche wird fortgesetzt.
Seth
Dies ist eine gute, saubere Antwort. Auch richtig, wie es von Fall zu Fall ist. Persönlich schlage ich vor, dass ppl ihre eigenen Benchmarks oder Verbindungssimulatoren schreiben. Ein Test für eine andere Person mag zwar gut sein, stellt jedoch nicht die reale Umgebung dar ... Sobald Sie einen Client-Simulator haben, der in der Lage ist, eine beliebige Anzahl von Clients mit verschiedenen realen Fehlern zu behandeln, können Sie nach größeren Änderungen und auch Benchmarks erstellen Aktualisieren Sie Ihren Simulator, während Sie gehen. Das Bedienen einer Benutzer-Chat-Oberfläche würde sich von der Überwachung des Benutzerbrowsers usw. unterscheiden. Python Ich fand es sehr praktisch, einen Simulator zu schreiben ...
Angry 84
16

Ich habe versucht, socket.io unter AWS zu verwenden. Ich kann höchstens 600 Verbindungen stabil halten.

Und ich habe herausgefunden, dass es daran liegt, dass socket.io zuerst lange Abfragen verwendet und später auf websocket aktualisiert hat.

Nachdem ich die Konfiguration so eingestellt habe, dass nur Websocket verwendet wird, kann ich ungefähr 9000 Verbindungen beibehalten.

Stellen Sie diese Konfiguration auf der Clientseite ein:

const socket = require('socket.io-client')
const conn = socket(host, { upgrade: false, transports: ['websocket'] })
Salem Chen
quelle
2
Haben Sie EC2 verwendet, welche Art von Instanz? t2.micro, t2.nano?
Bvdb
2
Haben Sie beim Erzwingen von Websockets einen Unterschied in der Reaktionsfähigkeit festgestellt?
Lauren
Wissen Sie, wie groß Ihre Instanz war? Nur damit in Zukunft jeder weiß, dass einige alte Browser WebSockets nicht unterstützen, kann das Upgrade für einige wichtig sein.
Ryan Soderberg
Wie können wir testen, wie viel Verbindung der Server unterstützt? Wie haben Sie 9000 Verbindungen gemessen? Bitte vorschlagen ..
Neugieriger Entwickler
14

Diesem Typ scheint es gelungen zu sein, über 1 Million gleichzeitige Verbindungen auf einem einzelnen Node.js-Server herzustellen.

http://blog.caustik.com/2012/08/19/node-js-w1m-concurrent-connections/

Mir ist jedoch nicht klar, wie viele Ports er verwendet hat.

Daniel Nalbach
quelle
13
Nicht mit socket.io denke ich und nicht mal mit websockets. Der Typ schien lange Umfragen zu verwenden, was meiner Meinung nach weniger ressourcenhungrig ist.
Tim 333
6

Für + 300k gleichzeitige Verbindung:

Setzen Sie diese Variablen in /etc/sysctl.conf:

fs.file-max = 10000000 
fs.nr_open = 10000000

Ändern Sie diese Variablen auch in /etc/security/limits.conf:

* soft nofile 10000000
* hard nofile 10000000
root soft nofile 10000000
root hard nofile 10000000

Und schließlich erhöhen Sie auch die TCP-Puffer /etc/sysctl.conf:

net.ipv4.tcp_mem = 786432 1697152 1945728
net.ipv4.tcp_rmem = 4096 4096 16777216
net.ipv4.tcp_wmem = 4096 4096 16777216

Weitere Informationen finden Sie unter https://www.linangran.com/?p=547

MajidJafari
quelle
Wie kann ich überprüfen, ob unsere Änderungen funktionieren?
Neugieriger Entwickler