使用带有 mpls 和 tcp 的 openvswitch

使用带有 mpls 和 tcp 的 openvswitch

我正在从事 SDN 研发工作。在这种情况下,我们使用 MPLS 标签和 Open vSwitch 作为软件交换机。我们使用 2 个服务器节点,其中安装了 ovs 2.6.0,加载了内核模块,还有 2 个主机。

它们通过 1 千兆以太网连接直接连接,rtt 大约为 1 毫秒,第一个数据包的情况下小于 3 毫秒(使用 ping 实用程序)。我使用 Iperf3 进行测试。第一个测试是在不使用 mpls 标签的情况下达到的性能,第二个测试是使用 mpls 标签。MTU 调整为不进行分段,因此这不是问题。我尝试调整拥塞窗口和其他参数,例如使用的 TCP 算法。

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

我知道使用 MPLS 和 ovs 存在问题,但在这种情况下有一些奇怪的事实:

  • 如果我使用 UDP 而不是 TCP,则有一个数据包会乱序,但其余的都很好,所以我猜数据包正在使用内核数据路径。
  • 在 TCP 传输开始时有 9 个数据包丢失,并且周期性地丢失了更多数据包。查看 tcpdump 跟踪,这些数据包在第一个节点中“丢失”,因为在第二个跳转中它们没有被捕获。
  • 从上面可以看出,使用不带 MPLS 标签的 TCP 的性能非常好。

有人知道如何解决这个问题吗?

PD:请原谅我可能出现了英文拼写错误。

答案1

经过一番研究,我设法找出问题并解决它。NIC 激活了一些校验和和卸载选项,迫使数据包进入用户空间,我猜封装是这里的问题所在。

使用ethtool实用程序我们可以禁用此卸载。在本例中,我使用(以 root 身份):

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

禁用 TCP 分段卸载 (TSO)、通用分段卸载 (GSO) 和通用接收卸载 (GRO)。同时禁用 rx 和 tx 校验和。

来源:来源1 来源2

我希望到时候这能对某人有所帮助。

相关内容