Por que minha taxa de transferência TCP é muito maior que a taxa de transferência UDP?

13

Eu não fiz nada de incomum em minhas configurações de hardware ou kernel (todas as configurações padrão, nova instalação do SO, kernel Linux 3.11 TCP / IP stack) e estou calculando em média 3.83 milhões de mensagens por segundo através do TCP com uma média de 0,75 milhão de mensagens por segundo por meio do UDP. Isso parece desafiar completamente o que eu espero dos dois protocolos.

Qual é a causa mais provável para a diferença drástica e como posso diagnosticar no Ubuntu 13.10?

#TCP RESULTS
Recv   Send    Send                          Utilization       Service Demand
Socket Socket  Message  Elapsed              Send     Recv     Send    Recv
Size   Size    Size     Time     Throughput  local    remote   local   remote
bytes  bytes   bytes    secs.    10^6bits/s  % S      % S      us/KB   us/KB

87380  65536     64    10.00      1963.43   32.96    17.09    5.500   2.852

#UDP RESULTS
Socket  Message  Elapsed      Messages                   CPU      Service
Size    Size     Time         Okay Errors   Throughput   Util     Demand
bytes   bytes    secs            #      #   10^6bits/sec % SS     us/KB

4194304      64   10.00     7491010      0      383.5     28.97    24.751
212992            10.00     1404941              71.9     25.03    21.381

Para este teste, eu tenho dois servidores de teste que são idênticos e conectados diretamente através de um cabo crossover de 10G. As NICs usadas neste caso são da Intel X520 com configurações prontas para uso e conectadas a um slot PCIe 3.0 x8 na placa-mãe, que se comunica com a CPU por meio de um controlador NUMA.

    
por elleciel 30.03.2014 / 20:33

1 resposta

28

Além de não obter informações detalhadas sobre sua configuração de teste, o principal problema parece ser que você use um tamanho de mensagem de 64 bytes. Isso está longe do MTU usual de 1500 bytes e torna o UDP altamente ineficiente: enquanto o TCP mescla vários envios em um único pacote (exceto se TCP_NODELAY estiver definido) para fazer uso eficiente do link, cada mensagem UDP resultará em um pacote separado. Em números: cerca de 23 mensagens com tamanho de 64 bytes serão combinadas em um único pacote TCP de tamanho de MTU, enquanto serão necessários 23 pacotes únicos para o UDP para a mesma quantidade de dados. Cada um desses pacotes significa sobrecarga com o envio do host, transmitindo no fio e recebendo pelo peer. E, como vimos no seu caso, cerca de 80% dos pacotes UDP são perdidos porque seu hardware não é rápido o suficiente para transmitir e receber todos esses pacotes.

Então, o que você pode aprender com esse benchmark é:

  • O UDP não é confiável (80% de perda de pacotes)
  • O UDP é ineficiente se usado com tamanhos de pacote muito abaixo do MTU
  • O TCP é altamente otimizado para aproveitar ao máximo o link

Quanto à sua expectativa, o UDP deve ser melhor: você já se perguntou por que todas as grandes transferências de arquivos (ftp, http, ...) são feitas com protocolos baseados em TCP? O benchmark mostra o motivo.

Então, por que as pessoas usam o UDP?

  • Com dados em tempo real (por exemplo, voz sobre IP), você não se importa com mensagens antigas, portanto, não deseja que o remetente combine mensagens em pacotes maiores para fazer uso efetivo do link. E você prefere aceitar que um pacote se perca do que chegar tarde demais.
  • Com links de alta latência (como os satélites), o comportamento padrão do TCP não é o ideal para fazer uso efetivo do link. Assim, algumas pessoas mudam para UDP neste caso e reimplementam a camada de confiabilidade do TCP e a otimizam para links de alta latência, enquanto outras ajustam a pilha TCP existente para fazer melhor uso do link.
  • dados de "jogar fora": às vezes é mais importante enviar os dados e não se importar com a perda de pacotes, como com as mensagens de log (syslog)
  • Interações curtas: com o TCP você precisa estabelecer uma conexão e manter um estado, que custa tempo e recursos no cliente e no servidor. Para interações curtas (como curto pedido e resposta) isso pode ser muito sobrecarga. Por causa disso, o DNS geralmente é feito com o UDP, mas ele criou novas tentativas sobre o UDP.
por 30.03.2014 / 21:38