Frage Was begrenzt die maximale Anzahl von Verbindungen auf einem Linux-Server?


Welcher Kernel-Parameter oder andere Einstellungen steuern die maximale Anzahl von TCP-Sockets, die auf einem Linux-Server geöffnet werden können? Was sind die Kompromisse, mehr Verbindungen zuzulassen?

Ich habe beim Laden einen Apache Server mit getestet ab dass es sehr einfach ist, die offenen Verbindungen auf dem Server zu maximieren. Wenn Sie die Option ab's -k, die die Wiederverwendung von Verbindungen erlaubt, abbrechen und mehr als 10.000 Anfragen senden, dann bedient Apache die ersten 11.000 Anfragen und hält dann 60 Sekunden lang an. Ein Blick auf die Netstat-Ausgabe zeigt 11.000 Verbindungen im Zustand TIME_WAIT. Offensichtlich ist das normal. Verbindungen bleiben standardmäßig 60 Sekunden geöffnet, selbst nachdem der Client mit ihnen fertig ist TCP-Zuverlässigkeitsgründe.

Es scheint, als wäre dies ein einfacher Weg, um einen Server zu betreiben und ich frage mich, was die üblichen Einstellungen und Vorsichtsmaßnahmen dafür sind.

Hier ist meine Testausgabe:

# ab -c 5 -n 50000 http://localhost/
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)
Completed 5000 requests
Completed 10000 requests
apr_poll: The timeout specified has expired (70007)
Total of 11655 requests completed

Hier ist der Netstat-Befehl, den ich während des Tests ausführe:

 # netstat --inet -p | grep "localhost:www" | sed -e 's/ \+/ /g' | cut -d' ' -f 1-4,6-7 | sort | uniq -c 
  11651 tcp 0 0 localhost:www TIME_WAIT -
      1 tcp 0 1 localhost:44423 SYN_SENT 7831/ab
      1 tcp 0 1 localhost:44424 SYN_SENT 7831/ab
      1 tcp 0 1 localhost:44425 SYN_SENT 7831/ab
      1 tcp 0 1 localhost:44426 SYN_SENT 7831/ab
      1 tcp 0 1 localhost:44428 SYN_SENT 7831/ab

85
2018-05-21 16:18


Ursprung




Antworten:


Ich fand schließlich die Einstellung, die die Anzahl der Verbindungen wirklich einschränkte: net.ipv4.netfilter.ip_conntrack_max. Dies wurde auf 11.776 gesetzt und was ich auch immer vorschlage, ist die Anzahl der Anfragen, die ich in meinem Test erfüllen kann, bevor ich warten muss tcp_fin_timeout Sekunden, um weitere Verbindungen verfügbar zu machen. Das conntrack Tabelle ist, was der Kernel verwendet, um den Status von Verbindungen zu verfolgen. Wenn der Kernel also voll ist, beginnt er, Pakete zu löschen und diese im Protokoll auszudrucken:

Jun  2 20:39:14 XXXX-XXX kernel: ip_conntrack: table full, dropping packet.

Der nächste Schritt bestand darin, den Kernel dazu zu bringen, alle diese Verbindungen in der TIME_WAIT Zustand statt Pakete fallen zu lassen. Ich könnte das entweder durch Einschalten erreichen tcp_tw_recycle oder steigend ip_conntrack_max größer sein als die Anzahl der lokalen Ports, die für Verbindungen zur Verfügung gestellt werden ip_local_port_range. Ich nehme an, sobald der Kernel keine lokalen Ports mehr hat, beginnt er mit dem Recycling von Verbindungen. Dies verwendet mehr Speicherverfolgungsverbindungen, aber es scheint die bessere Lösung zu sein als das Einschalten tcp_tw_recycle weil die Docs andeuten, dass das gefährlich ist.

Mit dieser Konfiguration kann ich den ganzen Tag ablaufen und habe nie die Verbindung verloren.

net.ipv4.netfilter.ip_conntrack_max = 32768
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_tw_reuse = 0
net.ipv4.tcp_orphan_retries = 1
net.ipv4.tcp_fin_timeout = 25
net.ipv4.tcp_max_orphans = 8192
net.ipv4.ip_local_port_range = 32768    61000

Das tcp_max_orphans Einstellung hatte keinen Einfluss auf meine Tests und ich weiß nicht warum. Ich würde denken, dass es die Verbindungen in schließen würde TIME_WAIT Staat einmal, es waren 8192 von ihnen, aber es tut das nicht für mich.


62
2018-06-03 16:02



Wo konfigurieren wir diese Parameter? - Codevalley
@Codevalley Das kann systemabhängig sein, aber auf Ubuntu Server gehen sie in /etc/sysctl.conf - Ben Williams


Sie möchten wirklich sehen, was das / proc-Dateisystem Ihnen in dieser Hinsicht zu bieten hat.

