微信扫描二维码咨询
编程语言正式进入大众视野
2014年,P4作为一种全新的专用编程语言正式进入大众视野,并且在网络界引起了极大地反响和关注。6个年头过去,随着P4的发展成熟,行业生态也逐步走向繁荣。业界首款完全P4可编程芯片Tofino于2016年推出,其后的Tofino 2于2018年推出。本篇将介绍基于可编程交换芯片的硬件负载均衡应用场景。
Tofino系列以太网交换机ASIC是P4可编程ASIC,其灵活的P4可编程性使网络建设者能够在其网络中进行更好的交换和路由,包括高效的负载平衡。传统的硬件交换价广泛使用基于可配置的header 信息或流信息做静态哈希来实现硬件的负载均衡,主要的应用就是基于二层转发的LAG 和基于三层转发的等价路由ECMP。但是,在实际应用中,基于流信息的HASH来实现的负载均衡有明显的缺陷。在现实世界中,流量是动态的,有些流的速率低,而有些流的速率却非常高。流的速率也可能是随着时间的变化而变化。静态哈希负载均衡无法感知动态流的变化信息,因此在实际应用中对物理带宽的使用效能可能不佳。也许有些用户可能通过配置不同的哈希算法,添加静态因子,选择不同的流信息等方式尝试匹配实际流量模型。但是静态哈希负载均衡始终无法在现实世界中实现动态流量的真正均衡。
Tofino可以为我们带来哪些高效的动态负载平衡?
首先,Tofino可以支持所有当前现有的固定哈希算法硬件负载平衡。支持丰富的标准哈希函数,例如CRC,XOR和相同的字段哈希或随机哈希。
Figure 1, ECMP path selection
基于基本的哈希多项式,Tofino可以支持客户自定义的哈希多项式。用户可以增加静态ECMP / LAG成员的权重,也可以在ECMP / LAG成员之间进行轮循。如果接收端可以容忍流的重新排序,则用户还可以P4 编程Tofino将数据包逐个分发到ECMP / LAG成员,以实现非常公平的硬件负载平衡。
Tofino还可以支持弹性哈希,以确保当ECMP / LAG的一个端口出现故障时,现有流保持其当前未受影响的路径,并且仅为新建流以哈希算法在无故障出口中选择均衡路径。
Tofino还能提供更漂亮的想法。用户可以通过对Tofino进行P4编程,以针对实际的动态流量场景进行各种动态负载平衡。
什么是Flowlet?Flowlet实际上就是micro-flow。一条流可以分成很多个flowlet,拥有相同的五元组。传统上每个流的ECMP选择路径,通常通过5元组或报文头的某种组合来检测流。在现实应用中,流量并非完全相同或相似。有些是老鼠流,有些是大象流。流的流量经常会随时间变化。有时,流量速率非常低,或闲置,有时流量速率很高。基于流的ECMP不能真正在任何时间之间实现流之间的平衡。好消息是TCP流量通常都是burst。在一个流中,有许多突发,并且在突发之间有相对较长的空闲时间,我们可以假设空闲时间大于等于α。每个突发都是一个小流。相同流的小流可以通过不同的ECMP路径,这不会引起任何重新排序问题。由于所有流量都被分成细小流量,因此在老鼠流或大象流之间也可以实现平衡。
通过P4编程Tofino可以很容易地实现流量开关flowlet 识别和均衡转发。通过对Tofino进行P4编程,以检测每个流和数据包延迟。这段只需几十行的P4代码,即可在数据平面中自动完成操作,而不会干扰控制平面。用户可以定义最小的空闲时间α,然后通过计算每个流的空闲时间来识别出Flowlet,并为每个Flowlet分配一个Flowlet ID。之后,只需基于<5-tuple,flow_id>运行ECMP选路。
通过用户特有流量模型选路,或通过流状态选路
还有更过关于使用P4编程动态选择路由路径的想法。用户可以更多得考虑实现完全适合他们自己的网络和应用程序的均衡算法。这里有一些分享的例子。
基于流的ECMP在处理大象流和老鼠流最困难。我们可以考虑特别处理大象流,每当检测到大象流时,都可以将其路由到备用路径,以免干扰其他流量的平衡。
网络中突然增加的流量可能会带来麻烦。大象流可能很少发生,但是,每当出现大象流时,它都会吞噬许多带宽并导致端口间带宽使用不平衡,或者导致一些关键流量丢失。可以考虑增加一段P4程序,在数据面自动检测ECMP所有路径的带宽占用情况,在流量很高时动态添加新路径,或在流量很低时动态删除路径。以监视ECMP路径的速率和流速。利用速率和带宽信息以及流信息 <流信息,速率,带宽> 进行动态平衡,以在物理路径中实现良好的均衡。
目前已经有很多用户在使用可编程芯片,大量得应用于数据中心物理网络,边缘物理网关,虚拟网关,CDN,运营商网络等等。使用可编程交换机,除了实现传统交换机功能,最主要的优势是可以根据用户需求,灵活修改添加特质化的应用,使得网络构建更加高效灵活。