在/ proc / sockstat中,哪个TCP状态记为“正在使用”,哪个TCP状态记为“分配”?

时间:2019-03-28 19:44:31

标签: linux networking tcp kernel

例如,在/ proc / net / sockstat中,CLOSE_WAIT中的TCP套接字是否被计为“正在使用”或“分配”?

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

但是我看不出有什么区别使套接字与被分配(分配)(而不是“使用中”)相反的

[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”?

1 个答案:

答案 0 :(得分: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状态 count为“ alloc”
  2. 'inuse'-这是(每个CPU)计数器net->core.inuseprot_inuse(在这种情况下,对于TCP)的总和,它们实际上通过调用{{1 }}。 inet_hash()中的sock_prot_inuse_add(…, 1)inet_unhash()(…, -1)中的条件为inet_hash(),因此除if (sk->sk_state != TCP_CLOSE)以外的所有TCP状态均计数为“正在使用”
  

我认为从理论上讲,这意味着任何状态> = TCP_CLOSE的套接字都不会被视为“正在使用”

在我看来不可能如此,因为TCP_LISTEN> TCP_CLOSE以及处于TCP_LISTEN状态的套接字肯定也被视为“正在使用” ,如e所示。 g。

TCP_CLOSE