Usando openvswitch com mpls e tcp

1

Estou fazendo pesquisa e desenvolvimento na SDN. Neste cenário, usamos rotulagem MPLS e Open vSwitch como software-switches. Estamos usando 2 nós de servidor com ovs 2.6.0, com módulos do kernel carregados e 2 hosts.

Eles são conectados diretamente através de conexões Ethernet de 1 Gigabit, e há cerca de 1 ms de rtt e, no caso do primeiro pacote, menos de 3 ms (usando o utilitário ping). Estou usando o Iperf3 para fazer os testes. O primeiro teste é o desempenho alcançado sem usar a rotulagem mpls, e o segundo teste está usando a rotulagem mpls. O MTU é ajustado para não fazer fragmentação, então esse não é o problema. Eu tentei ajustar a janela de congestionamento e outros parâmetros como o algoritmo TCP usado.

mar jul  4 12:21:09 CEST 2017
Connecting to host 192.168.20.2, port 5201
[  4] local 192.168.20.1 port 43526 connected to 192.168.20.2 port 5201
[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  4]   0.00-1.00   sec   112 MBytes   943 Mbits/sec    0    450 KBytes
[  4]   1.00-2.00   sec   112 MBytes   937 Mbits/sec    0    516 KBytes
[  4]   2.00-3.00   sec   112 MBytes   938 Mbits/sec    0    571 KBytes
[  4]   3.00-4.00   sec   112 MBytes   937 Mbits/sec    0    625 KBytes
[  4]   4.00-5.00   sec   112 MBytes   943 Mbits/sec    0    633 KBytes
[  4]   5.00-6.00   sec   111 MBytes   933 Mbits/sec    0    633 KBytes
[  4]   6.00-7.00   sec   111 MBytes   933 Mbits/sec    0    664 KBytes
[  4]   7.00-8.00   sec   112 MBytes   944 Mbits/sec    0    664 KBytes
[  4]   8.00-9.00   sec   111 MBytes   933 Mbits/sec    0    697 KBytes
[  4]   9.00-9.16   sec  18.8 MBytes   977 Mbits/sec    0    697 KBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-9.16   sec  1.00 GBytes   939 Mbits/sec    0             sender
[  4]   0.00-9.16   sec  1022 MBytes   935 Mbits/sec                  receiver

iperf Done.
<----------->
mar jul  4 12:40:10 CEST 2017
Connecting to host 192.168.20.2, port 5201
[  4] local 192.168.20.1 port 43530 connected to 192.168.20.2 port 5201
[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  4]   0.00-1.00   sec   203 KBytes  1.66 Mbits/sec   57   2.82 KBytes
[  4]   1.00-2.00   sec   398 KBytes  3.26 Mbits/sec  124   2.82 KBytes
[  4]   2.00-3.00   sec   400 KBytes  3.28 Mbits/sec  124   2.82 KBytes
[  4]   3.00-4.00   sec   319 KBytes  2.61 Mbits/sec  124   2.82 KBytes
[  4]   4.00-5.00   sec   398 KBytes  3.26 Mbits/sec  126   2.82 KBytes
[  4]   5.00-6.00   sec   395 KBytes  3.24 Mbits/sec  124   2.82 KBytes
[  4]   6.00-7.00   sec   398 KBytes  3.26 Mbits/sec  126   2.82 KBytes
[  4]   7.00-8.00   sec   324 KBytes  2.66 Mbits/sec  124   2.82 KBytes
[  4]   8.00-9.00   sec   398 KBytes  3.26 Mbits/sec  124   2.82 KBytes
[  4]   9.00-10.00  sec   400 KBytes  3.28 Mbits/sec  126   2.82 KBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-10.00  sec  3.55 MBytes  2.98 Mbits/sec  1179             sender
[  4]   0.00-10.00  sec  3.42 MBytes  2.87 Mbits/sec                  receiver

Eu sei que existem problemas usando o MPLS e usando o ovs, mas há alguns fatos que são estranhos nesse caso:

  • Se eu usar o UDP em vez do TCP, há um pacote fora de ordem, mas o resto é bom, então os pacotes estão usando o datapath do kernel, eu acho.
  • Existem 9 pacotes perdidos no início da transmissão TCP e há mais pacotes perdidos periodicamente. Observando os rastreios do tcpdump, esses pacotes estão "ausentes" no primeiro nó, porque no segundo salto eles não são capturados.
  • Como você pode ver acima, o desempenho usando a marcação TCP sem MPLS é muito bom.

Existe alguém que saiba como resolver esse problema?

PD: Com licença, pelos meus possíveis erros de digitação em inglês.

    
por Juan L. Cruz 04.07.2017 / 13:30

1 resposta

1

Depois de fazer algumas pesquisas, consegui isolar o problema e resolvê-lo. A NIC estava com algumas opções de checksum e offload ativadas, forçando o pacote a ir para o userspace, eu acho que estar encapsulado era o problema aqui.

Usando o utilitário ethtool , podemos desativar esse offloads. Neste caso, eu usei (como root):

ethtool -K <iface> gso off && ethtool -K <iface> tso off && ethtool -K <iface> gro off

Para desativar o TSO (TCP Segmentation Offload), o GSO (Generic Segmentation Offload) e o GRO (Generic Receive Offload). Também a soma de verificação de rx e tx está desativada.

fontes: Fonte 1 fonte 2

Espero que isso ajude alguém quando chegar a hora.

    
por 07.07.2017 / 13:13