P4相关应用简介

INT

In-band Network Telemetry

Specification

http://p4.org/wp-content/uploads/fixed/INT/INT-current-spec.pdf

介绍

INT 是一种用来在数据平面上采集和报告网络状态的框架,它不需要控制平面的任何干预或支持。在 INT 的模型里,设备发出的数据包会包含“遥测”的报头字段。这些字段会告诉兼容 INT 的设备在需要转发包的时候需要收集哪些信息,并将其写入包中。

INT 流量源(比如应用程序,端主机网络栈,NIC,虚拟管理程序或者发送 ToR)等可以将指令嵌入在正常的数据包或者特殊的探测包中。类似地,INT 流量接收器可以取到(并有选择地报告)这些指令所收集到的结果。INT 流量收集器可以在转发的同时精确地利用从数据包里观察到的信息来监视数据平面的状态。

举例说明可以收集并处理的信息

  • OAM:可以只简单地将收集到的网络状态编码(可以使用元数据,或者进行简单的清洗或压缩),并且将其发送给额外的控制器。
  • 实时控制或者反馈环路:INT 流量接收器可以编码数据平面的信息并将控制信息反馈给流量源,流量源可以利用这些数据调整流量工程或者数据包的转发(比如进行显式的拥塞控制)。
  • 网络事件探测:如果收集到的路径信息表明需要立即注意或解决的状况(比如严重的拥塞或者数据平面被破坏,INT 流量接收器可以立刻报告一个网络事件,在集中式或者分布式的网络中形成一个控制回路)。

INT 体系结构式通用的,因此可以支持一些有趣的高层应用

比如:

  • 网络故障排除:L2 跟踪路由、微突发事件探测、数据包历史、轨迹采样
  • 高级拥塞控制:RCP、XCP、TIMELY
  • 高级路由:利用率感知路由(例如:CONGA)
  • 网络数据平面验证

可以监控的范围

  • 交换机级别的信息:交换机 ID
  • 入口信息:入口 ID,包进入时间
  • 出口信息:出口 ID,单跳延迟,出口链路利用率
  • 缓存信息:队列使用率,队列拥塞状态

INT 包封装

INT 头不在特定位置封装,INT 报头可以作为任何包的选项或者有效载荷插入其中,唯一的要求是有足够的空间承载 INT 信息,并且 INT 的源和接收器需要达成一致。

一些可能的位置:

  • INT over VXLAN(作为一个 VXLAN 的选项,每个 GPE 扩展)
  • INT over Geneve(作为一个 Geneve 选项)
  • INT over NSH(作为一个 NSH 选项)
  • INT over TCP(作为一个 TCP 选项或者载荷)
  • INT over UDP(作为一个载荷)

INT 元数据头格式

  • 每一个 INT 元数据头长度为 8B,每个元数据经常被以 4B 长度编码。
  • INT 指令被编码在一个 16bit 的指令区域,包括:Switch ID, Ingress Port ID, Hop latency, Queue occupancy, Ingress timestamp, Egress port ID, Queue congestion status, Egress port TX utilization
  • 沿着支持 INT 的路径,每个 INT 设备都会根据报头的指令添加自己的元数据值。
  • 添加元数据的时候,每个设备都必须在已经被上游设备添加的元数据之前添加信息,遇到不能添加或者其他问题,会有一些错误处理的机制。每个元数据都包含栈底比特确认是否为最后一个元素。

一个在 Geneve 选项中添加 INT 包的例子(示意图)

HULA

Hop-by-hop Utilization-aware Load Balancing Architecture

Specification

Scalable Load Balancing Using Programmable Data Planes

http://delivery.acm.org/10.1145/2900000/2890968/a10-katta.pdf

介绍

现在的数据中心网络有多路拓扑(如 Fat-Tree 和 Leaf-Spine)来提供大的平分带宽。这些拓扑都有大量的多路径,在两个终结点之间有许多路由。有效的数据平面多路流量均衡是有效利用带宽资源的一个重点。最常用的数据平面负载均衡的技术是 ECMP,它将每个流都随机分割给一个或多个路径。但是如果两个比较大的流量被分配给同一个路径的话,ECMP 的性能将会下降。CONGA 使用链路利用率信息,克服了 ECMP 的不足。但是 CONGA 是利用硬件进行流量均衡的,一旦部署算法将不能更改,而且设备内存有限,CONGA 并不能跟踪所有拓扑的信息,所以这阻碍了 CONGA 的拓展性。

HULA 比 CONGA 更加灵活,首先 HULA 只需要下一跳的信息,并且 HULA 是为可编程交换机所设计的。

HULA 使用特殊的探针(与数据包有所区分)来聚合整体的链路利用率信息。这些探针周期性地在网络中传输,并且覆盖了所有要进行负载均衡的路径。这些信息被处理并存放在每个交换机的一个表中。这个表给出了通往目的地的最佳下一跳目标。随后,每个交换机利用它所掌握的最佳的下游路径(最佳路径是所有路径的最大链路延迟中最小的那一个)来更新探针,并且发送给上游路由。这就像距离向量协议那样使得最佳路径在整个网络中传播。为了避免数据包乱序,HULA 使用 flowlet 作为均衡的粒度。

HULA 的特性:可伸缩,主动式,自适应、可编程

简单细节

每一个 ToR 在所有的上传链路中给数据中心网络发送 HULA 探针。探针可以被 ToR 的 CPU、交换机的数据平面或者连接到 ToR 的服务器发送。这些探针被定时周期发送,一旦收到探针,它将会被转发到下游的所有 ToR 和上游所有的 Spine 中,但保证不会形成环路。一旦探针到了另一端的 ToR,它的转发将会结束。控制平面会在数据平面设置多播组来使得这些探针可以被复制。

一个 HULA 探针包包含了一个 HULA 头和正常的以太网头以及 IP 头。HULA 头包含 torID 和 minUtil 两个字段。每个交换机为每个端口维持一个利用率估计值。一个交换机在将探针转发给其他交换机之前使用探针头和自身的链路利用率信息升级交换机的状态。

每个交换机维持一个最佳利用率的表和一个最佳下一跳表。这两个表都使用 Tor ID 进行索引。最佳利用率(pathUtil)表的每一行给出了从这个交换机到目的地 ToR 的最佳路径的链路利用率信息。最佳下一跳(bestHop)表的每一行是在最佳利用率表中到达目的 ToR 可以有最佳链路利用的下一跳交换机。

在计算最小的最大链路利用率的时候用了类似距离向量算法的流程。

交换机会保持现在的最佳下一跳表并在携带有使得其更新为更好的下一跳的探针到达时更新它。

HULA 在高负载时的表现