8.3. Visão Geral de Recepção de Pacotes

Para melhor analisar os funilamentos da rede e problemas de desempenho, você precisa entender como funciona a recepção de pacotes. Recepção de pacotes é importante para o ajuste de desempenho de rede, pois o caminho de recepção é onde as estruturas são muitas vezes perdidas. Estruturas perdidas no caminho de recepção pode causar uma penalidade significativa para o desempenho da rede.
Diagrama de caminho de recepção de rede

Figura 8.1. Diagrama de caminho de recepção de rede

O kernel do Linux recebe cada estrutura e sujeita-as a um processo de quatro passos:
  1. Recepção de Hardware: a placa de interface de rede (NIC) recebe a estrutura a cabo. Dependendo de sua configuração do driver, o NIC tranferirá a estrutura para uma memória de buffer de hardware interno ou para um buffer de anel especificado.
  2. Hard IRQ: o NIC declara a presença de uma estrutura de rede ao interromper a CPU. Isto faz com que o driver do NIC perceba a interrupção e agende a operação IRQ leve.
  3. Soft IRQ: este estágio implementa o processo de estrutura de recepção e é executado no contexto de softirq. Isto significa que o estágio pré esvazia todos os aplicativos que estão executando em uma CPU específica, mas ainda permite que os IRQs rígidos a serem declarados.
    Neste contexto (em execução na mesma CPU como IRQ rígido, minimizando sobrecarga de bloqueio), o kernel realmente remove o quadro dos buffers de hardware NIC e o processa através da pilha de rede. A partir daí, o quadro é encaminhado, descartado ou passado para um soquete de escuta de alvo.
    Quando passado para um soquete, o quadro é anexado ao aplicativo que possui o soquete. Este processo é feito de forma iterativa até que o buffer de hardware NIC não tenha mais quadros, ou até que o peso do dispositivo ( dev_weight ). Para mais informações sobre o peso do dispositivo, consulte o Seção 8.4.1, “Buffer de Hardware NIC”
  4. Recepção de Aplicativo: o aplicativo recebe o quadro e desinfileira-o de qualquer posse de soquete via chamadas POSIX padrão (read, recv, recvfrom). Neste ponto, os dados recebidos sob a rede não existem mais na pilha de rede.

8.3.1. Afinidade de CPU/cache

Para manter o rendimento alto no caminho de recepção, é recomendado que você mantenha o cache L2 hot. Como descrito anteriormente, os buffers de rede são recebidos na mesma CPU como o IRQ que sinalizou a presença dos mesmos. Isto significa que os dados de buffer estarão no cache L2 daquela CPU que está recebendo.
Para aproveitar isto, coloque a afinidade do processo em aplicativos que deverão receber o maior número de dados sobre a NIC que compartilha o mesmo núcleo que o cache L2. Isto irá maximizar as chances de um acerto de cache, e, assim, melhorar o desempenho.