Ich programmiere einen Server und es scheint, dass meine Anzahl von Verbindungen begrenzt ist, da meine Bandbreite nicht gesättigt ist, selbst wenn ich die Anzahl von Verbindungen auf "unbegrenzt" eingestellt habe.
Wie kann ich die maximale Anzahl von Verbindungen erhöhen oder beseitigen, die meine Ubuntu Linux-Box gleichzeitig öffnen kann? Beschränkt das Betriebssystem dies oder ist es der Router oder der ISP? Oder ist es etwas anderes?
linux
networking
linux-kernel
red0ct
quelle
quelle
Antworten:
Die maximale Anzahl von Verbindungen wird durch bestimmte Einschränkungen sowohl auf Client- als auch auf Serverseite beeinflusst, wenn auch etwas unterschiedlich.
Auf der Client-Seite: Erhöhen Sie den ephermalen Portbereich und verringern Sie den
tcp_fin_timeout
So ermitteln Sie die Standardwerte:
Der ephermale Portbereich definiert die maximale Anzahl ausgehender Sockets, die ein Host aus einer bestimmten IP-Adresse erstellen kann. Das
fin_timeout
definiert die Mindestzeit, in der diese Sockets imTIME_WAIT
Status bleiben (unbrauchbar nach einmaliger Verwendung). Übliche Systemstandards sind:net.ipv4.ip_local_port_range = 32768 61000
net.ipv4.tcp_fin_timeout = 60
Dies bedeutet im Grunde, dass Ihr System nicht durchgehend mehr als
(61000 - 32768) / 60 = 470
Sockets pro Sekunde garantieren kann . Wenn Sie damit nicht zufrieden sind, können Sie mit der Erhöhung der beginnenport_range
. Das Einstellen des Bereichs15000 61000
ist heutzutage ziemlich üblich. Sie können die Verfügbarkeit weiter erhöhen, indem Sie die verringernfin_timeout
. Angenommen, Sie tun beides, und Sie sollten leichter mehr als 1500 ausgehende Verbindungen pro Sekunde sehen.So ändern Sie die Werte :
Das Obige sollte nicht als die Faktoren interpretiert werden, die die Systemfähigkeit zum Herstellen ausgehender Verbindungen pro Sekunde beeinflussen. Vielmehr beeinflussen diese Faktoren die Fähigkeit des Systems, gleichzeitige Verbindungen über große Zeiträume von "Aktivitäten" auf nachhaltige Weise zu handhaben.
Standardwerte für Sysctl auf einer typischen Linux-Box für
tcp_tw_recycle
&tcp_tw_reuse
wärenDiese erlauben keine Verbindung von einem "gebrauchten" Socket (im Wartezustand) und zwingen die Sockets, den gesamten
time_wait
Zyklus zu dauern . Ich empfehle die Einstellung:Dies ermöglicht ein schnelles Durchlaufen der Steckdosen im
time_wait
Status und deren Wiederverwendung. Bevor Sie diese Änderung vornehmen, stellen Sie jedoch sicher, dass dies nicht mit den Protokollen in Konflikt steht, die Sie für die Anwendung verwenden würden, die diese Sockets benötigt. Lesen Sie unbedingt den Beitrag "Umgang mit dem TCP TIME-WAIT" von Vincent Bernat , um die Auswirkungen zu verstehen. Dienet.ipv4.tcp_tw_recycle
Option ist für öffentlich zugängliche Server ziemlich problematisch, da sie keine Verbindungen von zwei verschiedenen Computern hinter demselben NAT-Gerät verarbeitet. Dies ist ein Problem, das schwer zu erkennen ist und darauf wartet, Sie zu beißen. Beachten Sie, dassnet.ipv4.tcp_tw_recycle
wurde entfernt von Linux 4.12.Auf der Serverseite: Der
net.core.somaxconn
Wert spielt eine wichtige Rolle. Es begrenzt die maximale Anzahl von Anforderungen, die an einen Listen-Socket in die Warteschlange gestellt werden. Wenn Sie sich sicher sind, dass Ihre Serveranwendung in der Lage ist, erhöhen Sie sie von Standard 128 auf 128 bis 1024. Jetzt können Sie diese Erhöhung nutzen, indem Sie die Listen-Backlog-Variable im Listen-Aufruf Ihrer Anwendung auf eine gleiche oder eine höhere Ganzzahl ändern.txqueuelen
Parameter Ihrer Ethernet-Karten spielen ebenfalls eine Rolle. Die Standardwerte sind 1000. Erhöhen Sie sie also auf 5000 oder sogar mehr, wenn Ihr System damit umgehen kann.Erhöhen Sie in ähnlicher Weise die Werte für
net.core.netdev_max_backlog
undnet.ipv4.tcp_max_syn_backlog
. Ihre Standardwerte sind 1000 bzw. 1024.Denken Sie jetzt daran, sowohl Ihre clientseitigen als auch Ihre serverseitigen Anwendungen zu starten, indem Sie die FD-Grenzen in der Shell erhöhen.
Neben der oben genannten ist eine weitere beliebte Technik, die von Programmierern verwendet wird, die Anzahl der TCP-Schreibaufrufe zu reduzieren . Ich bevorzuge es, einen Puffer zu verwenden, in dem ich die Daten, die ich an den Client senden möchte, weitergebe und dann an geeigneten Stellen die gepufferten Daten in den eigentlichen Socket schreibe. Diese Technik ermöglicht es mir, große Datenpakete zu verwenden, die Fragmentierung zu reduzieren und die CPU-Auslastung sowohl im Benutzerland als auch auf Kernelebene zu reduzieren.
quelle
(61000 - 32768) / 60 = 470 sockets per second
. Können Sie das bitte näher erläutern?Es gibt einige Variablen, um die maximale Anzahl von Verbindungen festzulegen. Höchstwahrscheinlich gehen Ihnen zuerst die Dateinummern aus. Überprüfen Sie ulimit -n. Danach gibt es Einstellungen in / proc, aber diese sind standardmäßig Zehntausende.
Noch wichtiger ist, dass Sie etwas falsch machen. Eine einzelne TCP-Verbindung sollte in der Lage sein, die gesamte Bandbreite zwischen zwei Parteien zu nutzen. wenn nicht:
ping -s 1472
...)tc
iperf
Möglicherweise habe ich falsch verstanden. Vielleicht machst du so etwas wie Bittorrent, wo du viele Verbindungen brauchst. In diesem Fall müssen Sie herausfinden, wie viele Verbindungen Sie tatsächlich verwenden (versuchen Sie es
netstat
oderlsof
). Wenn diese Zahl erheblich ist, können Sie:ulimit -n
. Trotzdem sind ~ 1000 Verbindungen (Standard auf meinem System) ziemlich viele.iostat -x
?Wenn Sie einen NAT-Router für Endverbraucher (Linksys, Netgear, DLink usw.) verwenden, achten Sie darauf, dass Sie dessen Fähigkeiten mit Tausenden von Verbindungen möglicherweise überschreiten.
Ich hoffe das hilft. Sie stellen wirklich eine Netzwerkfrage.
quelle
Um die Antwort von derobert zu verbessern,
Sie können das Verbindungslimit Ihres Betriebssystems bestimmen, indem Sie nf_conntrack_max catten.
Zum Beispiel: cat / proc / sys / net / netfilter / nf_conntrack_max
Mit dem folgenden Skript können Sie die Anzahl der TCP-Verbindungen zu einem bestimmten Bereich von TCP-Ports zählen. Standardmäßig 1-65535.
Dadurch wird bestätigt, ob Sie Ihr Betriebssystemverbindungslimit voll ausschöpfen.
Hier ist das Skript.
quelle
which awk
ist dein Freund, um den Weg zu awk zu bestimmen, SunOS hat auch einen Link dazu :)which
das ProgrammPATH
verwenden,awk
anstatt den vollständigen Pfad anzugeben. (Das heißt, ich bin nicht sicher, ob die Lösung im Skript der Perfektion näher kommt, aber darum geht es im Skript nicht).awk
Standort zu bestimmen , gehe aber davon aus, dass die Shell immer ist/bin/bash
(Pro-Tipp: AIX5 / 6 hat standardmäßig nicht einmal Bash).awk
Erkennung nützlich? Persönlich würde ich einfach annehmen , um ein korrektes habePATH
aber eine vernünftige Alternative könnte sein ,/usr/bin/env awk
und/usr/bin/env bash
jeweils. Für das, was es wert ist, hat es den falschen Speicherort auf meinem Linux-System. Es ist/usr/bin/awk
nicht in/bin/awk
In einer Anwendungsebene kann ein Entwickler Folgendes tun:
Von der Serverseite:
Überprüfen Sie, ob der Load Balancer (falls vorhanden) ordnungsgemäß funktioniert.
Verwandeln Sie langsame TCP-Zeitüberschreitungen in 503 Fast Immediate-Antwort. Wenn Sie den Load Balancer ordnungsgemäß ausführen, sollte er die zu bedienende Arbeitsressource auswählen und ist besser, als dort mit unerwarteten Fehlermassagen zu hängen.
Beispiel: Wenn Sie einen Knotenserver verwenden, können Sie ab npm toobusy verwenden. Implementierung so etwas wie:
Warum 503? Hier sind einige gute Erkenntnisse zur Überlastung: http://ferd.ca/queues-don-t-fix-overload.html
Wir können auch auf Kundenseite arbeiten:
Versuchen Sie, Anrufe im Stapel zu gruppieren, den Datenverkehr und die Gesamtzahl der Anfragen zwischen Client und Server zu reduzieren.
Versuchen Sie, einen Cache in der Mitte der Ebene zu erstellen, um unnötige doppelte Anforderungen zu verarbeiten.
quelle