Por que o UDP é mais lento que o TCP no Ubuntu Server?

2

Eu transfiro dados entre dois servidores Ubuntu (12.04) via iperf em 1Gb LAN.

iperf -s    <->     iperf -c <addr> -n2G
TCP speed = 925 Mbits/sec

iperf -su   <->     iperf -uc<addr> -b1G -n2G
UDP speed = 810 Mbits/sec
Jitter = 0.016 ms
Lost = 0 .. 0.01%

Eu esperava que o UDP fosse muito mais rápido que o TCP. Alguém poderia explicar por que o UDP é mais lento que o TCP no Ubuntu Server?

    
por Rom098 26.09.2012 / 11:27

3 respostas

9

Cada quadro passa por vários buffers à medida que você os envia: O buffer do aplicativo, o buffer do protocolo, o buffer da interface do software e o buffer da interface de hardware. À medida que você começa a enfatizar a pilha enviando dados de alta velocidade, você preenche esses buffers e bloqueia ou perde dados. Você também tem estratégias de pontualidade e pesquisa que podem afetar seu desempenho. Por exemplo, usando um buffer maior e pesquisando com menos frequência, você pode obter um desempenho muito melhor enquanto sacrifica a latência.

O TCP é otimizado para transferências em massa de alta velocidade, enquanto o UDP é otimizado para baixa latência no kernel do Linux. Isso tem um impacto nos tamanhos de buffer e em como os dados são pesquisados e entregues. Além disso, você freqüentemente tem descarregamento para hardware para TCP. Eu esperaria um desempenho consideravelmente melhor para o TCP comparado ao UDP.

Observe que o envio de dados em alta velocidade pelo UDP geralmente é uma má ideia, a menos que você implemente seu próprio controle de congestionamento. O TCP protege sua rede contra colapsos de congestionamento. Use o UDP quando você tiver pequenas quantidades de dados ou requisitos de alta pontualidade.

    
por 26.09.2012 / 13:13
9

Como foi dito acima, o iperf se limita ao design. Em src/Client.cpp , método

void Client::Run( void )

chama

ReportPacket( mSettings->reporthdr, reportstruct );

depois de escrever cada datagrama UDP.

ReportPacket() é bastante lento e atrasa a coisa toda.

No iperf3, as gravações de burst são introduzidas para o UDP, você pode especificar o número de gravações de burst no parâmetro de linha de comando -b , como -b 10240M/2000

caso contrário, você pode usar o netperf com -t UDP_STREAM .

    
por 15.01.2014 / 10:09
8

O problema está dentro do próprio iperf. Quando você envia um fluxo UDP iperf fará alguma contabilidade interna para cada datagrama no fluxo. Por outro lado, quando você envia um fluxo TCP iperf faz a contabilidade apenas uma vez por fluxo. Nas minhas medições, descobriu-se que o iperf-UDP desperdiça muito tempo fazendo as medições por datagrama, portanto, o desempenho mais lento.

Se você realmente quiser comparar o desempenho do TCP vs UDP, é melhor escrever seu próprio programa de teste. e certifique-se de que a quantidade de cálculos é a mesma em ambos os casos.

    
por 04.12.2012 / 15:56