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
deethX
usando:ethtool --set-ring ethX
Anexe os valores derx
outx
apropriados. Para mais informações, consulteman 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.