概述
本文介绍了RDMA技术的发展沿革,分析了RDMA所需的无损网络的技术要求,讨论了PFC技术实现时的交换机内部缓存技术,死锁问题等常见问题,并介绍了ECN运作机制。
1.引言
以太网一直是网络技术的主流,在不同的历史时期,它总是遇到一些竞争对手,如ATM,但人们还是在不断吸取其他技术的优点来完善它,继续使用它。在当前大规模互联网,人工智能等需要高带宽,低延迟的应用环境下,以太网利用RoCEv2等RDMA新技术,再次表现出新的活力,为行业所接收。本文将介绍DRMA技术和其相关网络技术和应用。
2.RDMA发展沿革
传统的TCP/IP架构设计因为其诞生的时代限制,存在着网络传输延迟较大、多次数据拷贝和中断处理等问题。RDMA(RemoteDirect MemoryAccess),远程直接内存访问技术,就是为了解决网络传输中服务器端数据处理的延迟而产生的技术。RDMA将数据直接从一台计算机的内存传输到另一台计算机,无需双方操作系统的介入。这允许高吞吐、低延迟的网络通信,尤其适合在大规模并行计算机集群中使用。通过网络将数据直接传入计算机的存储区间,将数据从一个系统快速传输服务器的存储空间,消除了传输过程中需要多次数据复制的操作,因而能解放内存带宽和CPU周期用于改进应用系统性能。
RDMA发展经历了3种技术,Infiniband,iWarp,RoCEv1和RoCEv2。
Infiniband
2000年IBTA(InfiniBandTradeAssociation)发布了最早的RDMA技术,Infiniband。它是专为RDMA设计的网络,从硬件级别保证可靠传输。提供了基于通道的点对点消息队列转发,每个应用自己都可通过创建的虚拟通道直接获取本应用的数据消息。InfiniBan技术采用了RDMA技术,可以进行远程节点直接读写访问。InfiniBand属于原生的RDMA,必须使用InfiniBan交换机和InfiniBan网卡才可实现。
iWarp(internetWide Area RDMA Protocol)
互联网广域RDMA协议,即RDMAover TCP,是IEEE/IETF标准化的技术。允许通过TCP执行RDMA的网络协议。这允许在标准以太网基础架构(交换机)上使用RDMA,只不过网卡要求是支持iWARP(如果使用CPUoffload的话)的NIC。否则,所有iWARP栈都可以在软件中实现,但是失去了大部分的RDMA性能优势。
RoCE(RDMAover Converged Ethernet)
2010年4月,IBTA发布了RoCEv1,此标准是作为InfinibandArchitecture Specification的附加件发布的,所以又被称为IBoE(InfiniBandoverEthernet)。RoCE标准是在以太链路层之上用IB网络层代替了TCP/IP网络层,不支持IP路由功能。以太类型为0x8915。在RoCE中,infiniband的链路层协议头被去掉,用来表示地址的GUID被转换成以太网的MAC。Infiniband依赖于无损的物理传输,RoCE也同样依赖于无损的以太传输,
RoCEv2
由于RoCEv1的数据帧不带IP头部,只能在2层网络内通信。为了解决此问题,2014年IBTA提出了RoCEV2,RoCEv2扩展了RoCEv1,将GRH(GlobalRoutingHeader)换成UDPheader + IPheader。采用UDPPort4791进行传输。由于RoCEv2报文在3层的可进行路由,所以有时又会称为“RoutableRoCE”或简称“RRoCE”。如下图所示:
RoCE技术可通过普通以太网交换机实现,但服务器需要支持RoCE网卡。由于RoCE是UDP协议,虽然UDP协议效率比较高,但不像TCP协议那样有重传机制等来保障可靠的传输,一旦出现丢包,必须依靠上层应用发现了再做重传,这就会大大降低RDMA的传输效率。所以要想发挥出RoCE的真正的效果,必须要为RDMA搭建一套不丢包的无损网络环境。
RoCE可以运行在无损网络环境和有损网络环境中,如果运行在有损网络环境中,称为弹性RoCE(ResilientRoCE);如果运行在无损网络环境中,称为无损RoCE(LosslessRoCE)
3.PFC功能
无损以太网,在网络设备上至少需要支持2大关键功能,PFC和ECN。
3.1PFC(Priority-basedFlowControl,基于优先级的流量控制):当交换机端口的接收队列超过一定阀值(shreshold)时,就会向对端发送PFC暂停报文(pauseframe),通知发送端停止发包或者降低速率。当接收队列低于另一个阀值时,就会发送一个pausewith zeroduration,通知发送端恢复发包。PFC是链路层协议,只能针对端口进行流控,颗粒度较粗。一旦发生拥塞,会导致整个端口停止(后文有极端案例介绍)。这就不太合理。
正常情况下,当一台交换机的端口出现拥塞并触发XOFF水线时,数据进入的方向(即下游设备)将发送PAUSE帧反压,上游设备接收到PAUSE帧后停止发送数据。如果其本地端口缓存消耗超过阈值,则继续向上游反压。如此一级级反压,直到网络终端服务器在PAUSE帧中指定PauseTime内暂停发送数据,从而消除网络节点因拥塞造成的丢包。
PFC在IEEE802.3X流控的基础上进行扩展,允许在一条以太网链路上创建8个虚拟通道,并为每条虚拟通道指定相应优先级,允许单独暂停和重启其中任意一条虚拟通道,同时允许其它虚拟通道的流量无中断通过。一般将RoCE的数据流和TCP/IP等其它数据流设置不同的优先级。如可以按照Vlan或者DSCP来分类。如下图所示:
3.2 常见芯片内部缓存机制
鉴于目前市场上绝大多数的交换机厂家都使用博通(Broadcom)的交换芯片,特别是数据中心的ToR交换机多采用博通XGS系列芯片,所以市场上绝大部分交换机都有相同类似的PFC功能。故下文将以博通XGS对PFC的处理为例,展开介绍。博通XGS系列芯片都有一个缓存管理单元MMU(memorymanagementunit),它设计了PG-Guaranteed、PG-Share、Headroom三种类型的入端口缓存。根据芯片型号的不同,缓存大小会有所不同。
Guaranteed:固定缓存区,为端口提供最小保证可用的缓存空间。
Share:共享缓存区,当最小保证空间不足时,为端口提供的共享缓存空间。
PG_Headroom:当最小保证空间与共享缓存空间都不足时,再提供一些额外的缓存空间。该缓存空间主要是用来存储,当流控帧发送出去到对端停止发送报文的这段时间,可能会收到对端发送过来的部分报文。
GlobalHeadroom:如果没有为每个端口单独分配PGheadroom,则用这部分缓存空间作为所有端口的PGheadroom共享空间。如下图所示:
缓存规则是在报文接收时,优先使用guaranteed固定缓存区,然后使用共享缓存区,最后使用headroom缓存区;当报文发送后,则优先释放headroom缓存区,然后是共享缓存区,最后是固定缓存区。
缓存大小被称为阈值(threshold),也经常被称作水线(watermark),当缓存区被使用完毕,就称之为“缓存水位”到达了“某水线”。
上述缓存的使用,有一些最佳实践:
因为PG-Guaranteed是固定大小,所以是无法调节的。
PG-share,共享缓存,有一个动态缓存水线的技术(DynamicMemoryThresholds)。该机制基于可用的共享内存来调整丢弃阈值,从而保持公平性,并对在共享缓冲区的高突发数据进行吸收。动态阈值是可用缓冲存储器的线性函数,乘以比例因子(α)。其使用的条件是,如果当前缓存使用>α*可用缓存,则丢包。例如:α= 4, A = 100, Q1 = 420, 因为420> 4*100,所以丢包。
Headroom,是在PFC启动后,到PFC真正工作的时间间隔之间的报文,用来缓存报文的。Headroom空间大小和以下4个因素相关:
- PG检测到XOFF用完,触发到了XOFF水线,到构造PFC帧发出的时间(固定值)
- 上游收到下游传上来的PFC 暂停帧,到停止队列转发的时间(固定值)
- PFC暂停帧在链路上的传输时间(和线缆/光纤距离成正比)
- 队列暂停发送后链路中报文的传输时间(和线缆/光纤距离成正比)
一个参考的最佳实践是100G端口,连接100M光纤,headroom为408cell。
在现实操作上,在思科使用博通芯片的nexus3k数据中心交换机上有下列配置命令可以激活PFC:
interface{{type slot/port}|{port-channel number}}
(config-if)#priority-flow-controlmode <on/off/auto>
下列配置命令可以调节pause帧缓存和动态缓存空间:
hardwareqosinternal-interface pause buffer-sizebuffer-sizepause-thresholdxoff-sizeresume-thresholdxon-size
下列配置命令可以调整headroom存储空间比例:
platform|hardware } qos { ing-pg-hdrm-reserve percent <percent-val> [module<module>
3.3PFC背压带来的网络拥塞问题
当交换机的入端口流量大于出端口的带宽时,会发生网络拥塞。典型的例子是多打一,即多个发送方同时向同一个目的地发送网络数据。交换机的缓存可以处理暂时的拥塞,但是当拥塞太久时,就会超过交换机的缓存水线,而失去了缓存功能,收到的新的报文就会被丢弃。丢包会因为重传而降低了应用性能。无损网络采用PFC等流控机制,在到达缓存水线时暂停输入端口发送流量,阻止了丢包现象。然而,流控本身也会造成拥塞传播的问题。
有个经典场景如下图所示:假设交换机1上的端口A到E都在向端口G传输报文,端口G以100%的性能来接收并转发报文。如果此时级联交换机2的端口F也在向交换机1的端口G发送报文,速率是链路带宽的20%。由于端口G的出口负载已经到达100%了,端口F将会被流控制机制暂停发送报文。此时,端口G将会出现拥塞。如果此时,交换机2上的端口X,以20%的速度向交换机1上的端口Y发送报文。端口G,这个拥塞源并不处于端口X到端口Y的传输路径上。这种情况下,也许会认为端口F只使用了交换机间链路的20%带宽,剩余的80%带宽对于端口X是可用的。然而并非如此,因为来自端口F的流量最终触发流控机制使得交换机间的链路处于暂停发送。
3.4PFC死锁问题
指当多台交换机之间因微环路等原因同时出现拥塞,各自端口的缓存消耗超过水线,而又相互等待对方释放缓存资源,从而导致所有交换机都处于阻塞状态。
正常情况下,当交换机的端口出现拥塞并触发XOFF水线时,下游设备将发送PAUSE帧反压,上游设备接收到PAUSE帧后停止发送数据,如果端口缓存超过水线,则进入等待状态,直到缓存中的报文被转发为止。
在异常情况下,如发生链路或设备故障时,路由收敛时,可能会出现短暂环路,造成连接的交换机的缓存都达到水线,都同时向对端发送PAUSE帧,此时所有相关交换机都处于非转发状态,整个区域的网络吞吐量将变为零。即使在无环网络中形成短暂环路时,也可能发生死锁。虽然经过修复,短暂环路会很快消失,但它们造成的死锁不是暂时的,即便重启服务器中断流量,死锁也不能自动恢复。
为了解除死锁状态,一方面是要杜绝数据中心里的环路产生,另一方面则可以通过网络设备的死锁检测功能来实现。
可以检测到出现X-OFF(PFCPause)报文状态后的一段时间内,是否持续收到X-Off(或者未收到X-On),如果持续到达阈值,则忽略收到的PFC帧,同时对缓存中的报文执行转发或丢弃的操作。所以在交换机中,提供监控PFC状态的功能,防止这种PFC风暴导致的死锁情况。如思科交换机上就有pfcwatchdog的功能,
priority-flow-controlwatch-dog-interval on
priority-flow-controlwatch-dog interval
发现PFC死锁,
priority-flow-controlwatch-dog shutdown-multiplier
使交换机自动从PFC死锁中恢复过来:
priority-flow-controlauto-restoremultiplier
手工控制,使交换机从某个端口在PFC死锁中恢复过来:
priority-flow-controlrecoverinterface ethernet </>
3.5RDMA传输livelock
尽管PFC可以避免缓存溢出导致的丢包,但其它一些原因,如FCS错误/链路故障,也可能导致网络丢包。RDMA的go-back-0算法,在每次出现丢包时,都会导致包含整个消息的所有报文都会重传,从而导致livelock。TCP有SACK算法,由于RDMA传输层在网卡实现,受限于硬件资源,网卡很难实现SACK算法。可以使用go-back-N算法来避免这个问题。
3.6网卡PFC暂停帧风暴
由于PFC暂停帧是传递的,所以很容易引起暂停帧风暴。例如,网卡因为bug导致接收缓冲区到达水线,网卡会一直对外发送暂停帧。需要在网卡和交换机端使用watchdog机制来防止暂停帧风暴(需要网络/服务器配合)。为了防止单一服务器网卡因为bug影响整体网络,网络设备也在探讨watchdog保护机制,对单一网卡短时间内多次触发watchdog的端口,列为不信任端口,忽略对方PFC暂停帧,强制发送数据防止造成全网拥塞。
4.ECN:Explicit Congestion Notification
最早在RFC3168中定义,在IP包头定义拥塞指示位,并在TCP包头定义一个对应该指示位的ACK。这个拥塞控制机制也被用在RoCEv2。ECN是一个端到端的拥塞通知机制,而不需要丢包。ECN是可选的特性,它需要端点开启ECN支持,同时底层的网络也需要支持。
传统的TCP/IP网络,通过丢包来表明网络拥塞,交换机路由器等网络设备都会这么做。而对于支持ECN的设备,当发生网络拥塞时,会设置IP头部的ECN(2bits)标志位,而接收端会给发送端返回拥塞的通知(echoof thecongestionindication),然后发送端降低发送速率。传统网络中由于发送速率由传输层(TCP)控制,ECN需要TCP和IP层同时配合。如下图所示:
RoCEv2标准定义了RoCEv2拥塞管理(RCM,CongestionManagement)。当交换机的出端口缓存到达水线(阈值)时,交换机修改报文包头中的ECN位,给报文打上ECN标签,当带有ECN标签的报文到达接收端以后,接收端会生成CNP报文(CongestionNotification Packet)并将它发送给发送端,当接收端收到CNP后,就会降低发送速率。
ECN工作机制如下图流程所示:
1.发送端在IP包头设置ECN值,ECN值如下图所示:
2.RoCEv2数据报文进入网络。
3.交换机在发生拥塞的队列上接收到报文时,检查是否开启了ECN功能,如果开启,就在IP包头设置CE位。
4.报文到达接收端。
5.接收端对设置CE位的RoCE报文进行处理,然后再将报文放入下一步处理流程。
6-7.接收端将CNP报文数据包发送回输入端。报文中的ECN位设置为’01’来验证该报文没有被网络设备丢弃。
8.CNP包从接收端返回到网络中。
9.交换机将CNP报文作为普通的IP报文转发。
10.CNP报文到达发送方。发送方对ECN设置位为’01’的RoCE的报文使用QoS机制进行处理。
在交换机中,可提供ECN功能,如思科交换机上的ECN配置如下:
hardwarerandom-detect min-thresh10g 10g-min-threshold 40g 40g-min-
thresholdmax-thresh 10g10g-max-threshold 40g 40g-max-threshold ecn qos-groupqos-group-number
5.结束语
无损网络的关键配置就是激活PFC和ECN,并通过对交换机的合理配置,避免上述功能带来的一些新问题,如PFC死锁等。本文介绍了RDMA相关的技术,特别是在无损网络中的相关网络技术。随着技术的不断发展,学术界不断提出各种新的理论和技术,如微软在2015年提出的基于交换机ECN机制的数据中心TCP(DCTCP)和量化通知算法的结合”DCQCN”算法,阿里巴巴于2019年提出全新的RDMA拥塞控制方案“HPCC“。中国的开发数据中心委员会(ODCC)也于2018年提出“数据中心无损网络总体技术要求”等相关文档。工业界也在密切跟踪学术界动态,不断进行新的探索,推出基于这些学术理论的新的软硬件实现,并应用于无损网络中。“众人拾柴火焰高”,伴随着大数据,AI等高带宽,低延迟应用的不断增加,基于RDMA的无损网络将获得更为广阔的应用前景。
<全文结束>
希望本文能对了解数通网络设备提供一点粗浅的感性认识。
本文有关信息均来自公开资料。