Como o GRO (generic receive offload) funciona em NICs mais avançados?

12

Estou interessado em respostas específicas:

  1. A NIC com o GRO edita / cria TCP ACK ou qualquer outro pacote (ou esse recurso é transparente para as pilhas TCP do receptor / remetente)?
  2. Deve haver um tempo limite / evento quando a NIC deve passar os "segmentos colados" para a pilha TCP? O que são eles?
  3. Na configuração do encaminhamento de pacotes - o recurso GRO também tenta ler ACKs do receptor (veja abaixo por que estou perguntando isso)?
  4. Qualquer fonte que explique o GRO e também outros recursos de descarregamento do NIC (TSO, LSO ...) melhor do que as páginas do manual da wikipedia e do linux seria muito apreciada.

Mais detalhes:

Estou solucionando problemas de desempenho com uma implementação de IPSec. O problema é que a largura de banda disponível não é distribuída uniformemente em todos os 4 túneis VPN (distribuídos aproximadamente como 200MBps / 200MBps / 1MBps / 1MBps; cada encapsulamento VPN encapsula a conexão TCP única). No PCAP, de vez em quando, vejo que o servidor fica ocioso por aproximadamente 2 segundos (aguardando o ACK). Fazer o download de currículos quando o servidor da Web retransmite segmentos não confirmados.

Meu corte interno do PCAP é que o recurso NIC GRO cola os pacotes juntos, mas às vezes não os passa para a pilha TCP em tempo hábil e isso está causando os problemas.

Como este servidor VPN não possui interfaces que terminam conexões TCP, mas apenas encaminha pacotes. Então tentei desativar o GRO e depois disso, observei que o tráfego estava distribuído uniformemente em todos os túneis. Além disso, quando o escalonamento da janela TCP está desabilitado no servidor da Web, a largura de banda também é distribuída mesmo com o GRO habilitado (é por isso que tive a pergunta nº 3).

Estou usando o 2.6.32-27 linux no servidor Ubuntu 10.04 (64 bits). NIC é Intel 82571EB. Todas as interfaces (cliente HTTP, cliente VPN, servidor VPN, servidor Web) são conectadas diretamente em cadeia com cabos Ethernet de 1 Gbit.

    
por Hans Solo 03.02.2011 / 20:45

1 resposta

15

Achei este artigo incrivelmente útil: JLS2009: Descarregamento de recebimento genérico . Dá uma excelente visão geral de como o GRO funciona.

  1. Alguns adaptadores podem fazer isso, mas os drivers associados também precisam estar cientes disso. Além disso, os próprios motoristas podem fazer isso no software. Como isso acontece antes de entrar na pilha TCP / IP do Kernel, no momento em que a pilha TCP / IP do espaço do kernel é totalmente inserida, os pacotes foram ressequidos.
  2. O timeout é definido pela especificação GRO como um 'tick' TCP / IP (incremento do campo Time Stamp), que é um número muito pequeno, mas em redes rápidas vários pacotes ainda podem ser recebidos.
  3. GRO entrará em jogo no lado de recebimento do forwarder e, de fato, o GRO foi criado para que o método LRO mais ganancioso parasse de estragar os pacotes nos forwarders.
  4. Esse artigo que eu fiz o link acima ajuda muito.

O Ethtool pode ser capaz de ativar / desativar o GRO em interfaces específicas. Depende da versão.

    
por 03.02.2011 / 21:47