魏国武 QingStor 资深研发工程师
近 10 年企业级软件开发经验,专注于大规模分布式存储研发,擅长集群性能调优、高可用研究及容灾。
为什么需要 RDMA
当今是云计算、大数据的时代,企业业务持续增长需要存储系统的 IO 性能也持续增长。传统的 TCP/IP 技术在数据包处理过程中,要经过操作系统及其他软件层,数据在系统内存、处理器缓存和网络控制器缓存之间来回进行复制,给服务器的 CPU 和内存造成了沉重负担。尤其是网络带宽、处理器速度与内存带宽三者的严重"不匹配性",更加剧了网络延迟效应。为了降低数据中心内部网络延迟,提高带宽,RDMA 技术应运而生。RDMA 允许用户态的应用程序直接读取和写入远程内存,避免了数据拷贝和上下文切换;并将网络协议栈从软件实现 offload 到网卡硬件,实现了高吞吐量、超低时延和低 CPU 开销的效果。
当前 RDMA 在以太网上的传输协议是 RoCEv2,RoCEv2 是基于无连接协议的 UDP 协议,相比面向连接的 TCP 协议,UDP 协议更加快速、占用 CPU 资源更少,但其传输是不可靠的,一旦出现丢包会导致 RDMA 的传输效率降低,这是由 RDMA 的 Go-back-N 重传机制决定的。RDMA 接收方网卡发现丢包时,会丢弃后续接收到的数据包,发送方需要重发之后的所有数据包,这导致性能大幅下降。所以要想 RDMA 发挥出其性能,需要为其搭建一套不丢包的无损网络环境。
差异化流量分类
构建无损网络,首先需要对网络流量进行分类,然后针对不同类别流量采用具体流控策略,实现精确控制,避免相互影响。流量分类有两种不同的分类方法:传输层(Layer 2)和网络层(Layer 3)。Layer2 通过 vlan header(802.1q)里的 PCP(802.1p)位进行分类,对应 CoS(Class of Service);Layer3 通过 IP header 里的 DSCP 进行分类,对应 DSCP。
Layer 2 流量分类
Layer2 层流量分类依据的是 vlan tag 中的 3 位 PCP bit,总共有 8 个类别。3 个 bit 是 Header 中第 3 个 byte 的前三位,如下图。在使用 Layer 2 流量分类时,主机端发出的包需要带有 vlan tag。因此要对网卡配置 vlan,并且设置优先级。因为 L2 层 PFC 需要依靠 vlan,因此包经过三层交换机时可能存在 tag 失效等问题。
Layer 3 流量分类
Layer3 使用 IP 包头中的 TOS 前 6 位(DSCP),支持 64 种不同的流量分类方式,TOS 的后两位用作 Explicit Congestion Notification(ECN)Field, ECN 是一种端到端的流控方式,后面会有介绍。
选择 Layer2 还是 Layer3 层流控
在交换机支持 DSCP 的条件下,建议使用 L3 层的流控方式。从前面的介绍可以看到,L3 层的控制方式可跨多层交换机,DSCP 值在端到端的传输过程中不会发生变化。RoCE 使用 UDP 报文进行数据传输,建议 RoCE 的流控使用基于 DSCP 的方式。
构建无损网络
基于 DSCP 或 PCP 的 PFC 流控机制
IEEE 802.1Qbb(Priority-based Flow Control,基于优先级的流量控制)简称 PFC,是 IEEE 数据中心桥接(Data Center Bridge)协议族中的一个技术,是流量控制的增强版。
我们先看一下 IEEE 802.3X(Flow Control)流控的机制:当接收者没有能力处理接收到的报文时,为了防止报文被丢弃,接收者需要通知报文的发送者暂时停止发送。IEEE 802.3X 协议存在一个缺点:一旦链路被暂停,发送方就不能再发送任何数据包,如果是因为某些优先级较低的数据流引发的暂停,结果却让该链路上其他更高优先级的数据流也一起被暂停了,这是得不偿失的。
PFC 在基础流控 IEEE 802.3X 基础上进行扩展,允许在一条以太网链路上创建 8 个虚拟通道,并为每条虚拟通道指定相应优先级,允许单独暂停和重启其中任意一条虚拟通道,同时允许其它虚拟通道的流量无中断通过。PFC 将流控的粒度从物理端口细化到8个虚拟通道,分别对应 Smart NIC 硬件上的 8 个硬件发送队列,如下图。
在二层网络中,PFC 使用 vlan 中的 PCP 位来对数据流进行区分;在三层网络中,PFC 既可以使用 PCP,也可以使用 DSCP,使得不同数据流可以享受到独立的流控制。当下数据中心因多采用三层网络,且 DSCP 值在端到端的传输过程中不会发生变化,故推荐使用 DSCP。
RDMA 无损网络中利用 PFC 流控机制,实现了交换机端口缓存溢出前暂停对端流量,阻止了丢包现象发生,但因为需要一级一级反压,效率较低,而且存在不公平问题和 Head-of-Line 堵塞问题。此外,PFC 是通过下游网络设备对上游设备的控制方式达到不丢包的目的,但最有效的流控应该是控制产生数据的源端主机的发送速度,使得主机往网络中注入数据速度放缓,这是解决问题的根本方法。
基于三层网络的拥塞管理(ECN与DCQCN)
DCQCN 是基于交换机和网卡上的 ECN 技术来实现 Rocev2 的一种综合流控技术。使能ECN(Explicit Congestion Notification 显式拥塞通知),交换机会在检测到拥塞时对网络数据包打标记,在 IP 数据包头部嵌入一个拥塞指示器,可以通知客户端降低数据包发送频率,是一种端到端的拥塞管理方案。该功能可以用于 RoCEv2 的拥塞控制。
ECN 使用 IP 头部的两个 bit 来表示,这两个 bit 分别叫做 ECT(ECN-capable Transport)位和CE(Congestion Experienced)位。这两个 bit 是 IP 头部的 DSCP 域中的第 6/7 位,见图 2。ECN 值为 01 或 10 表示数据发送端使能 ECN;00 表示未使用ECN;11 表示发生拥塞。
ECN 值 | 含义 |
---|---|
0 | 未使用或不支持 ECN |
1 | 发送端使能 ECN |
10 | 发送端使能 ECN |
11 | 发生拥塞 |
ECN 的交互过程
- 发送端发送的 IP 报文标记支持 ECN(10);
- 交换机在队列拥塞情况下收到该报文,将 ECN 字段修改为 11 并发出,网络中其他交换机透传;
- 接收端收到 ECN 为 11 的报文发现拥塞,正常处理该报文;
- 接收端产生拥塞通告,每 ms 级发送一个 CNP(Congestion Notification Packets)报文,ECN 字段为 01,要求报文不能被网络丢弃。接收端对多个被 ECN 标记为同一个 QP 的数据包发送一个单个 CNP 即可;
- 交换机收到 CNP 报文后正常转发该报文;
- 发送端收到 ECN 标记为 01 的 CNP 报文解析后对相应的流(对应启用 ECN 的 QP)应用速率限制算法。
需要注意的是,CNP 作为拥塞控制报文,从发送端到接收端经过的每一台设备、每一条链路都会有一定的延迟,会最终加大发送端接收到 CNP 的时间,若发送端不能及时降速,仍然可能造成丢包。建议同时配置 ECN 和 PFC,通过调整两者的 buffer 水线,让 ECN 快于 PFC 触发,使发送端降低发送速率。若 ECN 未及时触发,需要触发 PFC 使上游交换机暂停发包,以避免 buffer 溢出导致丢包。
总结
我们在三层网络以 DSCP 方式对网络流量分类实现了对 RDMA 流量的精确控制,通过配置 PFC 和 ECN 构建无损网络解决了丢包问题,从而保证了 RDMA 网络高吞吐量、超低时延和低 CPU 开销的落地。
更多文章
本文由博客一文多发平台 OpenWrite 发布!