8.4.2. Fila de Soquete
Como a fila de hardware NIC, a fila de socket é preenchida pela pilha de rede a partir do contexto
softirq
. Os aplicativos então drenam as filas de seus soquetes correspondentes através de chamadas para read
, recvfrom
, e assim por diante.
Para monitorar o status desta fila, use o utilitário
netstat
; a coluna Recv-Q
exibe o tamanho da fila. Geralmente falando, saturações em filas de soquete são gerenciadas da mesma forma que as saturações de buffer de hardware NIC (ex.: Seção 8.4.1, “Buffer de Hardware NIC”):
- Tráfego de entrada
- A primeira opção é diminuir o tráfego de entrada, configurando a taxa na qual se enche a fila. Para isso, você pode filtrar quadros ou despejá-los de forma pré-vazia. Você também pode desacelerar o tráfego de entrada, diminuindo o peso do dispositivo [6].
- Profundidade da Fila
- Você também pode evitar saturação de fila de soquete aumentando a profundidade da fila. Para fazer isto, aumente o valor do parâmetro do kernel
rmem_default
ou a opção de soqueteSO_RCVBUF
. Para mais informações sobre ambos, consulte Seção 8.2, “Configurações de Rede Otimizadas”. - Frequência de chamada de aplicativo
- Sempre que possível, otimize o aplicativo para realizar realizar chamadas com mais freqüência. Trata-se de modificar ou reconfigurar o aplicativo de rede para realizar chamadas POSIX mais freqüentes (como
recv
,read
). Isso permite que um aplicativo drene a fila mais rápidamente.
Para muitos administradores, aumentar a profundidade da fila é a solução preferível. Esta é a solução mais fácil, mas nem sempre pode funcionar a longo prazo. A medida que as tecnologias de rede ficam mais rápidas, as filas de soquete continuam a encher mais rapidamente. Com o tempo, isso significa ter de voltar a ajustar a profundidade da fila de acordo.
A melhor solução é aumentar ou configurar o aplicativo para drenar dados do kernel mais rapidamente, mesmo que isso signifique enfileiramento dos dados no espaço de aplicação. Isso permite que os dados sejam armazenados de forma mais flexível, uma vez que pode ser trocado e paginado novamente quando necessário.
[6]
Peso do dispositivo do NIC é controlado via
/proc/sys/net/core/dev_weight
. Para mais informações sobre o peso do dispositivo e as implicações de ajustá-lo, consulte Seção 8.4.1, “Buffer de Hardware NIC”.