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 dentcp_fin_timeout
So ermitteln Sie die Standardwerte:
sysctl net.ipv4.ip_local_port_range
sysctl net.ipv4.tcp_fin_timeout
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 im TIME_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 beginnen port_range
. Das Einstellen des Bereichs 15000 61000
ist heutzutage ziemlich üblich. Sie können die Verfügbarkeit weiter erhöhen, indem Sie die verringern fin_timeout
. Angenommen, Sie tun beides, und Sie sollten leichter mehr als 1500 ausgehende Verbindungen pro Sekunde sehen.
So ändern Sie die Werte :
sysctl net.ipv4.ip_local_port_range="15000 61000"
sysctl net.ipv4.tcp_fin_timeout=30
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ären
net.ipv4.tcp_tw_recycle=0
net.ipv4.tcp_tw_reuse=0
Diese erlauben keine Verbindung von einem "gebrauchten" Socket (im Wartezustand) und zwingen die Sockets, den gesamten time_wait
Zyklus zu dauern . Ich empfehle die Einstellung:
sysctl net.ipv4.tcp_tw_recycle=1
sysctl net.ipv4.tcp_tw_reuse=1
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. Die net.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, dass net.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.
sysctl net.core.somaxconn=1024
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.
ifconfig eth0 txqueuelen 5000
echo "/sbin/ifconfig eth0 txqueuelen 5000" >> /etc/rc.local
Erhöhen Sie in ähnlicher Weise die Werte für net.core.netdev_max_backlog
und net.ipv4.tcp_max_syn_backlog
. Ihre Standardwerte sind 1000 bzw. 1024.
sysctl net.core.netdev_max_backlog=2000
sysctl net.ipv4.tcp_max_syn_backlog=2048
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.