在/ proc / sockstat中,哪些TCP状态计为'inuse',哪些计为'alloc'?

问题描述 投票:1回答:1

例如,在/ proc / net / sockstat中,CLOSE_WAIT中的TCP套接字是否被计为“inuse”或“alloc”?

在内核源代码net / ipv4 / proc.c中,我看到从/ proc / net / sockstat获取信息时会调用sockstat_seq_show

但是,我无法看到套接字与分配(alloc)的区别在于“inuse”

[me@myhostname ~]$ cat /proc/net/sockstat
sockets: used 481
TCP: inuse 52 orphan 1 tw 66 alloc 62 mem 12
UDP: inuse 11 mem 5
UDPLITE: inuse 0
RAW: inuse 0
FRAG: inuse 0 memory 0

在net / tcp_states.h中,可能的状态被枚举为这样

enum {
    TCP_ESTABLISHED = 1,
    TCP_SYN_SENT,
    TCP_SYN_RECV,
    TCP_FIN_WAIT1,
    TCP_FIN_WAIT2,
    TCP_TIME_WAIT,
    TCP_CLOSE,
    TCP_CLOSE_WAIT,
    TCP_LAST_ACK,
    TCP_LISTEN,
    TCP_CLOSING,    /* Now a valid state */
    TCP_NEW_SYN_RECV,

    TCP_MAX_STATES  /* Leave at the end! */

};

以上哪项算作'inuse'并计为'alloc'?

linux networking tcp kernel
1个回答
1
投票

以上哪项算作'inuse'并计为'alloc'?

你已经通过定位sockstat_seq_show得到了接近答案 - 我们可以看到'inuse'是sock_prot_inuse_get(net, &tcp_prot)的值,'alloc'是proto_sockets_allocated_sum_positive(&tcp_prot)的值。现在进一步追踪调用链并不总是那么容易,但如果没有弄错的话,我会得出以下结论。

  1. 'alloc' - 底部是percpu_counter tcp_sockets_allocated的总和,它在tcp_init_sock()中递增;套接字状态初始化为TCP_CLOSE。无论套接字在其存在期间经历何种状态变化,'alloc'都不依赖于 - 所有TCP状态都算作'alloc'。
  2. 'inuse' - 这是(每个CPU)计数器net->core.inuseprot_inuse(在本例中为TCP)的总和,它基本上通过调用sock_prot_inuse_add(…, 1) resp来递增和递减。在(…, -1)inet_hash()inet_unhash()inet_hash()中的条件是if (sk->sk_state != TCP_CLOSE),因此除TCP_CLOSE之外的所有TCP状态都算作'inuse'。

我认为这在理论上意味着状态> = TCP_CLOSE中的任何套接字都不算作'inuse'

在我看来不可能如此,因为TCP_LISTEN> TCP_CLOSE和TCP_LISTEN状态的套接字肯定被计为'inuse',如e所示。 G。

(cd /proc/net; cat sockstat; nc -l 8888& sleep 1; cat sockstat; kill $!; cat sockstat)|grep TCP
© www.soinside.com 2019 - 2024. All rights reserved.