Não fiz nada de incomum nas configurações de meu hardware ou kernel (todas as configurações padrão, nova instalação do SO, pilha TCP / IP do kernel 3.11 do Linux) e estou com uma média de 3,83 milhões de mensagens por segundo através do TCP, enquanto estou com apenas 0,75 milhões de mensagens por segundo através do UDP. Isso parece desafiar completamente o que eu espero dos dois protocolos.
Qual é a causa mais provável da diferença drástica e como posso diagnosticá-la 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, tenho dois servidores de teste que são idênticos e conectados diretamente através de um cabo cruzado 10G. As NICs usadas neste caso são as 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.
fonte
netperf
para os testes de benchmark, UDP_STREAM e TCP_STREAM, corrigidos para a mesma CPU e tamanhos de mensagem de 64 bytes.Respostas:
Além de não obter informações detalhadas sobre a configuração do teste, o principal problema parece ser o fato de você usar um tamanho de mensagem de 64 bytes. Isso está muito longe do MTU usual de 1500 bytes e torna o UDP altamente ineficiente: enquanto o TCP mescla vários envios em um único pacote na conexão (exceto se TCP_NODELAY estiver configurado) para fazer uso eficiente do link, cada mensagem UDP resultará em um pacote separado. Em números: cerca de 23 mensagens de tamanho 64 bytes serão combinadas em um único pacote TCP de tamanho MTU, enquanto serão necessários 23 pacotes únicos para UDP para a mesma quantidade de dados. Cada um desses pacotes significa sobrecarga com o envio do host, a transmissão no fio e a recepção pelo ponto. E, como visto no seu caso, cerca de 80% dos pacotes UDP se perdem 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 é:
Quanto à sua expectativa, que o UDP deveria ser melhor: você já se perguntou por que todas as principais transferências de arquivos (ftp, http, ...) são feitas com protocolos baseados em TCP? A referência mostra o motivo.
Então, por que as pessoas usam o UDP?
fonte