Ich habe eine Hypothese: Manchmal kommen TCP-Verbindungen schneller an, als mein Server es kann accept()
. Sie stehen in der Warteschlange, bis die Warteschlange überläuft, und dann gibt es Probleme.
Wie kann ich bestätigen, dass dies geschieht?
Kann ich die Länge der Akzeptanzwarteschlange oder die Anzahl der Überläufe überwachen? Gibt es irgendwo einen Zähler?
linux
networking
monitoring
Phil Frost
quelle
quelle
netstat
.netstat
nur die Sende- und Empfangswarteschlangenlängen angezeigt, die nicht mit der Akzeptanzwarteschlange übereinstimmen.man netstat | less +/Flags
netstat
scheint sieFlags
für TCP-Verbindungen überhaupt nicht angezeigt zu werden . Nach einigem Testen sieht es so aus, als würden die Verbindungen wieESTABLISHED
in angezeigtnetstat
, auch wenn ich versuche, Verbindungen zu einem Prozess zu öffnen, der dies tut,listen()
aber niemalsaccept()
.SYN_RECV
. Darüber hinaus gibt es keine andere Warteschlange. Ich nehme an, der Kernel kann aufgrund zu vieler halb offener Verbindungen irgendwie angewiesen werden, verworfene Pakete zu protokollieren, aber es sind mehr als 10 Jahre vergangen, seit ich mich mit der Vernetzung mit Linux befasst habe, daher habe ich keine Ahnung, wie das geht. Nebenbei bemerkt: Sie warten nicht daraufaccept()
, dass die AufgabeACK
erledigt wird, sondern darauf , dass s von den Verbindungshosts eintreffen, um die Verbindungen herzustellen.Antworten:
Sysdig wird einige dieser Informationen am Ende jedes
accept
Systemaufrufs alsqueuelen
Argument bereitstellen . Es zeigt auch die Länge der Warteschlange alsqueuemax
.Soweit mir bekannt ist, bietet es keinen Mechanismus, um genau zu wissen, wann oder wie oft die Warteschlange übergelaufen ist. Und es wäre umständlich, dies in eine regelmäßige Überwachung durch
collectd
oder ähnliches zu integrieren .quelle
Um zu überprüfen, ob Ihre Warteschlange überfüllt ist, verwenden Sie entweder netstat oder nstat
Referenz: https://perfchron.com/2015/12/26/investigating-linux-network-issues-with-netstat-and-nstat/
Verwenden Sie zum Überwachen Ihrer Warteschlangengrößen den Befehl ss und suchen Sie nach SYN-RECV-Sockets.
Referenz: https://blog.cloudflare.com/syn-packet-handling-in-the-wild/
quelle
Was Sie suchen, ist der Eintrag in der Ausgabe des Befehls sysctl -a als solcher :::
net.ipv4.tcp_max_sync_backlog = 4096
Im obigen Beispiel beträgt der Rückstand an SYN-Statusverbindungen maximal 4096. Sie können diesen Wert erhöhen, je nachdem, wie viel RAM sich auf Ihrem Server befindet. Ich halte 32K-Backlog für einen guten Start für die Optimierung stark ausgelasteter Webserver.
Stellen Sie außerdem sicher, dass Folgendes NICHT auf Eins (1) gesetzt ist ::
net.ipv4.tcp_abort_on_overflow = 0
Andernfalls werden Pakete definitiv verworfen, wenn ein Rückstandsüberlauf vorliegt.
Sie können einfach über überprüfen
"sysctl -a | egrep backlog"
"sysctl -a | egrep overflow"
Darüber hinaus finden Sie das Etikett "fallen gelassen" unter
"ifconfig -a"
Befehlsausgabe. Das zeigt, wie viele Pakete für jede Schnittstelle zusammen mit anderen Daten und Fehlern usw. verworfen wurden.
Für die Protokollierung verworfener Pakete gibt es einen Paywall-Artikel zu RHEL 7 ::.
https://access.redhat.com/solutions/1191593
Für weitere Recherchen können Sie lesen:
http://veithen.io/2014/01/01/how-tcp-backlog-works-in-linux.html
Hier heißt es gemäß Steven's Book Illustrated TCP / IP:
"Das Warteschlangenlimit gilt für die Summe aus […] der Anzahl der Einträge in der unvollständigen Verbindungswarteschlange […] und […] der Anzahl der Einträge in der abgeschlossenen Verbindungswarteschlange […]."
Daher heißt es auch:
"Die Warteschlange für abgeschlossene Verbindungen ist fast immer leer, da beim Einfügen eines Eintrags in diese Warteschlange der Aufruf des Servers zur Annahme zurückgegeben wird und der Server die abgeschlossene Verbindung aus der Warteschlange entfernt."
Die Akzeptanzwarteschlange scheint daher völlig leer zu sein, und Sie müssen Ihren (möglicherweise in diesem Fall) Web-Apache-Server optimieren, um die Verbindungen in der Warteschlange "Gesamtaggregat" schneller zu akzeptieren.
quelle