В / proc / sockstat какие состояния TCP считаются как «inuse», а какие как «alloc»? - PullRequest
1 голос
/ 28 марта 2019

Например, в / proc / net / sockstat TCP-сокет в CLOSE_WAIT считается как 'inuse' или 'alloc'?

В исходном коде ядра net / ipv4 / proc.c я вижу, что sockstat_seq_show вызывается при получении информации из / proc / net / sockstat.

Однако я не вижу, что отличает сокет от распределения (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»?

1 Ответ

1 голос
/ 29 марта 2019

Что из перечисленного считается «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» - это сумма(на процессор) счетчики net->core.inuse или prot_inuse (для TCP в данном случае), которые по существу увеличиваются и уменьшаются при вызовах sock_prot_inuse_add(…, 1) соответственно.(…, -1) в inet_hash() соотв.inet_unhash().Условие в inet_hash() равно if (sk->sk_state != TCP_CLOSE), поэтому все состояния TCP, за исключением TCP_CLOSE , считаются «inuse» .

Я думаю, что в теории это означает любоесокет в состоянии> = TCP_CLOSE не считается 'inuse'

На мой взгляд, этого не может быть, так как также TCP_LISTEN> TCP_CLOSE, а сокет в состоянии TCP_LISTEN наверняка равен считается как 'inuse' , что можно увидеть, например, с

(cd /proc/net; cat sockstat; nc -l 8888& sleep 1; cat sockstat; kill $!; cat sockstat)|grep TCP
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...