Auf dieser letzten Seite finden Sie möglicherweise Folgendes für Sie interessant:

  • / proc / sys / net / ipv4 / tcp_max_orphans, die die maximale Anzahl der vom System gehaltenen Sockets steuert nicht an etwas befestigt. Dies zu erhöhen, kann bis zu 64 KByte nicht auslagerbaren Speicher verbrauchen per verwaistem Sockel.
  • / proc / sys / net / ipv4 / tcp_orphan_retries, die die Anzahl der Wiederholungen steuert, bevor ein Socket verwaist und geschlossen wird. Es gibt einen speziellen Hinweis auf dieser Seite über Webserver, der für Sie von direktem Interesse ist ...

23
2018-05-21 18:15



tcp_max_orphans ist interessant, aber es scheint, dass es nicht funktioniert. Wenn ich versuche, verwaiste Steckdosen während meines Tests zu messen, sehe ich 11.651 davon, während tcp_max_orphans 8.092 ist. # netstat --inet -p | grep "localhost: www" | sed -e 's / \ + / / g' | geschnitten -d '' -f 1-4,6-7 | sortieren | uniq -c 11651 tcp 0 0 localhost: www TIME_WAIT - - Ben Williams
Sehen Sie sich die Einstellung tcp_orphan_retries an - die Idee ist, dass die Steckdosen schneller "geklaut" werden ... - Avery Payne
@Jauder Hos Vorschlag + tcp_orphan_retries klingen nach einem möglichen Gewinn für Ihre Situation. - Avery Payne


Ich denke nicht, dass es einen Einstellbaren gibt, der das direkt einstellen kann. Dies fällt unter die Kategorie der TCP / IP-Abstimmung. Um herauszufinden, was Sie einstellen können, versuchen Sie 'man 7 tcp'. Die sysctl ('man 8 sysctl') wird verwendet, um diese zu setzen. 'sysctl -a | grep tcp 'wird Ihnen das meiste zeigen, was Sie tun können, aber ich bin mir nicht sicher, ob es alle anzeigen wird. Sofern sich dies nicht geändert hat, öffnen sich TCP / IP-Sockets wie Dateideskriptoren. So diese und der nächste Abschnitt in diesem Link könnte das sein, wonach Sie suchen.


3
2018-05-21 17:31





Versuchen Sie, Folgendes zu setzen und tcp_fin_timeout zu setzen. Dies sollte TIME_WAIT schneller beenden.

net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1

2
2018-05-21 19:38



Vorsicht hier! Erlebt den harten Weg. "Dies kann dazu führen, dass Frames mit Load-Balancing und NATs verloren gehen. Verwenden Sie diese nur für einen Server, der nur über Ihr lokales Netzwerk kommuniziert." - wiki.archlinux.org/index.php/Sysctl - Henk
@Henk Ich denke es ist tcp_tw_recycle das ist potentiell gefährlich. tcp_tw_reuse ist sicherer und ich sehe keinen Grund, sie gleichzeitig zu benutzen. - Vladislav Rastrusny


Der Standard-Apache (1) war vordefiniert, um nur 250 gleichzeitige Verbindungen zu unterstützen - wenn Sie mehr wollten, gab es eine Header-Datei, die geändert werden musste, um mehr gleichzeitige Sitzungen zu ermöglichen. Ich weiß nicht, ob das bei Apache 2 immer noch stimmt.

Außerdem müssen Sie eine Option hinzufügen, um mehr offene Dateideskriptoren für das Konto zuzulassen, das Apache ausführt - etwas, auf das die vorherigen Kommentare nicht hinweisen.

Achten Sie auf Ihre Mitarbeitereinstellungen und welche Art von Keepalive Timeouts Sie in Apache selbst haben, wie viele Ersatzserver Sie auf einmal laufen haben und wie schnell diese zusätzlichen Prozesse beendet werden.


2
2018-05-21 21:21





Sie könnten die Zeit im Status TIME_WAIT reduzieren (Set net.ipv4.tcp_fin_timeout). Sie könnten Apache durch YAWS oder nginx oder etwas Ähnliches ersetzen.

Kompromisse bei mehr Verbindungen sind in der Regel mit Speicherauslastung verbunden, und wenn Sie einen Forking-Prozess haben, viele untergeordnete Prozesse, die Ihre CPU überschwemmen.


1
2018-05-21 16:26



tcp_fin_timeout dient nicht zum Einstellen des Ablaufs von TIME-WAIT, der außerhalb des Neubaus des Kernels nicht geändert werden kann, sondern für FIN, wie der Name angibt. - Alexandr Kurilin


Die absolute Anzahl von Sockets, die für eine einzelne IP-Adresse geöffnet werden können, ist 2 ^ 16 und wird von TCP / UDP und nicht vom Kernel definiert.


0
2018-05-30 16:42



Nein ist es nicht. Sie können mehr öffnen, da der lokale Port nicht eindeutig sein muss, solange die Remote-Adressen unterschiedlich sind. Außerdem sagt das OP pro Server, und Sie können> 1 Adresse pro Server haben. - MarkR