8.4. Resolvendo Filas Comuns/ Problemas de Perda de Quadro

O motivo mais comum para a perda de quadros é uma saturação de fila. O núcleo define um limite para o comprimento de uma fila, e, em alguns casos, a fila enche mais rapidamente do que drena. Quando isso ocorre por muito tempo, os quadros começam a ser descartados.
Como ilustrado em Figura 8.1, “Diagrama de caminho de recepção de rede”, existem duas grandes filas no caminho de recepção: o buffer de hardware NIC ea fila do socket. Ambas as filas precisam ser configurados adequadamente, para proteger contra saturação de filas.

8.4.1. Buffer de Hardware NIC

O NIC enche seu buffer de harware com quadros; o buffer é drenado pelo softirq, o qual declara o NIC via uma interrupção. Para interrogar o status desta fila, use o seguinte comando:
ethtool -S ethX
Substitua ethX pelo nome de dispositivo correspondente do NIC. Isto irá exibir quantos quadros foram despejados dentro do ethX. Geralmente, um despejo ocorre porque a fila não possui mais espaço de buffer no qual armazena quadros.
Existem formas diferentes de resolver este problema, assim como:
Tráfego de entrada
Você pode ajudar a evitar saturação de fila diminuindo a velocidade do tráfego de entrada. Você pode fazer isto filtrando, reduzindo o número de grupos de multicast unidos, abaixando o tráfego de transferência e assim por diante.
Comprimento da Fila
Como forma alternativa você também pode aumentar o comprimento da fila. Isto envolve aumentar o número de buffers na fila específica para qualquer máximo que o driver permitir. Para fazer isto, edite os parâmetros de anel rx/tx de ethX usando:
ethtool --set-ring ethX
Anexe os valores de rx ou tx apropriados. Para mais informações, consulte man ethtool.
Peso do dispositivo
Também é possível aumentar a taxa na qual uma fila seja drenada. Para fazer isso, ajuste o peso do dispositivo do NIC adequadamente. Este atributo refere-se ao número máximo de quadros que a placa de rede pode receber antes do contexto softirq ter que render a CPU e se reagendar. É controlada pela variável /proc/sys/net/core/dev_weight.
A maioria dos administradores têm uma tendência a escolher a terceira opção. No entanto, tenha em mente que existem consequências para fazê-lo. Aumentar o número de quadros que podem ser recebidos a partir de um NIC em uma iteração implica ciclos extra de CPU, durante o qual nenhum aplicativo pode ser programado naquela CPU.