14 votes

Linux : longueur de la file d'attente d'écoute netstat

Y a-t-il un moyen de voir la longueur de la file d'attente sur la prise d'écoute sous Linux, de la même manière que la commande netstat -L le fait pour FreeBSD ? C'est-à-dire que vous pouvez voir X/Y/Z dans la sortie de netstat -L, mais netstat sous Linux ne prend pas en charge le drapeau -L.

17voto

jamie Points 1

Jetons un coup d'œil au code source, car c'est la meilleure documentation dans le monde de l'open source.

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;
}

La même chose que l'on peut voir dans les sockets de domaine Unix, 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);
}

Donc.

Si la socket est établie, Recv-Q et Send-Q signifient des octets comme décrit dans la documentation.
Si la socket est en écoute, Recv-Q signifie la taille actuelle de la file d'attente, et Send-Q signifie le backlog configuré.

Aller plus loin dans les mans nous donne ce qui suit dans sock_diag(7):

      UDIAG_SHOW_RQLEN
             L'attribut rapporté en réponse à cette demande est
             UNIX_DIAG_RQLEN.  La charge associée à cet attribut est représentée dans la structure suivante :

                 struct unix_diag_rqlen {
                     __u32 udiag_rqueue;
                     __u32 udiag_wqueue;
                 };

             Les champs de cette structure sont les suivants :

             udiag_rqueue
                    Pour les sockets en écoute : le nombre de connexions en attente. La longueur du tableau associé à l'attribut de réponse UNIX_DIAG_ICONS est
                    égal à cette valeur.

                    Pour les sockets établies : la quantité de données dans la file d'attente entrante.

             udiag_wqueue
                    Pour les sockets en écoute : la longueur de la file d'attente qui
                    est égale à la valeur passée comme deuxième argument à listen(2).

                    Pour les sockets établies : la quantité de mémoire
                    disponible pour l'envoi.

En d'autres termes, ss -ln est la seule commande dont vous avez besoin

14voto

user138468 Points 163

ss -l montre la bonne valeur de Recv-Q Send-Q.

2voto

Pavel Timofeev Points 29

Je ne connais pas de moyen simple de voir cela sur Linux. Recv-Q et Send-Q ne sont pas des files d'attente d'écoute. Ils représentent le nombre d'octets non copiés par le programme utilisateur connecté au socket et non encore accusés par l'hôte distant (voir man netstat). Ils concernent donc les connexions établies. La file d'écoute (acceptation) est l'endroit où le noyau stocke les nouvelles connexions entrantes jusqu'à ce que votre application appelle la fonction accept().

1voto

quanta Points 49664

awk peut vous aider :

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

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

0voto

cherusk Points 21

En plus de ss (iproute classique), il y a ss2 (pyroute) pour le faire.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X