O que significa a saída de "ss -s"

O utilitário netstat foi substituído pelo utilitário ss e, muitas vezes, a saída das informações agregadas (resumo) " ss -s " (ou " ss - resumo ") é usada para monitorar as necessidades. No entanto, o que significa cada um dos campos exibidos?

# ss -s
Total: 15046 (kernel 16739)
TCP:   39306 (estab 11458, closed 25092, orphaned 110, synrecv 0, timewait 24929/0), ports 0

Transport Total     IP        IPv6
*	  16739     -         -        
RAW	  0         0         0        
UDP	  15        5         10       
TCP	  14214     1214      13000    
INET	  14229     1219      13010    
FRAG	  0         0         0        

Como se viu, existem sutilezas.

A fonte da verdade é o código fonte. O código-fonte do utilitário «ss» encontrado em iproute2 / Misc / ss.c . A saída de "ss -s" é feita na função print_summary .

Antes da versão 4.17.0, a saída de "ss -s" é exibida acima. Após cometer 90ee99d, começou a ficar assim:

# ss -s
Total: 15046
TCP:   39306 (estab 11458, closed 25092, orphaned 110, timewait 24929)

Transport Total     IP        IPv6
RAW	  0         0         0        
UDP	  15        5         10       
TCP	  14214     1214      13000    
INET	  14229     1219      13010    
FRAG	  0         0         0        

Como você pode ver, o campo "kernel" foi removido da linha "Total". Na linha “TCP”, o campo “synrecv” foi excluído, um (primeiro) número “timewait” permaneceu, o campo “ports” foi excluído. Na tabela "Transporte", a linha "*" foi excluída. O significado geral do commit pode ser traduzido como: " Removemos da saída o que há muito tempo está quebrado ."

O que foi quebrado?


No print_summary versão 4.16.0 é usada a estrutura slabstat , preenchida chamando get_slabstat . Se tentarmos converter a chamada get_slabstat em comandos shell, obteremos o seguinte:

# egrep '^(sock|tcp_bind_bucket|tcp_tw_bucket|tcp_open_request|skbuff_head_cache)' /proc/slabinfo | awk '{ print $1, $2; }'

Onde as chaves de "/ proc / slabinfo" correspondem aos campos da estrutura "slabstat":

struct slabstat {
	int socks;       // sock, net/core/sock.c:sk_init,   2.6.12
	int tcp_ports;   // tcp_bind_bucket, net/ipv4/tcp.c:tcp_init
	int tcp_tws;     // tcp_tw_bucket, net/ipv4/tcp.c:tcp_init,   2.6.14
	int tcp_syns;    // tcp_open_request, net/ipv4/tcp.c:tcp_init,   2.6.13
	int skbs;        // skbuff_head_cache, net/core/skbuff:skb_init,  
};

Em outras palavras, de todos os valores obtidos hoje em "/ proc / slabinfo", apenas o valor "tcp_bind_bucket" pode ser obtido, exibido no campo "ports". Vou dar a descrição dele no livro “Arquitetura, Design e Implementação TCP / IP no Linux. Por S. Seth e MA Venkatesulu 2008, a IEEE Computer Society ":
This structure keeps information about the port number usage by sockets and the way the port number is being used. The information is useful enough to tell the new binding socket whether it can bind itself to a particular port number that is already in use. The data structure also keeps track of all the socket’s that are associated with this port number.
Agora, novamente, a mesma coisa, mas na forma de uma imagem (o artista meu é mais ou menos):



Você percebe algo estranho? A “meia” da laje (excluída em 2.6.12) tem um valor diferente de zero. A explicação é muito simples - devido às peculiaridades da comparação de cadeias, qualquer número cuja chave comece com "meia" entrará no valor do campo. No meu caso, este é "sock_inode_cache" de "net / socket.c: init_inodecache" relacionado ao "sockfs" - uma lista de "inodes" contendo "socket struct" (talvez não seja exatamente isso que o autor do utilitário pretendeu):

# egrep '^sock' /proc/slabinfo | awk '{ print $1, $2; }'
sock_inode_cache 16739

Bem, “tcp_bind_bucket” está ausente apenas por causa das opções de compilação do kernel (e, consequentemente, o campo “ports” sempre tem o valor “0”).

Descrição da saída "ss -s"


Antes de mergulhar nos meandros dos cálculos de campo, faz sentido atualizar o estado dos soquetes na memória (ESTABELECIDO, ESPERADO, ESPERADO, etc.). Para aqueles que esqueceram, ajude wiki: RU , EN .

A saída do utilitário é baseada nos valores obtidos dos arquivos:

# cat /proc/net/sockstat
sockets: used 15046
TCP: inuse 1205 orphan 111 tw 24952 alloc 14368 mem 5890
UDP: inuse 5 mem 86
UDPLITE: inuse 0
RAW: inuse 0
FRAG: inuse 0 memory 0

# cat /proc/net/sockstat6
TCP6: inuse 13000
UDP6: inuse 10
UDPLITE6: inuse 0
RAW6: inuse 0
FRAG6: inuse 0 memory 0

# egrep '^Tcp:' /proc/net/snmp
Tcp: RtoAlgorithm RtoMin RtoMax ... AttemptFails EstabResets CurrEstab ...
Tcp: 1 200 120000 ... 1348218 4095008 11458 ...

Valores calculados a partir do conteúdo de "net / sockstat" (para simplificar a percepção nas figuras):



  • Total - o número total de soquetes no sistema (incluindo soquetes unix) em qualquer estado, exceto TIME_WAIT;
  • TCP: - o número total de soquetes TCP (incluindo IPv6) em qualquer estado, dois soquetes são separados dos soquetes de alocação devido ao chamado. " Corredor da morte " - eles não podem ser usados ​​até a transição para o estado FECHADO.
    • orphaned — «» TCP (, );
    • timewait — TCP TIME_WAIT;
    • inuse TCP, UDP, RAWv4 CLOSED TIME_WAIT;
    • inuse FRAG (bool) — , memory — ( mem, ).

Valores calculados pelo conteúdo de "net / sockstat6":



Tudo parece simples aqui - " Transporte / Total " é a soma da soma de um dos valores de " IP " e " IPv6 ".

Valores calculados a partir do conteúdo de "net / snmp". De acordo com a RFC-4022 , " tcpCurrEstab " é "O número de conexões TCP para as quais o estado atual é ESTABELECIDO ou EM ESPERA".



E o último campo " fechado " é a soma dos soquetes e soquetes alocados no estado TIME_WAIT menos a soma dos soquetes TCPv4 e TCPv6 em qualquer um dos estados não fechados:



PS E não esqueça de assinar os eixos nos gráficos.

All Articles