Welche Kernelparameter oder andere Einstellungen steuern die maximale Anzahl von TCP-Sockets, die auf einem Linux-Server geöffnet sein können? Was sind die Kompromisse, wenn mehr Verbindungen zugelassen werden?
Beim Auslastungstest eines Apache-Servers mit ab ist mir aufgefallen, dass es ziemlich einfach ist, die offenen Verbindungen auf dem Server zu maximieren. Wenn Sie die Option -k auslassen, die die Wiederverwendung der Verbindung ermöglicht, und mehr als 10.000 Anfragen senden, werden die ersten 11.000 Anfragen von Apache bearbeitet und 60 Sekunden lang angehalten. Ein Blick auf die netstat-Ausgabe zeigt 11.000 Verbindungen im Status TIME_WAIT. Anscheinend ist das normal. Aus Gründen der TCP-Zuverlässigkeit werden Verbindungen standardmäßig 60 Sekunden lang geöffnet gehalten, auch nachdem der Client sie beendet hat .
Es scheint, als wäre dies eine einfache Möglichkeit, einen Server zu tun, und ich frage mich, wie die üblichen Einstellungen und Vorsichtsmaßnahmen dafür aussehen.
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 Befehl netstat, 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
quelle
Sie möchten sich unbedingt ansehen, was das / proc-Dateisystem Ihnen in dieser Hinsicht zu bieten hat.
Auf dieser letzten Seite finden Sie möglicherweise Folgendes, das Sie interessiert:
quelle
Ich glaube nicht, dass es ein Tunable gibt, mit dem man das direkt einstellen kann. Dies fällt unter die Kategorie der TCP / IP-Optimierung. Um herauszufinden, was Sie tun können, probieren Sie 'man 7 tcp'. Mit dem sysctl ('man 8 sysctl') werden diese gesetzt. 'sysctl -a | grep tcp 'zeigt Ihnen das meiste, was Sie tun können, aber ich bin nicht sicher, ob es alle zeigen wird. Sofern sich dies nicht geändert hat, sehen die geöffneten TCP / IP-Sockets wie Dateideskriptoren aus. So dies und der nächste Abschnitt in dieser Verbindung könnte das sein , was Sie suchen.
quelle
Versuchen Sie, das Folgende sowie tcp_fin_timeout festzulegen. Dies sollte TIME_WAIT schneller schließen.
quelle
tcp_tw_recycle
das ist potenziell gefährlich.tcp_tw_reuse
ist sicherer und ich sehe keinen Grund, sie gleichzeitig zu verwenden.Der Standard-Apache (1) wurde vordefiniert, um nur 250 gleichzeitige Verbindungen zu unterstützen. Wenn Sie mehr wollten, musste eine Header-Datei geändert werden, um mehr gleichzeitige Sitzungen zu ermöglichen. Ich weiß nicht, ob dies bei Apache 2 immer noch zutrifft.
Außerdem müssen Sie eine Option hinzufügen, mit der für das Konto, auf dem Apache ausgeführt wird, eine Vielzahl offener Dateideskriptoren zugelassen werden. Dies wird in den vorherigen Kommentaren nicht erwähnt.
Achten Sie auf Ihre Worker-Einstellungen und darauf, welche Art von Keepalive-Timeouts in Apache selbst auftreten, wie viele Ersatzserver auf einmal ausgeführt werden und wie schnell diese zusätzlichen Prozesse beendet werden.
quelle
Sie können die im Status TIME_WAIT verbrachte Zeit reduzieren (Net.ipv4.tcp_fin_timeout festlegen). Sie könnten Apache durch YAWS oder Nginx oder ähnliches ersetzen.
Kompromisse bei mehr Verbindungen sind im Allgemeinen mit der Speichernutzung verbunden, und wenn Sie einen Verzweigungsprozess haben, überlasten viele untergeordnete Prozesse Ihre CPU.
quelle
Die absolute Anzahl von Sockets, die für eine einzelne IP-Adresse geöffnet sein können, beträgt 2 ^ 16 und wird von TCP / UDP definiert, nicht vom Kernel.
quelle
Das Apache HTTP-Server-Benchmarking-Tool ab in Version 2.4 verfügt über die Timeout- Option -s . Siehe auch ab (Apache Bench) -Fehler: apr_poll: Das angegebene Zeitlimit ist unter Windows abgelaufen (70007) .
Diese Option löst Ihr Problem.
quelle