como verificar o tamanho do anel rx, max_backlog e max_syn_backlog

41

Muitas vezes, durante o processo de solução de problemas e ajustes, me pego pensando nas seguintes configurações do kernel do Linux:

net.core.netdev_max_backlog
net.ipv4.tcp_max_syn_backlog
net.core.somaxconn

Diferente fs.file-max, net.ipv4.ip_local_port_range, net.core.rmem_max, net.core.wmem_max, net.ipv4.tcp_rmem, e net.ipv4.tcp_wmem, que parece ser os botões importantes para mexer com quando você está ajustando uma caixa para altos níveis de concorrência.

Minha pergunta: como posso verificar quantos itens existem em cada uma dessas filas? Geralmente, as pessoas apenas as definem como super altas, mas eu gostaria de registrar esses tamanhos de fila para ajudar a prever falhas futuras e detectar problemas antes que eles se manifestem de maneira perceptível ao usuário.

Colin Hostert
fonte
Esta é uma pergunta incrível. Estou interessado no problema de incast e retransmissões TCP de alta resolução.
dhchdhd

Respostas:

29

Eu também me perguntei isso e fui motivado por sua pergunta!

Eu coletei o quão perto eu poderia chegar de cada uma das filas listadas com algumas informações relacionadas a cada uma. Congratulo-me com comentários / feedback, qualquer melhoria no monitoramento torna as coisas mais fáceis de gerenciar!

net.core.somaxconn

net.ipv4.tcp_max_syn_backlog

net.core.netdev_max_backlog

$ netstat -an | grep -c SYN_RECV 

Irá mostrar a contagem global atual de conexões na fila, você pode dividir isso por porta e colocar isso nas instruções exec em snmpd.conf, se você quiser pesquisá-lo em um aplicativo de monitoramento.

A partir de:

netstat -s

Eles mostrarão com que frequência você está vendo solicitações da fila:

146533724 packets directly received from backlog
TCPBacklogDrop: 1029
3805 packets collapsed in receive queue due to low socket buffer

fs.file-max

A partir de:

http://linux.die.net/man/5/proc

$ cat /proc/sys/fs/file-nr
2720    0       197774

Este arquivo (somente leitura) fornece o número de arquivos atualmente abertos. Ele contém três números: o número de identificadores de arquivo alocados, o número de identificadores de arquivo gratuitos e o número máximo de identificadores de arquivo.

net.ipv4.ip_local_port_range

Se você puder criar uma lista de exclusão de serviços (netstat -an | grep LISTEN), poderá deduzir quantas conexões estão sendo usadas para atividades efêmeras:

netstat -an | egrep -v "MYIP.(PORTS|IN|LISTEN)"  | wc -l

Também deve monitorar (do SNMP):

TCP-MIB::tcpCurrEstab.0

Também pode ser interessante coletar estatísticas sobre todos os estados vistos nesta árvore (estabeleceu / time_wait / fin_wait / etc):

TCP-MIB::tcpConnState.*

net.core.rmem_max

net.core.wmem_max

Você teria que rastrear / rastrear seu sistema para solicitações de setsockopt. Não acho que as estatísticas desses pedidos sejam rastreadas de outra forma. Este não é realmente um valor que muda da minha compreensão. O aplicativo que você implantou provavelmente solicitará um valor padrão. Eu acho que você pode 'perfilar' seu aplicativo com strace e configurar esse valor de acordo. (discutir?)

net.ipv4.tcp_rmem

net.ipv4.tcp_wmem

Para rastrear o quão perto você está do limite, seria necessário examinar a média e o máximo dos campos tx_queue e rx_queue de (regularmente):

# cat /proc/net/tcp
  sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode                                                     
   0: 00000000:0FB1 00000000:0000 0A 00000000:00000000 00:00000000 00000000   500        0 262030037 1 ffff810759630d80 3000 0 0 2 -1                
   1: 00000000:A133 00000000:0000 0A 00000000:00000000 00:00000000 00000000   500        0 262029925 1 ffff81076d1958c0 3000 0 0 2 -1                

Para rastrear erros relacionados a isso:

# netstat -s
    40 packets pruned from receive queue because of socket buffer overrun

Também deve monitorar o pool global de 'buffer' (via SNMP):

HOST-RESOURCES-MIB::hrStorageDescr.1 = STRING: Memory Buffers
HOST-RESOURCES-MIB::hrStorageSize.1 = INTEGER: 74172456
HOST-RESOURCES-MIB::hrStorageUsed.1 = INTEGER: 51629704
polinomial
fonte
2

Eu acho que você pode conseguir esses dados com o SystemTap. Aqui está o manual de referência da Redhat (pdf) . Há também um guia para iniciantes (pdf) .

A ferramenta parece versátil o suficiente para permitir que você obtenha esses dados, em particular se probe::netdev.rxparece com algo que fornecerá informações sobre entradas recebidas, agora "apenas" você precisa encontrar o tamanho da rede da fila no buffer ou algo que conta coisas saindo da fila ...

Paweł Brodacki
fonte