Lösung 1:
Ich habe endlich die Einstellung gefunden, die die Anzahl der Verbindungen wirklich begrenzt hat:net.ipv4.netfilter.ip_conntrack_max
. Dies wurde auf 11.776 festgelegt, und auf was auch immer ich es eingestellt habe, ist die Anzahl der Anfragen, die ich in meinem Test bedienen kann, bevor ich tcp_fin_timeout
warten muss Sekunden, bis weitere Verbindungen verfügbar sind. Die conntrack
table ist das, was der Kernel verwendet, um den Status von Verbindungen zu verfolgen, sobald sie also voll ist, beginnt der Kernel, Pakete zu verwerfen und dies im Protokoll auszugeben:
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, all diese Verbindungen in TIME_WAIT
zu recyceln Status, anstatt Pakete zu verwerfen. Ich könnte das erreichen, indem ich entweder tcp_tw_recycle
einschalte oder ip_conntrack_max
erhöhen größer sein als die Anzahl der lokalen Ports, die von ip_local_port_range
für Verbindungen zur Verfügung gestellt werden . Ich denke, sobald der Kernel keine lokalen Ports mehr hat, beginnt er, Verbindungen zu recyceln. Dies verwendet mehr Speicherverfolgungsverbindungen, scheint aber die bessere Lösung zu sein, als tcp_tw_recycle
einzuschalten da die Dokumente implizieren, dass dies gefährlich ist.
Mit dieser Konfiguration kann ich den ganzen Tag laufen und mir gehen nie die Verbindungen aus:
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
Die tcp_max_orphans
Die Einstellung hatte keine Auswirkung auf meine Tests und ich weiß nicht warum. Ich würde denken, es würde die Verbindungen in TIME_WAIT
schließen Stellen Sie fest, dass es einmal 8192 von ihnen gab, aber das tut es für mich nicht.
Lösung 2:
Sie sollten sich wirklich ansehen, was das /proc-Dateisystem Ihnen in dieser Hinsicht zu bieten hat.
- TCP-Tuning-Leitfaden des US-Energieministeriums
- TCP-Tuning-Parameter für verschiedene Betriebssysteme
- IBMs "Linux on the fly verwalten"
- Dokumentation auf LinuxInsight.com gegenüber /proc/sys/net/ipv4
Auf dieser letzten Seite könnte Folgendes für Sie interessant sein:
- /proc/sys/net/ipv4/tcp_max_orphans, das die maximale Anzahl von Sockets steuert, die vom System nicht gehalten werden an etwas gebunden. Wenn Sie dies erhöhen, können bis zu 64 KB nicht austauschbarer Speicher pro verwaistem Socket verbraucht werden .
- /proc/sys/net/ipv4/tcp_orphan_retries, das die Anzahl der Wiederholungen steuert, bevor ein Socket verwaist und geschlossen wird. Auf dieser Seite gibt es einen speziellen Hinweis zu Webservern, der für Sie von direktem Interesse ist...
Lösung 3:
Ich glaube nicht, dass es ein Tunable gibt, um das direkt einzustellen. Dies fällt unter die Kategorie TCP/IP-Tuning. Um herauszufinden, was Sie einstellen können, versuchen Sie es mit „man 7 tcp“. Das sysctl ( 'man 8 sysctl' ) wird verwendet, um diese zu setzen. 'sysctl -a | grep tcp' zeigt Ihnen das meiste, was Sie tunen können, aber ich bin mir nicht sicher, ob es alle zeigen wird. Sofern sich dies nicht geändert hat, sehen geöffnete TCP/IP-Sockets wie Dateideskriptoren aus. Dieser und der nächste Abschnitt in diesem Link könnten also genau das sein, wonach Sie suchen.
Lösung 4:
Versuchen Sie, Folgendes einzustellen, und setzen Sie auch tcp_fin_timeout. Dies sollte TIME_WAIT schneller abschließen.
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
Lösung 5:
Der Standard-Apache(1) war früher so vordefiniert, dass er nur 250 gleichzeitige Verbindungen unterstützte - wenn Sie mehr wollten, musste eine Header-Datei geändert werden, um mehr gleichzeitige Sitzungen zu ermöglichen. Ich weiß nicht, ob das bei Apache 2 noch so ist.
Außerdem müssen Sie eine Option hinzufügen, um viele weitere offene Dateideskriptoren für das Konto zuzulassen, das Apache ausführt - etwas, auf das die vorherigen Kommentare nicht hinweisen.
Achten Sie auf Ihre Worker-Einstellungen und welche Art von Keepalive-Timeouts Sie in Apache selbst haben, wie viele Ersatzserver Sie gleichzeitig ausführen und wie schnell diese zusätzlichen Prozesse beendet werden.