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 leem os dados provenientes do servidor com rapidez suficiente. Portanto, eu gostaria de monitorar meus soquetes TCP. Para isso, encontrei a ferramenta "ss".
Esta ferramenta permite ver o estado de cada soquete - aqui está um exemplo de linha 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 significa a parte da memória? Analisando o código fonte da ferramenta, descobri que os dados são provenientes de uma estrutura do 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 significam? Minhas suposições são:
rmem_alloc
: tamanho do buffer de entradawmem_alloc
: tamanho do buffer de saídask_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
Respostas:
sk_forward_alloc
é a memória alocada para frente que é a memória total atualmente disponível na cota do soquete.sk_wmem_queued
é a quantidade de memória usada pelo buffer de envio do soquete na fila de transmissão e ainda não foi enviada ou ainda não reconhecida.Você pode aprender mais sobre o gerenciamento de memória TCP no capítulo 9 da arquitetura, projeto e implementação de TCP / IP no Linux Por Sameer Seth, M. Ajaykumar Venkatesulu
fonte
sk_wmem_queued
diferesk_wmem_alloc
, você poderia expandir um pouco sobre isso? (Se você souber a resposta, sinta-se à vontade para adicionar uma resposta a esta pergunta: unix.stackexchange.com/questions/551444/… )Veja a página de manual do ss.
fonte
Em relação a
sk_wmem_queued
esk_wmem_alloc
, fiz a mesma pergunta, então copia a resposta aqui:Enviei um email para Eric Dumazet, que contribui para a pilha de redes Linux, e aqui está a resposta:
Um documento muito bom para entender o que são esses três tipos de filas (buffer de soquete, fila qdisc e fila de dispositivos) é este artigo (bastante longo) . Em poucas palavras, o soquete começa empurrando os pacotes diretamente para a fila qdisc, que os encaminha para a fila do dispositivo. Quando a fila qdisc está cheia, o soquete começa a armazenar em buffer os dados em sua própria fila de gravação.
Então, basicamente:
sk_wmem_queues
é a memória usada pelo buffer de soquete (sock.sk_write_queue
) enquantosk_wmem_alloc
é a memória usada pelos pacotes nas filas de qdisc e dispositivo.fonte