Perda extrema de pacotes UDP a 300Mbit (14%), mas TCP> 800Mbit sem retransmissões

11

Eu tenho uma caixa Linux que uso como iperf3cliente, testando 2 caixas de servidor Windows 2012 R2 equipadas de forma idêntica com adaptadores Broadcom BCM5721, de 1 Gb (2 portas, mas apenas 1 usada para o teste). Todas as máquinas são conectadas através de um único switch de 1Gb.

Testando UDP em, por exemplo, 300Mbit

iperf3 -uZVc 192.168.30.161 -b300m -t5 --get-server-output -l8192

resulta na perda de 14% de todos os pacotes enviados (para a outra caixa de servidor com exatamente o mesmo hardware, mas com drivers de NIC mais antigos, a perda é de cerca de 2%), mas a perda ocorre mesmo a 50Mbit, embora com menor gravidade. Desempenho do TCP usando configurações equivalentes:

iperf3 -ZVc 192.168.30.161 -t5 --get-server-output -l8192

produz velocidades de transmissão ao norte de 800Mbit, sem retransmissões relatadas.

O servidor é sempre iniciado usando as seguintes opções:

iperf3 -sB192.168.30.161

Quem é o culpado?

  1. A caixa do cliente linux (hardware? Drivers? Configurações?)? Edit: Acabei de executar o teste de uma caixa de servidor Windows para a outra e a perda de pacotes UDP a 300Mbit foi ainda maior, a 22%
  2. As caixas do servidor Windows (hardware? Driver? Configurações?)?
  3. O comutador (único) que conecta todas as máquinas de teste?
  4. Cabos?

Editar:

Agora eu tentei a outra direção: Windows -> Linux. Resultado: a perda de pacotes sempre é 0 , enquanto a taxa de transferência atinge o valor máximo em torno de

  • 840Mbit para -l8192, ou seja, pacotes IP fragmentados
  • 250Mbit para -l1472pacotes IP não fragmentados

Eu acho que o controle de fluxo limita o rendimento e evita a perda de pacotes. Especialmente neste último, o número não fragmentado não está nem perto do throughput TCP (o TCP não fragmentado gera números semelhantes ao TCP fragmentado), mas é uma melhoria infinitamente grande em relação ao Linux -> Windows em termos de perda de pacotes.

E como descobrir?

Eu segui o conselho usual para as configurações do driver no servidor para maximizar o desempenho e tentei ativar / desativar / maximizar / minimizar / alterar

  • Moderação de interrupção
  • Controle de fluxo
  • Buffers de recebimento
  • RSS
  • Wake-on-LAN

Todos os recursos de transferência estão ativados.

Editar Também tentei ativar / desativar

  • Ethernet @ Wirespeed
  • Os vários recursos de transferência
  • Prioridade e VLAN

Com taxas de perda semelhantes.


A saída completa de uma execução UDP:

$ iperf3 -uZVc 192.168.30.161 -b300m -t5 --get-server-output -l8192
iperf 3.0.7
Linux mybox 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt4-3 (2015-02-03) x86_64 GNU/Linux
Time: Wed, 13 May 2015 13:10:39 GMT
Connecting to host 192.168.30.161, port 5201   
      Cookie: mybox.1431522639.098587.3451f174
[  4] local 192.168.30.202 port 50851 connected to 192.168.30.161 port 5201
Starting Test: protocol: UDP, 1 streams, 8192 byte blocks, omitting 0 seconds, 5 second test
[ ID] Interval           Transfer     Bandwidth       Total Datagrams
[  4]   0.00-1.00   sec  33.3 MBytes   279 Mbits/sec  4262
[  4]   1.00-2.00   sec  35.8 MBytes   300 Mbits/sec  4577
[  4]   2.00-3.00   sec  35.8 MBytes   300 Mbits/sec  4578
[  4]   3.00-4.00   sec  35.8 MBytes   300 Mbits/sec  4578
[  4]   4.00-5.00   sec  35.8 MBytes   300 Mbits/sec  4577
- - - - - - - - - - - - - - - - - - - - - - - - -
Test Complete. Summary Results:
[ ID] Interval           Transfer     Bandwidth       Jitter    Lost/Total Datagrams
[  4]   0.00-5.00   sec   176 MBytes   296 Mbits/sec  0.053 ms  3216/22571 (14%)
[  4] Sent 22571 datagrams
CPU Utilization: local/sender 4.7% (0.4%u/4.3%s), remote/receiver 1.7% (0.8%u/0.9%s)

Server output:
-----------------------------------------------------------
Accepted connection from 192.168.30.202, port 44770
[  5] local 192.168.30.161 port 5201 connected to 192.168.30.202 port 50851
[ ID] Interval           Transfer     Bandwidth       Jitter    Lost/Total Datagrams
[  5]   0.00-1.01   sec  27.2 MBytes   226 Mbits/sec  0.043 ms  781/4261 (18%)
[  5]   1.01-2.01   sec  30.0 MBytes   252 Mbits/sec  0.058 ms  734/4577 (16%)
[  5]   2.01-3.01   sec  29.0 MBytes   243 Mbits/sec  0.045 ms  870/4578 (19%)
[  5]   3.01-4.01   sec  32.1 MBytes   269 Mbits/sec  0.037 ms  469/4579 (10%)
[  5]   4.01-5.01   sec  32.9 MBytes   276 Mbits/sec  0.053 ms  362/4576 (7.9%)

