Red Hat Training

A Red Hat training course is available for RHEL 8

21.2. Gargalos em uma recepção de pacotes

Embora a pilha de rede seja em grande parte auto-optimizadora, há uma série de pontos durante o processamento de pacotes de rede que podem se tornar gargalos e reduzir o desempenho. A seguir estão as questões que podem causar gargalos:

The buffer or ring buffer of the network card
O buffer de hardware pode ser um gargalo se o kernel deixar cair um grande número de pacotes. Use o utilitário ethtool para monitorar um sistema para pacotes descartados.
The hardware or software interrupt queues
As interrupções podem aumentar a latência e a contenção do processador. Para informações sobre como o processador lida com as interrupções, consulte Ajuste de sistemas de Afinidade de Interrupção.
The socket receive queue of the application
Um grande número de pacotes que não são copiados ou por um aumento nos erros de entrada do UDP (InErrors) no arquivo /proc/net/snmp, indica um gargalo na fila de recepção de uma aplicação.

Se um buffer de hardware deixar cair um grande número de pacotes, as poucas soluções potenciais são as seguintes:

Slow the input traffic
Filtrar o tráfego de entrada, reduzir o número de grupos multicast unidos, ou reduzir a quantidade de tráfego de transmissão para diminuir a taxa a que a fila preenche.
Resize the hardware buffer queue

Redimensionar a fila de amortecedores de hardware: Reduzir o número de pacotes que estão sendo descartados, aumentando o tamanho da fila para que ela não transborde tão facilmente. Você pode modificar os parâmetros rx/tx do dispositivo de rede com o comando ethtool:

ethtool --set-ring device-name value

Change the drain rate of the queue
  • Diminuir a taxa de enchimento da fila filtrando ou soltando pacotes antes que eles cheguem à fila, ou baixando o peso do dispositivo. Filtrar o tráfego de entrada ou baixar o peso do dispositivo da placa de interface de rede para diminuir o tráfego de entrada.

    O peso do dispositivo se refere ao número de pacotes que um dispositivo pode receber de uma vez em um único acesso programado do processador. Você pode aumentar a taxa de drenagem de uma fila aumentando o peso de seu dispositivo que é controlado pela configuração do kernel dev_weight. Para alterar temporariamente este parâmetro, altere o conteúdo do arquivo /proc/sys/net/core/dev_weight, ou para alterar permanentemente, use o comando sysctl, que é fornecido pelo pacote procps-ng.

  • Aumentar o comprimento da fila de soquetes da aplicação: Esta é normalmente a maneira mais fácil de melhorar a taxa de drenagem de uma fila de soquetes, mas é pouco provável que seja uma solução a longo prazo. Se uma fila de soquetes receber uma quantidade limitada de tráfego em rajadas, o aumento da profundidade da fila de soquetes para corresponder ao tamanho das rajadas de tráfego pode impedir que os pacotes sejam descartados. Para aumentar a profundidade de uma fila, aumente o tamanho do buffer de recepção do soquete fazendo uma das seguintes mudanças:

    • Aumentar o valor do parâmetro /proc/sys/net/core/rmem_default: Este parâmetro controla o tamanho padrão do buffer de recepção utilizado pelos soquetes. Este valor deve ser menor ou igual ao valor do parâmetro proc/sys/net/core/rmem_max.
    • Use o setsockopt para configurar um valor maior SO_RCVBUF: Este parâmetro controla o tamanho máximo em bytes do buffer de recepção de um soquete. Use a chamada ao sistema getsockopt para determinar o valor atual do buffer.

Alterar a taxa de drenagem de uma fila é geralmente a maneira mais simples de mitigar o mau desempenho da rede. Entretanto, o aumento do número de pacotes que um dispositivo pode receber de uma vez utiliza o tempo adicional do processador, durante o qual nenhum outro processo pode ser programado, o que pode causar outros problemas de desempenho.

Recursos adicionais

  • Para mais informações, consulte as páginas de manual ss, socket e ethtool.
  • O arquivo /proc/net/snmp.