8.2. Configurações de Rede Otimizadas
Ajuste de desempenho é normalmente feito de forma preventiva. Muitas vezes, nós ajustamos variáveis conhecidas antes de executar um aplicativo ou implantação de um sistema. Se o ajuste revela-se ineficaz, tentamos ajustar outras variáveis. A lógica por trás desse pensamento é que por padrão, o sistema não está operando em um nível ideal de desempenho e, como tal, pensamos que é preciso ajustar o sistema de acordo. Em alguns casos, podemos fazê-lo através de palpites calculados.
Como mencionado anteriormente, a pilha de rede é auto-otimizável. Além disso, ajustar a rede de maneira efetiva requer um conhecimento profundo não apenas de como a pilha de rede funciona, mas também as necessidades de recursos de rede do sistema específico. Configuração de desempenho de rede incorreta pode realmente levar a degradação do desempenho.
Por exemplo, considere o problema bufferfloat. O aumento da profundidade da fila do buffer resulta em conexões TCP que têm janelas de congestionamento maior do que o link iria permitir (devido ao buffer profundo). No entanto, essas conexões também têm valores RTT enormes, pois as estruturas gastam tanto tempo em fila. Isto, por sua vez, realmente resulta em produção sub-óptima, uma vez que seria impossível detectar os congestionamentos.
Quando se trata de desempenho da rede, é aconselhável manter as configurações padrão a menos que um problema de desempenho particular, torne-se aparente. Estas questões incluem a perda de estrutura, o rendimento significantemente reduzido, e semelhantes. Mesmo assim, a melhor solução é muitas vezes uma que resulta de um minucioso estudo do problema, ao invés de simplesmente ajustar as configurações para cima (aumento de buffer/comprimentos de fila, redução a latência de interrupção, etc.)
Para diagnosticar adequadamente um problema de desempenho de rede, use as seguintes ferramentas:
- netstat
- Um utilitário de linha de comando que imprime conexões de rede, tabelas de roteamento, estatísticas de interface, conexões mascaradas e associações de multicast. Ele recupera informações sobre subsistemas de rede a partir do sistema de arquivo
/proc/net/
. Estes arquivos incluem:/proc/net/dev
(Informações de dispositivo)/proc/net/tcp
(Informações de soquete TCP)/proc/net/unix
(Informações de soquete de domínio Unix)
Para mais informações sobrenetstat
e seus arquivos de referncia de/proc/net/
, consulte a página mannetstat
:man netstat
. - dropwatch
- Um utilitário de monitoramento que monitora pacotes despejados pelo kernel. Para mais informações, consulte a página man
dropwatch
:man dropwatch
. - ip
- Um utilitário para gerenciar e monitorar rotas, dispositivos, roteamento de política e túneis. Para mais informações consulte a página man
ip
:man ip
. - ethtool
- Um utilitário para exibir e modificar as configurações do NIC. Para mais informações, consulte a página man
ethtool
:man ethtool
. - /proc/net/snmp
- Um arquivo que exibe dados ASCII necessários para bases de informações de gerenciamento IP, ICMP, TCP e UDP para um agente
snmp
. Ele também exibe estatísticas de tempo real de UDP-lite.
O SystemTap Beginners Guide contém diversos scripts de amostra que você pode usar para o desempenho de rede do perfil e do monitor. Este guia está disponível a partir do link http://access.redhat.com/site/documentation/Red_Hat_Enterprise_Linux/.
Após a coleta de dados relevantes sobre um problema de desempenho de rede, você deve ser capaz de formular uma teoria — e, felizmente, uma solução. [5] Por exemplo, um aumento de erros de entrada UDP em
/proc/net/snmp
indica que um ou mais soquetes que recebem filas estão cheias quando as pilhas de rede tentam enfileirar novas estruturas no soquete de um aplicativo.
Isso indica que os pacotes são afunilados pelo menos em uma fila de socket, o que significa que a fila do soquete drena pacotes muito lentamente, ou o volume de pacotes é muito grande para aquela fila de soquete. Se for o último caso, então verifique os logs de qualquer aplicação de rede intensiva, a procura de perda de dados - para resolver isso, você precisa para otimizar ou reconfigurar o aplicativo ofensivo.
8.2.1. Soquete recebe tamanho de buffer
Soquete enviam e recebem tamanhos que são ajustados dinamicamente, de modo que raramente precisam ser editadas manualmente. Se uma análise mais aprofundada, como a análise apresentada no exemplo de rede SystemTap,
sk_stream_wait_memory.stp
, sugere que a taxa de dreno da fila de soquete é muito lenta, então você pode aumentar a profundidade da fila de soquete do aplicativo. Para fazer isso, aumente o tamanho de buffers de recepção por utilizados por soquetes, configurando um dos seguintes valores:
- rmem_default
- Um parâmetro de kernel que controla o tamanho do default de buffers de recepção usados pelo soquete. Para configurar isto, execute o seguinte comando:
sysctl -w net.core.rmem_default=N
Substitua oN
pelo tamanho de buffer desejado, em bytes. Para determinar o valor para este parâmetro de kernel, visualize/proc/sys/net/core/rmem_default
. Tenha em mente que o valor dermem_default
deve ser maior do quermem_max
(/proc/sys/net/core/rmem_max
); se necessário, aumente o valor dermem_max
. - SO_RCVBUF
- A opção de soquete que controla o tamanho máximo de buffers de recepção de soquete, em bytes. Para mais informações sobre
SO_RCVBUF
, consulte a página man para mais detalhes:man 7 socket
.Para configurarSO_RCVBUF
, use o utilitáriosetsockopt
. Você pode recuperar o valor atualSO_RCVBUF
com ogetsockopt
. Para mais informações utilizando ambos utilitários, consulte a página mansetsockopt
:man setsockopt
.
[5]
Seção 8.3, “Visão Geral de Recepção de Pacotes” contém uma visão geral do pacote de viagem, o que deve ajudá-lo a localizar e mapear as áreas propensas a funilamento na pilha de rede.