Execução TCP:

$ iperf3 -ZVc 192.168.30.161 -t5 --get-server-output -l8192
iperf 3.0.7
Linux mybox 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt4-3 (2015-02-03) x86_64 GNU/Linux
Time: Wed, 13 May 2015 13:13:53 GMT
Connecting to host 192.168.30.161, port 5201   
      Cookie: mybox.1431522833.505583.4078fcc1
      TCP MSS: 1448 (default)
[  4] local 192.168.30.202 port 44782 connected to 192.168.30.161 port 5201
Starting Test: protocol: TCP, 1 streams, 8192 byte blocks, omitting 0 seconds, 5 second test
[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  4]   0.00-1.00   sec   109 MBytes   910 Mbits/sec    0   91.9 KBytes       
[  4]   1.00-2.00   sec  97.3 MBytes   816 Mbits/sec    0   91.9 KBytes       
[  4]   2.00-3.00   sec  97.5 MBytes   818 Mbits/sec    0   91.9 KBytes       
[  4]   3.00-4.00   sec  98.0 MBytes   822 Mbits/sec    0   91.9 KBytes       
[  4]   4.00-5.00   sec  97.6 MBytes   819 Mbits/sec    0   91.9 KBytes       
- - - - - - - - - - - - - - - - - - - - - - - - -
Test Complete. Summary Results:
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-5.00   sec   499 MBytes   837 Mbits/sec    0             sender
[  4]   0.00-5.00   sec   498 MBytes   836 Mbits/sec                  receiver
CPU Utilization: local/sender 3.5% (0.5%u/3.0%s), remote/receiver 4.5% (2.0%u/2.5%s)

Server output:
-----------------------------------------------------------
Accepted connection from 192.168.30.202, port 44781
[  5] local 192.168.30.161 port 5201 connected to 192.168.30.202 port 44782
[ ID] Interval           Transfer     Bandwidth
[  5]   0.00-1.00   sec   105 MBytes   878 Mbits/sec                  
[  5]   1.00-2.00   sec  97.5 MBytes   818 Mbits/sec                  
[  5]   2.00-3.00   sec  97.6 MBytes   819 Mbits/sec                  
[  5]   3.00-4.00   sec  97.8 MBytes   820 Mbits/sec                  
[  5]   4.00-5.00   sec  97.7 MBytes   820 Mbits/sec                  
Eugene Beresovsky
fonte

Respostas:

8

Não tem problema. Esse é o comportamento normal e esperado.

O motivo da perda de pacotes é que o UDP não possui nenhum controle de congestionamento. No tcp, quando os algoritmos de controle de congestionamento entram em ação, o terminal de transmissão desacelera o envio para maximizar a taxa de transferência e minimizar a perda.

Portanto, esse é um comportamento totalmente normal para o UDP. O UDP não garante a entrega se a fila de recebimento estiver sobrecarregada e soltar pacotes. Se você deseja taxas de transmissão mais altas para UDP, precisa aumentar seu buffer de recebimento.

A opção -l ou --len iperf deve fazer o truque. E, possivelmente, a configuração da largura de banda de destino -b no cliente.

-l, --len n [KM] define o tamanho do buffer de leitura / gravação como n (padrão 8 KB)

8KB ?? isso é um pouco pequeno quando não há controle de congestionamento.

por exemplo, no lado do servidor.

~$ iperf -l 1M -U -s

É isso que eu recebo Linux para Linux

Client connecting to ostore, TCP port 5001
TCP window size: 85.0 KByte (default)
------------------------------------------------------------
[  3] local 192.168.0.107 port 35399 connected with 192.168.0.10 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec  1.10 GBytes   943 Mbits/sec

Mas para UDP usando as configurações padrão, recebo apenas

~$ iperf -u -c ostore 
------------------------------------------------------------
Client connecting to ostore, UDP port 5001
Sending 1470 byte datagrams
UDP buffer size:  208 KByte (default)
------------------------------------------------------------
[  3] local 192.168.0.107 port 52898 connected with 192.168.0.10 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec  1.25 MBytes  1.05 Mbits/sec
[  3] Sent 893 datagrams
[  3] Server Report:
[  3]  0.0-10.0 sec  1.25 MBytes  1.05 Mbits/sec   0.027 ms    0/  893 (0%)

WT?

Após algumas experiências, descobri que precisava definir o comprimento e o alvo da largura de banda.

