文章

RoCE基础知识学习(一)

RoCE是RDMA over Converged Ethernet的缩写,是一种基于以太网的RDMA技术,本文主要介绍RoCE的基础知识。RDMA是为了解决分布式计算中网络瓶颈的问题,提供了一种低延迟、高吞吐的无损网络方案。由于最近在进行交换机方案上的调研,所以先了解下交换机对于RoCE的支持主要做了什么。

最好奇的点是,RoCE是如何实现无损网络的,经过初步调研发现大部分是通过PFC和ECN来实现的,所以先了解下这两个技术。

交换机是如何运作 PFC 的?

结论:PFC+ECN是无损网络的核心特性,基于这两个特性可以实现一个无损网络。

pause帧机制

PFC的核心功能是网络上遇到即将拥塞时,会对某个优先级的报文进行控制,控制方式就是反向发送pause帧,让发送方暂停发送。这个反向工作是逐跳回压的,如果某个交换机并不存在拥塞,则它不会往回发送pause帧。 发送pause帧不是暂停所有报文,而是针对某个优先级的报文进行暂停的,下面说明报文优先级是怎么定义的。

报文优先级

PFC的意思是Priority-based Flow Control,即基于优先级的流量控制。定义报文优先级的方式有几种:

  • dot1p
    • dot1p定义了一种在以太网帧中添加优先级信息的方法,是802.1Q VLAN标签的一部分
    • dot1p定义了8个优先级级别(0-7),用3个比特来表示
    • 这3个比特位于以太网帧的VLAN标签中,具体在用户优先级字段
  • DSCP
    • DSCP是IPv4和IPv6数据包头部中用于分类和管理网络流量的6位字段
    • 在IP头部的ToS(Type of Service)字段中,占用前6位
    • DSCP有64个可能的值(0-63),允许对网络流量进行细粒度的分类
  • 网络端口

DSCP 中的 QoS 并不是可以全部用来搞 PFC 的,协议里规定了一些区间: 0 (000000): 尽力而为(Best Effort) 8 (001000): CS1,低优先级数据 16 (010000): CS2,即时数据 24 (011000): CS3,呼叫信令 32 (100000): CS4,视频会议 40 (101000): CS5,语音数据 46 (101110): EF(Expedited Forwarding),用于低延迟、低抖动、低丢包的应用 48 (110000): CS6,网络控制

举例流程如下图: alt text

无损网络是不允许丢包的,因此哪怕发了pause帧,“路上”的报文也不能丢弃,因此交换机需要一些缓存空间用来暂存来不及转发的报文,下面介绍交换机的缓存机制。

交换机缓存

交换机有三种存储空间:

  • guaranteed
  • shared
  • headroom

使用机制如图: 交换机缓冲区示意图

交换机的基础调度空间一般叫做cell

设置各个缓冲区大小,以及触发pause帧的大小,通常叫做门限,下面说明可以配置的门限一般有哪些。

门限

可用的门限一般有以下:

  • Headroom 缓存门限 表示什么时候使用headroom缓存
  • 反压帧触发门限 表示什么时候开始发送反压帧
  • 反压帧停止门限与触发门限间的偏移量 表示什么时候停止发送反压帧
  • PFC 预留门限 表示每个端口预留的PFC缓存空间
  • Headroom 最大可用的cell 资源 表示headroom缓存的最大容量

关于Headroom的一个示例,实际配置与接口传输速率和距离有关: 工作流程示例: 假设有以下配置

  • 正常队列缓冲区:1000 cells
  • Headroom缓存门限:800 cells
  • Headroom最大可用资源:500 cells

工作流程:

  • 当队列长度低于800 cells时,数据包进入正常缓冲区。
  • 队列长度达到800 cells时,新到达的数据包开始进入headroom。
  • Headroom可以继续接收数据包,直到使用了500 cells(其最大容量)。
  • 如果headroom也被填满,后续到达的数据包可能会被丢弃。

交换机在到达pause门限后会发送pause帧,发送方收到pause帧后会暂停发送,这样就实现了流量控制。但是,如果交换机群里互相发送pause帧,就会出现死锁的情况,下面介绍死锁的情况。

