Latência em redes TCP / IP sobre Ethernet

7

Quais recursos (livros, páginas da Web, etc.) você recomendaria:

  • explica as causas da latência em redes TCP / IP sobre Ethernet;
  • mencione ferramentas para procurar itens que causam latência (por exemplo, algumas entradas em netstat -s );
  • sugira maneiras de ajustar a pilha TCP do Linux para reduzir a latência do TCP (Nagle, buffers de soquete etc).

O mais próximo que eu estou ciente é este documento , mas é bastante breve.

Alternativamente, você é bem-vindo para responder diretamente as perguntas acima.

edit Para ser claro, a questão não é apenas sobre a latência "anormal", mas sobre a latência em geral. Além disso, é especificamente sobre TCP / IP-over-Ethernet e não sobre outros protocolos (mesmo se eles tiverem melhores características de latência).

    
por NPE 23.12.2010 / 15:00

7 respostas

9

Com relação aos ajustáveis do kernel para latência, um se destaca:

echo 1 > /proc/sys/net/ipv4/tcp_low_latency

A partir da documentação :

If set, the TCP stack makes decisions that prefer lower latency as opposed to higher throughput. By default, this option is not set meaning that higher throughput is preferred. An example of an application where this default should be changed would be a Beowulf compute cluster. Default: 0

Você também pode desativar o algoritmo de Nagle em seu aplicativo (que armazenará em buffer a saída TCP até o tamanho máximo do segmento) com algo como:

#include <sys/types.h>
#include <stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <linux/tcp.h>

int optval = 1;
int mysock;

