Linux: Länge der Netstat-Warteschlange


8

Gibt es eine Möglichkeit, die Warteschlangenlänge am Listening-Socket unter Linux genauso anzuzeigen wie die netstat -LAusgaben für FreeBSD? Dh Sie können X / Y / Z in der netstat -LAusgabe sehen, aber netstat unter Linux unterstützt kein -LFlag.

Antworten:



8

Schauen wir uns den Quellcode an, da er die beste Dokumentation in der Welt von Open Source ist.

net / ipv4 / tcp_diag.c:

if (sk->sk_state == TCP_LISTEN) {
    r->idiag_rqueue = sk->sk_ack_backlog;
    r->idiag_wqueue = sk->sk_max_ack_backlog;
} else {
    r->idiag_rqueue = max_t(int, tp->rcv_nxt - tp->copied_seq, 0);
    r->idiag_wqueue = tp->write_seq - tp->snd_una;
}

Dasselbe sehen wir in Unix-Domain-Sockets, net / unix / diag.c:

if (sk->sk_state == TCP_LISTEN) {
    rql.udiag_rqueue = sk->sk_receive_queue.qlen;
    rql.udiag_wqueue = sk->sk_max_ack_backlog;
} else {
    rql.udiag_rqueue = (u32) unix_inq_len(sk);
    rql.udiag_wqueue = (u32) unix_outq_len(sk);
}

Damit.

Wenn ein Socket eingerichtet ist, bedeuten Recv-Q und Send-Q Bytes, wie in der Dokumentation beschrieben.
Wenn der Socket lauscht, bedeutet Recv-Q die aktuelle Warteschlangengröße und Send-Q das konfigurierte Backlog.

Wenn wir tiefer in den Menschen vordringen , folgen wir in sock_diag (7) :

      UDIAG_SHOW_RQLEN
             The attribute reported in answer to this request is
             UNIX_DIAG_RQLEN.  The payload associated with this
             attribute is represented in the following structure:

                 struct unix_diag_rqlen {
                     __u32 udiag_rqueue;
                     __u32 udiag_wqueue;
                 };

             The fields of this structure are as follows:

             udiag_rqueue
                    For listening sockets: the number of pending
                    connections.  The length of the array associated
                    with the UNIX_DIAG_ICONS response attribute is
                    equal to this value.

                    For established sockets: the amount of data in
                    incoming queue.

             udiag_wqueue
                    For listening sockets: the backlog length which
                    equals to the value passed as the second argu‐
                    ment to listen(2).

                    For established sockets: the amount of memory
                    available for sending.

Mit anderen Worten, ss -lnist der einzige Befehl, den Sie benötigen


Danke für die ausführlichen Informationen, Alexander! Nur eine kurze Ergänzung: udiag_wqueueKann sich von dem Wert unterscheiden, an den Sie übergeben haben, listen(2)wenn er /proc/sys/net/core/somaxconnkleiner als der im Syscall festgelegte Backlog-Wert ist. Das liegt daran, dass Linux den Wert begrenzt: elixir.bootlin.com/linux/v4.15/source/net/socket.c#L1479
Ciro Costa

2

Soweit ich weiß, gibt es unter Linux keine einfache Möglichkeit, dies zu erkennen. Recv-Q und Send-Q sind keine Abhörwarteschlange. Dies ist die Anzahl der Bytes, die von dem an den Socket angeschlossenen Benutzerprogramm nicht kopiert und vom Remote-Host nicht bestätigt wurden (siehe man netstat). Es geht also um etablierte Verbindungen. Die Listen-Warteschlange (Akzeptieren) ist ein Ort, an dem der Kernel neue eingehende Verbindungen beibehält, bis Ihre Anwendung accept () aufruft.


Entschuldigung, ich war nicht ganz richtig. netstat und ss auf neuen Linux-Distributionen zeigen unterschiedliche Werte wie Recv-Q- und Send-Q-Werte an, je nachdem, ob eine Verbindung hergestellt oder ein Listening-Socket hergestellt wurde. Dies ist aus CentOS 7.4: Recv-Q Established: Die Anzahl der Bytes, die von dem an diesen Socket angeschlossenen Anwenderprogramm nicht kopiert wurden. Abhören: Seit Kernel 2.6.18 enthält diese Spalte das aktuelle Syn-Backlog. Send-Q Established: Die Anzahl der Bytes, die vom Remote-Host nicht bestätigt wurden. Abhören: Seit Kernel 2.6.18 enthält diese Spalte die maximale Größe des Syn-Backlogs.
Pavel Timofeev

Auf meinem CentOS 7.4 zeigt jedoch nur ss den korrekten Send-Q-Wert (dh Backlog, Listen / Accept Queue) für den Listening-Socket an, Netstat jedoch nicht
Pavel Timofeev

1

awk kann helfen:

netstat -ntp | awk '{ if ($6 == "ESTABLISHED" && $7 == "-") arrQueue[$4] += 1; } END { for (service in arrQueue) print service" "arrQueue[service] }'

Quelle: http://mysyslog.ru/posts/633


Danke für die Antwort. Tatsächlich zeigt ss -l das richtige Recv-Q Send-Q an, daher ist es schneller, dies nicht mit awk zu tun.
Artem G

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.