三个理由告诉你,为什么在TF中必须使用MPLSoUDP



  • Tungsten Fabric大量使用了overlay,它的整个体系结构基于利用overlay来提供L2/L3虚拟化,并使底层IP fabric对虚拟工作负载透明。

    Tungsten Fabric支持三种封装类型,分别是:

    1. MPLSoGRE
    2. MPLSoUDP
    3. VXLAN

    其中,MPLSoGRE 和 MPLSoUDP用于L3虚拟化,而VXLAN用于L2虚拟化。

    如果我们计划实施L2用例,那么没什么可考虑的……VXLAN就对了!

    不过,在L3用例中出现了一个问题:选择基于GRE的MPLS?还是基于UDP的MPLS?

    正如行业中常见的那样,答案可能是“取决于”某些具体情况。不过,这里的答案却十分明确——必须是MPLSoUDP!
    在理解为什么选择MPLSoUDP之前,让我们先来看看何时需要使用MPLSoGRE。

    答案同样是不言而喻的,当我们不能使用MPLSoUDP时——这可能是因为我们的SDN GW运行的软件版本不支持MPLSoUDP——我们使用MPLSoGRE。

    除了这种情况以外,建议都使用MPLSoUDP!

    为了理解为什么MPLSoUDP更好,我们需要回顾一下如何构建MPLSoUDP数据包。

    2c5d6b3e-0087-4675-8077-72a39a92a8cd-image.png

    首先将原始raw数据包添加一个mpls标签。该标签表示服务标签,并且是contrail/sdn_gw将数据包与正确的virtual_network/vrf相关联的方式。

    接下来,添加UDP (+ IP)标头。UDP标头包括源端口和目标端口。源端口是对内部数据包执行哈希操作的结果。结果是,该字段将会出现很大变化。源端口带来了巨大的熵!

    而这种熵就是我们选择MPLSoUDP的原因!

    使用MPLSoUDP可以带来不同级别的优势。

    第一个好处是在SDN GW上体现的。假设你在SDN GW和计算节点之间有一条MPLSoUDP隧道。在两个端点之间有多个ECMP路径。

    f60941ad-7d9b-4d7b-925c-71367239f318-image.png

    选择一个ecmp路径到另一个路径是基于对数据包执行的哈希函数。为了获得更好的分发,我们需要很高的熵,并且正如我们所看到的,MPLSoUDP已经为我们提供好了!

    让我们看一个有关SN GW的示例:
    a4ae70ca-ce5d-4728-9b9f-e8a1c1ee4e67-image.png
    我们看到,有2个ecmp数据包流向计算节点。使用MPLSoUDP将使我们能够以更平衡的方式在两个路径之间分配数据包。

    如果我们查看从计算节点发送的数据包,则可以看到使用MPLSoUDP的另一个好处。

    考虑到接口vhost0是bod接口(将2个物理NIC连接在一起)的设置,那么我要说的就是正确的。

    5d4385e6-c9cc-487b-b6df-053842df2ae8-image.png

    在这种场景下,计算节点被多宿主到了两个叶子节点(运行evpn + vxlan的IP Fabric,使用esi处理多宿主CE)上。结果是,当数据包离开服务器时,将通过绑定的2个链接之一发送数据包。

    现在,基于绑定配置,根据哈希在两个链接之间进行选择。同样,使用MPLSoUDP会更好,因为它带来更多的熵,这意味着更好的分发。在所有bond成员之间平均分配流量,可能会导致流量在整个fabric中分配得很好!

    最后一条需要关注的MPLSoUDP好处,在于dpdk节点上的性能。要理解这一点,我们至少需要对dpdk vRouter的某些方面如何工作,在一个非常高的层级上有所了解。

    为DPDK vRouter分配了一定数量的核心(基于配置参数)。假设为vRouter分配了4个内核。结果就是,通过ethdev,dpdk vRouter会在物理NIC(vif0/0)上对4个队列进行编程。然后,我们就在vRouter核心和NIC队列之间建立了1:1映射。

    对于来自服务器外部的数据包(物理网卡接收数据包),vRouter核心充当轮询核心(vRouter核心可以执行其它角色,处理核心;只是在这里我们对dpdk vRouter的详细理解不感兴趣,因此我们以后讨论这个问题)。

    这里重要的是,充当轮询核心的每个vRouter核心都会不断检查其分配的物理网卡是否有要轮询的数据包。在进行轮询操作之前,物理网卡首先在线路上接收到数据包,然后将该数据包“发送”到一个队列中。为此,物理NIC在数据包上执行哈希操作。

    到这里,事情应该很清楚了。由于涉及哈希,MPLSoUDP确保我们可以在NIC队列上更好地分配流量。在NIC队列上更好地分配数据包,意味着可以在vRouter核心之间更好地分配数据包(请记住,nic队列和vRouter核心之间存在1:1映射关系)。

    d1f053f4-0cb1-4cbf-8c5c-d57d9a6b0310-image.png

    为什么在转发核心之间尽可能平衡地分配流量很重要?

    每个转发核心最多可以处理X个PPS(每秒数据包)。PPS间接意味着吞吐量。通常来说,PPS越高,吞吐量越高。

    让我们举个例子。例如每个转发核心最多可处理2M PPS。这意味着vRouter最多可以处理8M PPS。

    现在,假设使用MPLSoGRE。这种封装不能保证有效的流量分发。这就意味着,可能会将流量仅发送到4个转发核心中的2个(或者至少大多数流量可能主要落在4个转发核心中的2个上)。如果是这样,vRouter的性能大约为4M PPS(约占总容量的50%)。而如果使用MPLSoUDP,流量将更好地分布在所有4个转发核心上。这意味着vRouter总共可以达到8M PPS。换句话说,性能要好得多!

    总结:网关更好平衡,计算节点更好平衡,dpdk vRouter内部更好平衡。除非你的SDN GW仅支持MPLSoGRE,否则没有理由不适用MPLSoUDP,因为它只有好处!


    作者:Umberto Manferdini 译者:TF编译组
    原文链接:https://iosonounrouter.wordpress.com/2020/09/11/why-we-must-use-mplsoudp-with-contrail/
    (注:原文为Contrail,在本系列文章中,Tungsten Fabric的功能与Contrail一致)



Log in to reply