死锁

交换机在收到pause帧后,会暂停某个优先级的报文的转发,而解除暂停的条件是收到PFC XON帧,如果这个时候所有交换机都不发这个PFC XON帧,则会产生死锁,一般出现在环形拓扑中。 spine-leaf拓扑中的死锁举例说明如下:

  1. 假设 2个Spine交换机(S1和S2) 4个Leaf交换机(L1, L2, L3, L4) 每个Leaf连接到两个Spine 多个服务器连接到每个Leaf

  2. 初始状态: L1上的服务器正在向L3发送大量数据(流1) L2上的服务器正在向L4发送大量数据(流2) L3上的服务器正在向L1发送大量数据(流3) L4上的服务器正在向L2发送大量数据(流4) 如图:
    1
    2
    3
    4
    5
    6
    
         S1    S2
        /  \  /  \
       /    \/    \
      /     /\     \
     L1    L2 L3    L4
    
  3. 拥塞开始形成: 流1和流3在S1上相遇,开始填满S1的缓冲区 流2和流4在S2上相遇,开始填满S2的缓冲区 PFC机制触发: S1的缓冲区接近满时,向L1和L3发送PFC暂停帧 S2的缓冲区接近满时,向L2和L4发送PFC暂停帧 流量停止但缓冲区仍满: L1停止向S1发送数据,L3也停止向S1发送数据 L2停止向S2发送数据,L4也停止向S2发送数据 但S1和S2的缓冲区仍然接近满的状态

  4. 死锁形成: L1无法向L3发送数据,因为S1被阻塞 L3无法向L1发送数据,因为S1被阻塞 L2无法向L4发送数据,因为S2被阻塞 L4无法向L2发送数据,因为S2被阻塞

  5. 循环依赖: 形成了一个循环依赖:L1等待L3,L3等待L1,L2等待L4,L4等待L2 每个Leaf都在等待其他Leaf释放资源,但由于PFC暂停,没有Leaf能够继续发送数据

死锁的解决方法一般就是忽略pause XOFF 帧。

小结

PFC 能构成无损网络的关键是交换机提供足够的缓存空间,以及配合门限实现部分流控,只要交换机不溢出丢包就行。但是存在一个问题,服务器还是不停的在往交换机发包,如果问题出在端侧,端侧不停下来收发包,则交换机这些配置都没用迟早还是得溢出缓冲区。

ECN是怎么工作的?

ECN是一种IP层的标记,标记主要包括:

  • ECT(ECN-Capable Transport),表示终端是否支持ECN
  • CE(Congestion Experienced),表示网络上遇到拥塞 具体看图: alt text

工作原理比较简单: alt text 可以看到终端如果支持拥塞控制则会在报文上标记ECT,中间交换机如果发现拥塞则会标记CE,终端收到报文后如果需要控制拥塞则发CNP报文,发送端收到CNP则会进行降速。

PFC和ECN如何配合

PFC主要处理通过调整停止收包,“放水”来防止交换机缓冲溢出,但是如果终端消费报文慢,还是需要通过ECN调整发包速率来最终解决问题。 PFC生效快,可以防止交换机丢包,ECN生效慢,但是可以防止丢包,二者合起来通过调参可以实现一个无损网络。

总结

PFC和ECN通过调参影响发包速率和中间节点缓存大小来实现无损网络,但是参数设置不好也会丢包并不是最终解决问题的方法。 不过给了一个前人的思路,无损网络本质是需要终端和网络设备共同配合最大的利用自身的能力而不要溢出。那么导致溢出的原因有以下:

  • 转发交换机能力不均,前驱节点速度过快
    • 扩展一下,假如前驱节点有多个,那么单设备能力强也没用,因此需要让报文多路径传输
  • 接入交换机能力不足,终端速度过快
    • 如果终端太多那么交换机能力也没办法,需要终端分布式决策发包或者限速

本质上来说,PFC和ECN实现的无损有种面多了加水,水多了加面的感觉,水就是流量,面就是buffer。感性上来说,无损网络应该是一个端到端耦合并统一设计的网络。

本文由作者按照 CC BY 4.0 进行授权