Wie kann ich die Länge der Akzeptanzwarteschlange überwachen?


8

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?


Du suchst netstat.
Satō Katsura

Soweit ich das beurteilen kann, werden netstatnur die Sende- und Empfangswarteschlangenlängen angezeigt, die nicht mit der Akzeptanzwarteschlange übereinstimmen.
Phil Frost

Ja, es wird standardmäßig nicht angezeigt. man netstat | less +/Flags
Satō Katsura

Ich bin mir nicht sicher, wie diese Flags mir die Länge der Akzeptanzwarteschlange mitteilen - tatsächlich netstatscheint sie Flagsfür TCP-Verbindungen überhaupt nicht angezeigt zu werden . Nach einigem Testen sieht es so aus, als würden die Verbindungen wie ESTABLISHEDin angezeigt netstat, auch wenn ich versuche, Verbindungen zu einem Prozess zu öffnen, der dies tut, listen()aber niemals accept().
Phil Frost

Wenn man sich die Quellen ansieht, scheint es, dass diese Flags für UNIX-Sockets sind. Für TCP konnte man aber einfach zählen 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 darauf accept(), dass die Aufgabe ACKerledigt wird, sondern darauf , dass s von den Verbindungshosts eintreffen, um die Verbindungen herzustellen.
Satō Katsura

Antworten:


1

Sysdig wird einige dieser Informationen am Ende jedes acceptSystemaufrufs als queuelenArgument bereitstellen . Es zeigt auch die Länge der Warteschlange als queuemax.

7598971 21:05:30.322229280 1 gunicorn (6451) < accept fd=13(<4t>127.0.0.1:45882->127.0.0.1:8003) tuple=127.0.0.1:45882->127.0.0.1:8003 queuepct=0 queuelen=0 queuemax=10

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 collectdoder ähnliches zu integrieren .


1

Um zu überprüfen, ob Ihre Warteschlange überfüllt ist, verwenden Sie entweder netstat oder nstat

[centos ~]$ nstat -az | grep -i listen
TcpExtListenOverflows           3518352            0.0
TcpExtListenDrops               3518388            0.0
TcpExtTCPFastOpenListenOverflow 0  0.0

[centos ~]$ netstat -s | grep -i LISTEN
    3518352 times the listen queue of a socket overflowed
    3518388 SYNs to LISTEN sockets dropped

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.

$ ss -n state syn-recv sport = :80 | wc -l
119

Referenz: https://blog.cloudflare.com/syn-packet-handling-in-the-wild/


0

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.


Obwohl es hier einige nützliche Informationen zu geben scheint, bin ich mir nicht sicher, ob sie die Frage beantworten. Wenn ich frage: "Wie viele Personen waren jemals auf einmal in diesem Auditorium?" Und Sie auf ein Schild an der Wand zeigen, das die maximale Kapazität bietet, haben Sie die Frage nicht beantwortet.
Scott

In der Tat suche ich nach der aktuellen Länge der Warteschlange, nicht nach der maximalen Länge der Warteschlange.
Phil Frost

2
Es sollte tcp_max_syn_backlog sein, nicht tcp_max_SYNC_backlog wie in Ihrer Antwort
DevilaN
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.