Uso contínuo da opção TCP_NODELAY
(brooker.co.za)A importância da configuração TCP_NODELAY
- Ao depurar problemas de latência em sistemas distribuídos, a primeira coisa a verificar é se a opção
TCP_NODELAYestá ativada - Muitos desenvolvedores de sistemas distribuídos já tiveram a experiência de resolver rapidamente problemas de latência ao ativar essa opção simples de socket
- Isso sugere que o comportamento padrão pode estar errado ou que o conceito como um todo pode estar ultrapassado
Contexto e problemas do algoritmo de Nagle
- Proposto pela primeira vez em 1984 no RFC896 de John Nagle, o algoritmo de Nagle tinha como objetivo amortizar melhor o custo do cabeçalho TCP para obter melhor throughput na rede
- O algoritmo de Nagle funciona suprimindo o envio de novos segmentos TCP quando ainda não foi recebida a confirmação dos dados enviados anteriormente
- No entanto, isso causa problemas ao interagir com delayed ACK
- O algoritmo de Nagle bloqueia o envio de mais dados até que um ACK seja recebido, enquanto o delayed ACK adia o ACK até que uma resposta esteja pronta
- Isso é bom para encher pacotes, mas ruim para aplicações em pipeline sensíveis à latência
A necessidade do algoritmo de Nagle em sistemas modernos
- Servidores modernos conseguem executar uma enorme quantidade de trabalho em algumas centenas de microssegundos, então atrasar a transmissão de dados mesmo por um único RTT pode não trazer um benefício claro
- A maioria dos bancos de dados e sistemas distribuídos não envia pacotes de um único byte
- Isso acontece porque há mais dados a transmitir, além do overhead de protocolos como TLS e dos custos de codificação e serialização
- Continuar evitando o envio de mensagens pequenas ainda é importante, mas isso já está sendo tratado de forma eficaz na camada de aplicação
Opinião sobre o uso de TCP_NODELAY
- Ao construir sistemas distribuídos sensíveis à latência, é possível ativar
TCP_NODELAYsem preocupação (desativando o algoritmo de Nagle) - Em sistemas modernos, considerando o mix de tráfego e aplicações, além do desempenho do hardware, o algoritmo de Nagle pode não ser necessário
- Ou seja,
TCP_NODELAYdeveria ser o padrão - Isso pode tornar mais lento algum código de “escrever cada byte”, mas, se eficiência realmente importa, esse aplicativo de qualquer forma deveria ser corrigido
- Ou seja,
A opinião do GN⁺
-
O problema da interação entre o algoritmo de Nagle e o delayed ACK é um bom exemplo de como o design de protocolos é difícil. Situações em que duas funcionalidades razoáveis produzem comportamentos não intencionais serão familiares para projetistas de sistemas.
-
Otimizar o envio de mensagens pequenas na camada de aplicação é uma tendência comum. Minimizar overheads desnecessários por meio de codificação e serialização eficientes é importante.
-
Se o objetivo do algoritmo de Nagle era otimizar a largura de banda da rede, hoje minimizar a latência é uma exigência mais importante. Em situações em que a responsividade da aplicação está diretamente ligada à experiência do usuário, atrasos desnecessários devem ser evitados.
-
Ainda assim, usar
TCP_NODELAYcomo padrão pode não ser ideal em todas as situações. Em ambientes com largura de banda limitada, ou em sistemas nos quais a eficiência de transmissão é muito mais importante do que a latência, pode ser necessário usar o algoritmo de Nagle de forma seletiva. -
No design de protocolos de rede, é importante equilibrar requisitos diversos. Alterar o comportamento padrão de um protocolo de uso geral exige cautela, mas também parece necessário ter flexibilidade para escolher as opções adequadas conforme as necessidades da aplicação.
1 comentários
Comentários do Hacker News
Resumo:
/proc/sys/net/ipv4/tcp_delack_mine/proc/sys/net/ipv4/tcp_ato_min