Estou trabalhando em um software que se conecta a um servidor de dados em tempo real (usando TCP) e tenho algumas conexões caindo. Meu palpite é que os clientes não lêem os dados vindos do servidor com rapidez suficiente. Portanto, gostaria de monitorar meus soquetes TCP. Para isso, encontrei a ferramenta "ss".
Esta ferramenta permite ver o estado de cada socket - aqui está uma linha de exemplo da saída do comando ss -inm 'src *:50000'
ESTAB 0 0 184.7.60.2:50000 184.92.35.104:1105
mem:(r0,w0,f0,t0) sack rto:204 rtt:1.875/0.75 ato:40
Minha pergunta é: o que a parte da memória significa?
Olhando para o código-fonte da ferramenta, descobri que os dados são provenientes de uma estrutura de kernel ( sock
in sock.h
). Mais precisamente, vem dos campos:
r = sk->sk_rmem_alloc
w = sk->sk_wmem_queued;
f = sk->sk_forward_alloc;
t = sk->sk_wmem_alloc;
Alguém sabe o que eles querem dizer? Meus palpites são:
-
rmem_alloc
: tamanho do buffer de entrada
-
wmem_alloc
: tamanho do buffer de saída
-
sk_forward_alloc
: ???
-
sk->sk_wmem_queued
: ???
Aqui estão os tamanhos dos meus buffers:
net.ipv4.tcp_rmem = 4096 87380 174760
net.ipv4.tcp_wmem = 4096 16384 131072
net.ipv4.tcp_mem = 786432 1048576 1572864
net.core.rmem_default = 110592
net.core.wmem_default = 110592
net.core.rmem_max = 1048576
net.core.wmem_max = 131071