Antworten:
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 -ln
ist der einzige Befehl, den Sie benötigen
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.
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
Zusätzlich zu ss (klassisches iproute) gibt es jetzt ss2 (pyroute), um dies zu tun.
udiag_wqueue
Kann sich von dem Wert unterscheiden, an den Sie übergeben haben,listen(2)
wenn er/proc/sys/net/core/somaxconn
kleiner 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