Kürzlich hatten wir einen Apache-Server, der aufgrund von SYN-Flooding sehr langsam reagierte. Die Problemumgehung bestand darin, tcp_syncookies ( net.ipv4.tcp_syncookies=1 in /etc/sysctl.conf
) zu aktivieren .
Ich habe hier eine Frage dazu gestellt , wenn Sie mehr Hintergrundinformationen benötigen.
Nachdem wir Syncookies aktiviert hatten, wurde ungefähr alle 60 Sekunden die folgende Meldung in / var / log / messages angezeigt:
[84440.731929] possible SYN flooding on port 80. Sending cookies.
Vinko Vrsalovic teilte mir mit, dass dies bedeutet, dass das Syn-Backlog voll wird. Deshalb habe ich tcp_max_syn_backlog auf 4096 angehoben. Irgendwann habe ich auch tcp_synack_retries auf 3 gesenkt (von der Standardeinstellung 5), indem ich ausgegeben habe sysctl -w net.ipv4.tcp_synack_retries=3
. Danach schien die Frequenz zu sinken, wobei das Intervall der Nachrichten zwischen ungefähr 60 und 180 Sekunden schwankte.
Als nächstes habe ich ausgestellt sysctl -w net.ipv4.tcp_max_syn_backlog=65536
, erhalte aber immer noch die Meldung im Protokoll.
Während des gesamten Vorgangs habe ich die Anzahl der Verbindungen im Status SYN_RECV überwacht (durch Ausführen watch --interval=5 'netstat -tuna |grep "SYN_RECV"|wc -l'
), und es wird nie höher als 240, viel viel niedriger als die Größe des Rückstands. Ich habe jedoch einen Red Hat-Server, der im Bereich von 512 liegt (auf diesem Server ist die Standardeinstellung 1024).
Gibt es andere TCP-Einstellungen, die die Größe des Rückstands begrenzen würden, oder belle ich den falschen Baum an? Sollte die Anzahl der SYN_RECV-Verbindungen netstat -tuna
mit der Größe des Backlogs korrelieren?
Aktualisieren
Wie ich am besten beurteilen kann, habe ich es hier mit legitimen Verbindungen zu tun. netstat -tuna|wc -l
Ich habe dies heute recherchiert und diesen Beitrag von einem last.fm-Mitarbeiter gefunden, was ziemlich nützlich war.
Ich habe auch festgestellt, dass das tcp_max_syn_backlog keine Auswirkung hat, wenn Syncookies aktiviert sind (siehe diesen Link ).
Als nächsten Schritt habe ich folgendes in sysctl.conf gesetzt:
net.ipv4.tcp_syn_retries = 3
# default=5
net.ipv4.tcp_synack_retries = 3
# default=5
net.ipv4.tcp_max_syn_backlog = 65536
# default=1024
net.core.wmem_max = 8388608
# default=124928
net.core.rmem_max = 8388608
# default=131071
net.core.somaxconn = 512
# default = 128
net.core.optmem_max = 81920
# default = 20480
Ich habe dann meinen Antwortzeittest eingerichtet, sysctl -p
Syncookies von ausgeführt und deaktiviert sysctl -w net.ipv4.tcp_syncookies=0
.
Danach blieb die Anzahl der Verbindungen im SYN_RECV-Status immer noch bei 220-250, aber die Verbindungen begannen sich erneut zu verzögern. Sobald ich diese Verzögerungen bemerkte, aktivierte ich Syncookies wieder und die Verzögerungen hörten auf.
Ich glaube, das, was ich sah, war immer noch eine Verbesserung gegenüber dem ursprünglichen Zustand, aber einige Anfragen wurden immer noch verzögert, was viel schlimmer ist, als wenn Syncookies aktiviert sind. Es sieht also so aus, als ob ich nicht weiterkomme, bis wir mehr Server online haben, um mit der Last fertig zu werden. Selbst dann sehe ich keinen gültigen Grund, sie wieder zu deaktivieren, da sie (anscheinend) nur gesendet werden, wenn die Puffer des Servers voll sind.
Das Syn-Backlog scheint jedoch nicht mit nur ~ 250 Verbindungen im SYN_RECV-Status voll zu sein! Ist es möglich, dass die SYN-Flutnachricht ein roter Hering ist und sich etwas anderes als das syn_backlog füllt?
Wenn jemand andere Optimierungsoptionen hat, die ich noch nicht ausprobiert habe, würde ich sie gerne ausprobieren, aber ich frage mich, ob die syn_backlog-Einstellung aus irgendeinem Grund nicht richtig angewendet wird.