void main() {
    void errmsg(char *msg) {perror(msg);exit(1);}

    if((mysock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
        errmsg("setsock failed");
    }

    if((setsockopt(mysock, SOL_SOCKET, TCP_NODELAY, &optval, sizeof(optval))) < 0) {
        errmsg("setsock failed");
    }

    /* Some more code here ... */

    close(mysock);
}

O "oposto" desta opção é TCP_CORK , que irá "re-Nagle" pacotes. Cuidado, no entanto, como TCP_NODELAY nem sempre pode fazer o que você espera e, em alguns casos, pode prejudicar o desempenho. Por exemplo, se você estiver enviando dados em massa, você desejará maximizar o throughput por pacote, portanto, defina TCP_CORK . Se você tiver um aplicativo que requer interatividade imediata (ou onde a resposta é muito maior que a solicitação, negando a sobrecarga), use TCP _NODELAY . Em outra nota, este comportamento é específico do Linux e o BSD provavelmente é diferente, então administrador de condições .

Certifique-se de fazer um teste completo com seu aplicativo e sua infraestrutura.

    
por 23.12.2010 / 17:42
6

Na minha experiência, a maior causa de latência anormal em redes de alta velocidade saudáveis é o TCP Windowing ( RFC1323, seção 2 ) falhas, com um segundo parente próximo em falhas em torno de TCP Atrasado Acks ( RFC1122 seção 4.2.3.2 ). Ambos os métodos são aprimoramentos do TCP para melhor manuseio de redes de alta velocidade. Quando eles quebram, as velocidades caem para níveis muito lentos. Falhas nesses casos afetam grandes transferências (pense em fluxos de backup), onde o tráfego pequeno extremamente transacional (a transferência média de dados está sob o tamanho da MTU e há um monte de back-and-forward) será menos afetado por eles.

Novamente, vi os maiores problemas com esses dois problemas quando duas pilhas TCP / IP diferentes estão falando. Como o Windows / Linux, 2.4-Linux / 2.6-Linux, Windows / NetWare, Linux / BSD. Gosta de gostar muito, muito bem. A Microsoft reescreveu a pilha TCP / IP do Windows no Server 2008, que introduziu problemas de interoperabilidade do Linux que não existiam com o Server 2003 (acredito que eles sejam corrigidos, mas não tenho 100% de certeza disso).

Desacordos sobre o método exato de Agradecimentos Retardados ou Seletivos podem levar a casos como este:

192.168.128.5 -> 192.168.128.20: 1500b payload, SEQ 1562
192.168.128.5 -> 192.168.128.20: 1500b payload, SEQ 9524
[200ms pass]
192.168.128.20 -> 192.168.128.5: ACK 1562
192.168.128.5 -> 192.168.128.20: 1500b payload, SEQ 12025
192.168.128.5 -> 192.168.128.20: 1500b payload, SEQ 13824
[200ms pass]
192.168.128.20 -> 192.168.128.5: ACK 12025

A taxa de transferência é mínima devido a todos os tempos limite de 200ms (o padrão do Windows é atraso-ack para 200ms). Nesse caso, os dois lados da conversa não conseguiram lidar com o TCP Delayed Ack.

TCP As falhas de janelas são mais difíceis de perceber porque seu impacto pode ser menos óbvio. Em casos extremos, o uso de janelas falha completamente e você obtém o pacote - ack - > pacote - > ack > pacote - > ack que é realmente lento quando transfere algo significativamente maior que cerca de 10KB e ampliará qualquer fundamental latência no link. O modo mais difícil de detectar é quando ambos os lados estão renegociando continuamente seu tamanho de janela e um lado (o remetente) não respeita a negociação que requer alguns pacotes para manipular antes que os dados possam continuar sendo transmitidos. Esse tipo de falha aparece em luzes piscando em vermelho nos rastreamentos do Wireshark, mas se manifesta como uma taxa de transferência menor do que a esperada.

Como eu mencionei, os itens acima tendem a afetar grandes transferências. Tráfego como streaming de vídeo ou fluxos de backup podem ser realmente pregados por eles, bem como o simples download de arquivos muito grandes (como arquivos ISO distro do Linux). Por acaso, o TCP Windowing foi projetado como uma forma de contornar problemas fundamentais de latência, pois permite o pipelining de dados; você não precisa esperar o tempo de ida e volta para cada pacote enviado, basta enviar um grande bloco e esperar por um único ACK antes de enviar mais.

Dito isso, certos padrões de rede não se beneficiam dessas soluções alternativas. Transferências altamente transacionais e pequenas, como aquelas geradas por bancos de dados, sofrem mais com a latência de normal na linha. Se o RTT for alto, essas cargas de trabalho sofrerão muito, em que grandes cargas de trabalho de streaming sofrerão muito menos.

    
por 23.12.2010 / 18:38
2

Existem muitas respostas para essa pergunta.

Lembre-se de como o TCP funciona. O cliente envia o SYN, o servidor responde ao SYN / ACK e o cliente responde ao ACK. Uma vez que o servidor tenha recebido o ACK, ele agora pode enviar dados. Isso significa que você precisa esperar 2 vezes o tempo de ida e volta (RTT) para enviar o primeiro bit de dados significativos. Se você tem 500ms de RTT, você obtém um atraso de 1 segundo desde o início. Se as sessões forem de curta duração, mas numerosas, isso criará muita latência.

Quando a sessão é estabelecida, o servidor envia unidades de dados que precisam ser confirmadas pelo cliente. O servidor só pode enviar muitos dados em estado selvagem antes de exigir o reconhecimento da primeira unidade de dados. Isso também pode criar latência. Se uma unidade de dados cair, você terá que pegar a transmissão de lá e, portanto, criar uma latência extra.

No nível IP, você tem fragmentação (embora seja bastante raro hoje em dia). Se você enviar quadros de 1501 bytes e o outro lado suportar apenas uma MTU de 1500, você enviará um pacote IP extra para apenas o último bit de dados. Isso pode ser superado usando quadros Jumbo.

A melhor maneira de aumentar o throughput de TCP / IP é reduzir o máximo possível a latência e evitar erros de transmissão o máximo possível. Eu não sei de nenhum ajuste no kernel, mas tenho certeza que alguém irá fazer isso.

    
por 23.12.2010 / 15:22
2

No caso da WAN, um fator primário para introduzir a latência é a velocidade da luz. É necessário um mínimo teórico de aproximadamente 36.2ms para que os dados atravessem a América do Norte.

Viagem de ida e volta em cabos de fibra ótica em segundos:

  • $ _ DISTANCE_IN_MILES * (Cable_Refraction / SPEED_OF_LIGHT)

Multiplique vezes 1.000 para converter de segundos para milissegundos. Duplique-o para a viagem de ida e volta:

  • $ _ DISTANCE_IN_MILES * (Cable_Refraction / SPEED_OF_LIGHT) * 1000 * 2

Veja a latência de Washington, DC para Los Angeles, CA :

  • 2308 * (1,46 / 186000) * 1000 * 2 = 36,23311ms
  • velocidade da luz (em milhas por segundo) = 186000
  • índice de refração do cabo de fibra ótica = 1,46
  • distância (de DC a LA em milhas) = 2308

More sobre a fórmula

    
por 28.11.2011 / 05:13
1

Provavelmente não é a resposta que você está procurando: a principal causa de latência em uma WAN é a velocidade da luz (é muito lenta!). Além disso, links saturados com um grande buffer ao longo do caminho tendem a ganhar uma latência impressionante.

    
por 23.12.2010 / 21:23
1

Consulte o seguinte site: link

    
por 24.12.2010 / 17:12
0

O TCP é um protocolo de ponta a ponta (ou de cliente para cliente) que assume que a rede no meio tem muito pouca perda. Para um protocolo mais robusto, veja X.25 . Assim, você terá mais controle sobre os parâmetros de protocolo apenas nos clientes (não na rede).

Uma Ethernet é uma Rede de Área Local (LAN) (embora essa definição tenha sido amplamente estendida na última década para incluir também redes de longa distância) e seria de esperar pouca perda de transmissão a menos que enfrentasse 70% ou mais de tráfego um segmento compartilhado. Re-transmissões seria uma ocorrência pouco frequente na rede Ethernet moderna, no entanto, dado que quase todos os segmentos de Ethernet são comutados hoje em dia.

Assim, o congestionamento é seu maior inimigo quando se trata de latência na rede local. Mas então você tem problemas mais sérios do que a mera latência.

Se você levar a sério os problemas de latência para o seu protocolo de comunicação, deve considerar um protocolo de comutação de pacotes em vez de um circuito virtual, como UDP ou RTMP.

    
por 23.12.2010 / 15:16