Назад | Перейти на главную страницу

linux: длина очереди прослушивания netstat

Есть ли способ просмотреть длину очереди на прослушивающем сокете под Linux так же, как netstat -L выводы для FreeBSD? Т.е. вы можете видеть X / Y / Z в netstat -L вывод, но netstat под Linux не поддерживает -L флаг.

ss -l показывает правильный Recv-Q Send-Q.

Давайте посмотрим на исходный код, так как это лучшая документация в мире открытого кода.

сеть / 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;
}

То же самое мы видим в сокетах домена 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);
}

Так.

Если сокет установлен, Recv-Q и Send-Q означают байты, как описано в документации.
Если сокет прослушивает, Recv-Q означает текущий размер очереди, а Send-Q означает настроенное отставание.

Углубление в человека дает нам 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.

Другими словами, ss -ln это единственная команда, которая вам нужна

Насколько мне известно, нет простого способа увидеть это в Linux. Recv-Q и Send-Q не являются очередью прослушивания. Это количество байтов, не скопированных пользовательской программой, подключенной к сокету, и не подтвержденных удаленным хостом (см. Man netstat). Итак, они касаются установленных связей. Очередь прослушивания (приема) - это место, где ядро ​​сохраняет новые входящие соединения, пока ваше приложение не вызовет accept ().

awk может помочь:

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

Источник: http://mysyslog.ru/posts/633

Помимо ss (классический iproute) есть ss2 (pyroute) к настоящему времени сделать это.