~$ iperf -u -c ostore -l 8192 -b 1G
------------------------------------------------------------
Client connecting to ostore, UDP port 5001
Sending 8192 byte datagrams
UDP buffer size:  208 KByte (default)
------------------------------------------------------------
[  3] local 192.168.0.107 port 60237 connected with 192.168.0.10 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec  1.12 GBytes   958 Mbits/sec
[  3] Sent 146243 datagrams
[  3] WARNING: did not receive ack of last datagram after 10 tries.

Lado do servidor:

~$ iperf -s -u -l 5M 
------------------------------------------------------------
Server listening on UDP port 5001
Receiving 5242880 byte datagrams
UDP buffer size:  224 KByte (default)
------------------------------------------------------------
[  3] local 192.168.0.10 port 5001 connected with 192.168.0.107 port 36448
[ ID] Interval       Transfer     Bandwidth        Jitter   Lost/Total Datagrams
[  3]  0.0-10.1 sec  1008 KBytes   819 Kbits/sec   0.018 ms    0/  126 (0%)
[  4] local 192.168.0.10 port 5001 connected with 192.168.0.107 port 60237
[  4]  0.0-10.0 sec  1.12 GBytes   958 Mbits/sec   0.078 ms    0/146242 (0%)
[  4]  0.0-10.0 sec  1 datagrams received out-of-order

Para demonstrar a perda de pacotes com pequenos buffers. Ser honesto não é tão extremo quanto eu esperava. Onde é uma fonte confiável para o iperf3 contra o qual posso testar entre Linux / Windows?

~$ iperf -u -c ostore -l 1K -b 1G
------------------------------------------------------------
Client connecting to ostore, UDP port 5001
Sending 1024 byte datagrams
UDP buffer size:  208 KByte (default)
------------------------------------------------------------
[  3] local 192.168.0.107 port 45061 connected with 192.168.0.10 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec   674 MBytes   565 Mbits/sec
[  3] Sent 689777 datagrams
[  3] Server Report:
[  3]  0.0-10.0 sec   670 MBytes   562 Mbits/sec   0.013 ms 3936/689776 (0.57%)
[  3]  0.0-10.0 sec  1 datagrams received out-of-order

Lado do servidor:

~$ iperf -s -u -l 1K 
------------------------------------------------------------
Server listening on UDP port 5001
Receiving 1024 byte datagrams
UDP buffer size:  224 KByte (default)
------------------------------------------------------------
[  3] local 192.168.0.10 port 5001 connected with 192.168.0.107 port 45061
[ ID] Interval       Transfer     Bandwidth        Jitter   Lost/Total Datagrams
[  3]  0.0-10.0 sec   670 MBytes   562 Mbits/sec   0.013 ms 3936/689776 (0.57%)
[  3]  0.0-10.0 sec  1 datagrams received out-of-order

Você também consultou o leia-me da página do iperf3 no github ?

Problemas conhecidos

Desempenho do UDP: Alguns problemas foram observados com o iperf3 na plataforma de teste ESnet 100G a altas taxas de UDP (acima de 10 Gbps). O sintoma é que, em qualquer execução específica do iperf3, o receptor relata uma taxa de perda de cerca de 20%, independentemente da opção -b usada no lado do cliente. Esse problema parece não ser específico do iperf3 e pode ser devido ao posicionamento do processo do iperf3 em uma CPU e sua relação com a NIC de entrada. Em alguns casos, esse problema pode ser atenuado pelo uso apropriado da opção de afinidade da CPU (-A). (Edição nº 55)

Você está usando uma NIC mais lenta, mas eu me pergunto se ela está relacionada.

Matt
fonte
Sim, e quanto à perda de pacotes, mostrarei como isso pode acontecer. resposta atualizada.
Matt
Obrigado Matt, acabei de ver sua atualização. Meu iperf (no servidor Windows e no cliente Linux) é a versão 2.0.5. O que é seu?
Eugene Beresovsky
O mesmo. Na verdade, quando eu defino a largura de banda de destino como 1G, recebo taxas de largura de banda de 14756449370562973696 bytes / segundo e outra saída corrompida. Então eu acho que provavelmente está quebrado. Ainda acho que os problemas são buffers ... Eu sei que o Windows faz algumas coisas incomuns com o buffer TCP e UDP.
Matt
Estranho. Ainda hoje, provavelmente terei acesso a um bom ambiente de produção 10G e liberarei o iperf3 nesse. Vamos ver como isso vai.
Eugene Beresovsky
1
Eu acho que você não entende o que o -lswitch faz. Não define o tamanho do buffer; define o tamanho do pacote. Essa é a quantidade de dados que o iperf3 gravará no soquete de uma só vez e lerá do soquete de uma só vez. Você pode definir o tamanho do buffer do soquete usando -w. Se você olhar a fonte, verá que ela chama setsockopt()para definir o tamanho do buffer do soquete para o que você especificou depois -w.
András Korn
0

Você perdeu completamente o culpado mais óbvio - os adaptadores e, em seguida, os drivers (você afirma que o uso de drivers de versão diferentes gera resultados diferentes).

Tente desativar todos os recursos de transferência.

Dani_l
fonte
Isso não ajudou - pergunta atualizada em conformidade.
Eugene Beresovsky