web-dev-qa-db-ja.com

linux:netstat待ち行列の長さ

Linuxでのリスニングソケットのキューの長さを表示する方法はありますか?FreeBSDのnetstat -L出力と同じ方法ですか?つまりX/Y/Zはnetstat -L出力で確認できますが、Linuxでのnetstatは-Lフラグをサポートしていません。

8
Artem G

ss -lは正しいRecv-Q Send-Qを示しています。

9
Artem G

それはオープンソースの世界で最高のドキュメントなので、ソースコードを見てみましょう。

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

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が必要な唯一のコマンドです

8
Alexander

私の知る限り、Linuxでそれを確認する簡単な方法はありません。 Recv-QとSend-Qは待機キューではありません。これらは、ソケットに接続されているユーザープログラムによってコピーされず、リモートホストによって確認されないバイト数です(man netstatを参照)。つまり、確立された接続についてです。待ち受け(受け入れ)キューは、アプリケーションがaccept()を呼び出すまでカーネルが新しい着信接続を保持する場所です。

2
Pavel Timofeev

awkが役立ちます:

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

ソース: http://mysyslog.ru/posts/6

1
quanta

Ss(classical iproute)に加えて、これまでに ss2(pyroute) があります。

0
cherusk