无损网络到底有何必要之处?

看过前面几期的技术文章,相信大家对rdma(remote direct memory access,远程直接数据存取)和无损网络有了一定的认识,也许大家会问为什么我们需要rdma?为什么我们需要无损网络?这些先进的技术究竟能给我们带来什么好处?
只从网络层面来看可能无法得出令人满意的答案,下面分别从前端业务和后端应用,简单列举几个例子,相信大家可以从中解开疑惑。
首先想说的是互联网中大量的在线业务,例如在线搜索、购物、直播等,它需要以非常快的速度对高频率的用户请求做出应答,数据中心内任何一个环节导致延迟,都会对终端用户的访问体验造成极大的影响,从而影响其流量、口碑、活跃用户等。
还有在机器学习和ai的技术趋势下,对计算能力的需求是呈几何级数上升的,为了满足日益复杂的神经网络和深度学习模型,数据中心会存在大量的分布式计算集群,但大量并行程序的通讯延迟,则会极大影响整个计算过程的效率。
另外为了解决数据中心内爆炸式增长的数据存储和读取效率问题,利用以太网融合组网的分布式存储越来越受到欢迎。但因为存储网络中数据流以大象流为主,所以一旦因拥塞造成丢包,将会引发大象流重传,不仅降低效率,还会加重拥塞。
所以从前端用户的体验和后端应用的效率来看,眼下对于数据中心网络的要求是:延迟越低越好,效率越高越好。
为了降低数据中心内部网络延迟,提高处理效率,rdma技术应运而生,通过允许用户态的应用程序直接读取和写入远程内存,而无需cpu介入多次拷贝内存,并可绕过内核直接向网卡写数据,实现了高吞吐量、超低时延和低cpu开销的效果。
当前rdma在以太网上的传输协议是rocev2,rocev2是基于无连接协议的udp协议,相比面向连接的tcp协议,udp协议更加快速、占用cpu资源更少,但其不像tcp协议那样有滑动窗口、确认应答等机制来实现可靠传输,一旦出现丢包,依靠上层应用检查到了再做重传,会大大降低rdma的传输效率。
所以要想发挥出rdma真正的性能,突破数据中心大规模分布式系统的网络性能瓶颈,势必要为rdma搭建一套不丢包的无损网络环境,而实现不丢包的关键就是解决网络拥塞。
一、为什么会产生拥塞
产生拥塞的原因有很多,下面列举了在数据中心场景里比较关键也是比较常见的三点原因:
1.收敛比
进行数据中心网络架构设计时,从成本和收益两方面来考虑,多数会采取非对称带宽设计,即上下行链路带宽不一致,交换机的收敛比简单说就是总的输入带宽除以总的输出带宽。以锐捷万兆交换机rg-s6220-48xs6qxs-h为例,下行可供服务器输入的带宽是48*10g=480g,上行输出的带宽是6*40g=240g,整机收敛比为2:1。而25g交换机rg-s6510-48vs8cq,下行可供服务器输入的带宽是48*25g=1200g,上行输出的带宽是8*100g=800g,整机收敛比是1.5:1。
也就是说,当下联的服务器上行发包总速率超过上行链路总带宽时,就会在上行口出现拥塞。
2.ecmp
当前数据中心网络多采用fabric架构,并采用ecmp来构建多条等价负载均衡的链路,通过设置扰动因子并hash选择一条链路来转发是简单的,但这个过程中却没有考虑到所选链路本身是否有拥塞。ecmp并没有拥塞感知的机制,只是将流分散到不同的链路上转发,对于已经产生拥塞的链路来说,很可能加剧链路的拥塞。
3.tcp incast
tcp incast是many-to-one的通信模式,在数据中心云化的大趋势下这种通信模式常常发生,尤其是那些以scale-out方式实现的分布式存储和计算应用,包括hadoop、mapreduce、hdfs等。
例如,当一个parent server向一组节点(服务器集群或存储集群)发起一个请求时,集群中的节点都会同时收到该请求,并且几乎同时做出响应,很多节点同时向一台机器(parent server)发送tcp数据流,从而产生了一个“微突发流”,使得交换机上连接parent server的出端口缓存不足,造成拥塞。
▲tcp incast流量模型
正如前面所说,rdma和tcp不同,它需要一个无损网络。对于普通的微突发流量,交换机的buffer缓冲区可以起到一定作用,在缓冲区将突发的报文进行列队等待,但由于增加交换机buffer容量的成本非常高,所以它所能起到的作用是有限的,一旦缓冲区列队的报文过多,仍旧会产生丢包。
为了实现端到端的无损转发,避免因为交换机中的buffer缓冲区溢出而引发的数据包丢失,交换机必须引入其他机制,如流量控制,通过对链路上流量的控制,减少对交换机buffer的压力,来规避丢包的产生。
二、pfc如何实现流控
ieee 802.1qbb(priority-based flow control,基于优先级的流量控制)简称pfc,是ieee数据中心桥接(data center bridge)协议族中的一个技术,是流量控制的增强版。
说pfc之前,我们可以先看一下ieee 802.3x(flow control)流控的机制:当接收者没有能力处理接收到的报文时,为了防止报文被丢弃,接收者需要通知报文的发送者暂时停止发送报文。
如下图所示,端口g0/1和g0/2以1gbps速率转发报文时,端口f0/1将发生拥塞。为避免报文丢失,开启端口g0/1和g0/2的flow control功能。
▲端口产生拥塞的打流模型
• 当f0/1在转发报文出现拥塞时,交换机b会在端口缓冲区中排队报文,当拥塞超过一定阈值时,端口g0/2向g0/1发pause帧,通知g0/1暂时停止发送报文。
• g0/1接收到pause帧后暂时停止向g0/2发送报文。暂停时间长短信息由pause帧所携带。交换机a会在这个超时范围内等待,或者直到收到一个timeout值为0的控制帧后再继续发送。
ieee 802.3x协议存在一个缺点:一旦链路被暂停,发送方就不能再发送任何数据包,如果是因为某些优先级较低的数据流引发的暂停,结果却让该链路上其他更高优先级的数据流也一起被暂停了,其实是得不偿失的。
如下图中报文解析所示,pfc在基础流控ieee 802.3x基础上进行扩展,允许在一条以太网链路上创建8个虚拟通道,并为每条虚拟通道指定相应优先级,允许单独暂停和重启其中任意一条虚拟通道,同时允许其它虚拟通道的流量无中断通过。
▲pfc协议报文结构解析
pfc将流控的粒度从物理端口细化到8个虚拟通道,分别对应smart nic硬件上的8个硬件发送队列(这些队列命名为traffic class,分别为tc0,tc1,...,tc7),在rdma不同的封装协议下,也有不同的映射方式。
• rocev1:
这个协议是将rdma数据段封装到以太网数据段内,再加上以太网的头部,因此属于二层数据包。为了对它进行分类,只能使用vlan(ieee 802.1q)头部中的pcp(priority code point)域3 bits来设置优先级值。
▲二层以太网帧vlan头部结构
• rocev2:
这个协议是将rdma数据段先封装到udp数据段内,加上udp头部,再加上ip头部,最后再加上以太网头部,属于三层数据包。对它进行分类,既可以使用以太网vlan中的pcp域,也可以使用ip头部的dscp域。
▲三层ip报文头部结构
简单来说,在二层网络的情况下,pfc使用vlan中的pcp位来对数据流进行区分,在三层网络的情况下,pfc既可以使用pcp、也可以使用dscp,使得不同数据流可以享受到独立的流控制。当下数据中心因多采用三层网络,因此使用dscp比pcp更具有优势。
三、pfc死锁
虽然pfc能够通过给不同队列映射不同优先级来实现基于队列的流控,但同时也引入了新的问题,例如pfc死锁的问题。
pfc死锁,是指当多个交换机之间因微环路等原因同时出现拥塞,各自端口缓存消耗超过阈值,而又相互等待对方释放资源,从而导致所有交换机上的数据流都永久阻塞的一种网络状态。
正常情况下,当一台交换机的端口出现拥塞并触发xoff水线时,数据进入的方向(即下游设备)将发送pause帧反压,上游设备接收到pause帧后停止发送数据,如果其本地端口缓存消耗超过阈值,则继续向上游反压。如此一级级反压,直到网络终端服务器在pause帧中指定pause time内暂停发送数据,从而消除网络节点因拥塞造成的丢包。
但在特殊情况下,例如发生链路故障或设备故障时,bgp路由重新收敛期间可能会出现短暂环路,会导致出现一个循环的缓冲区依赖。如下图所示,当4台交换机都达到xoff水线,都同时向对端发送pause帧,这个时候该拓扑中所有交换机都处于停流状态,由于pfc的反压效应,整个网络或部分网络的吞吐量将变为零。
▲pfc死锁示意图
即使在无环网络中形成短暂环路时,也可能发生死锁。虽然经过修复短暂环路会很快消失,但它们造成的死锁不是暂时的,即便重启服务器中断流量,死锁也不能自动恢复。
为了解除死锁状态,一方面是要杜绝数据中心里的环路产生,另一方面则可以通过网络设备的死锁检测功能来实现。锐捷rg-s6510-48vs8cq上的deadlock检测功能,可以检测到出现deadlock状态后的一段时间内,忽略收到的pfc帧,同时对buffer中的报文执行转发或丢弃的操作(默认是转发)。
例如,定时器的监控次数可配置设置检测10次,每次10ms内检测是否收到pfc pause帧。若10次均收到则说明产生deadlock,对buffer中的报文执行默认操作,之后将设置100ms作为recover时间后恢复再检测。命令如下:
priority-flow-control deadlock cos-value 5 detect 10 recover 100 //10次检测,100ms recover。
rdma无损网络中利用pfc流控机制,实现了交换机端口缓存溢出前暂停对端流量,阻止了丢包现象发生,但因为需要一级一级反压,效率较低,所以需要更高效的、端到端的流控能力。
四、利用ecn实现端到端的拥塞控制
当前的roce拥塞控制依赖ecn(explicit congestion notification,显式拥塞通知)来运行。ecn最初在rfc 3168中定义,网络设备会在检测到拥塞时,通过在ip头部嵌入一个拥塞指示器和在tcp头部嵌入一个拥塞确认实现。
rocev2标准定义了rocev2拥塞管理(rcm)。启用了ecn之后,网络设备一旦检测到rocev2流量出现了拥塞,会在数据包的ip头部ecn域进行标记。
▲ip报文头ecn字段结构
这个拥塞指示器被目的终端节点按照bth(base transport header,存在于ib数据段中)中的fecn拥塞指示标识来解释意义。换句话说,当被ecn标记过的数据包到达它们原本要到达的目的地时,拥塞通知就会被反馈给源节点,源节点再通过对有问题的queue pairs(qp)进行网络数据包的速率限制来回应拥塞通知。
▲ecn交互过程示意图
五、ecn交互过程
① 发送端发送的ip报文标记支持ecn(10);
② 交换机在队列拥塞情况下收到该报文,将ecn字段修改为11并发出,网络中其他交换机将透传;
③ 接收端收到ecn为11的报文发现拥塞,正常处理该报文;
④ 接收端产生拥塞通告,每ms级发送一个cnp(congestion notification packets)报文,ecn字段为01,要求报文不能被网络丢弃。接收端对多个被ecn标记为同一个qp的数据包发送一个单个cnp即可(格式规定见下图);
⑤ 交换机收到cnp报文后正常转发该报文;
⑥ 发送端收到ecn标记为01的cnp报文解析后对相应的流(对应启用ecn的qp)应用速率限制算法。
rocev2的cnp包格式如下:
▲cnp报文结构
值得注意的是,cnp作为拥塞控制报文,也会存在延迟和丢包,从发送端到接收端经过的每一跳设备、每一条链路都会有一定的延迟,会最终加大发送端接收到cnp的时间,而与此同时交换机端口下的拥塞也会逐步增多,若发送端不能及时降速,仍然可能造成丢包。建议拥塞通告域的规模不要过大,从而避免因为ecn控制报文交互回路的跳数过多,而影响发送端无法及时降速,造成拥塞。
总结
rdma网络正是通过在网络中部署pfc和ecn功能来实现无损保障。pfc技术让我们可以对链路上rdma专属队列的流量进行控制,并在交换机入口(ingress port)出现拥塞时对上游设备流量进行反压。利用ecn技术我们可以实现端到端的拥塞控制,在交换机出口(egress port)拥塞时,对数据包做ecn标记,并让流量发送端降低发送速率。
从充分发挥网络高性能转发的角度,我们一般建议通过调整ecn和pfc的buffer水线,让ecn快于pfc触发,即网络还是持续全速进行数据转发,让服务器主动降低发包速率。如果还不能解决问题,再通过pfc让上游交换机暂停报文发送,虽然整网吞吐性能降低,但是不会产生丢包。
在数据中心网络中应用rdma,不仅要解决转发面的无损网络需求,还要关注精细化运维,才能应对延迟和丢包敏感的网络环境。

科锐助力全国最大城市智能LED道路照明系统
深谙数字化奥义,华为云耀云服务器 L 实例助企业行稳致远.
农业物联网的问题
一种新型数字温度测量电路的设计及实现
微控制器LM3S9D96的功能特性及应用方案设计
无损网络到底有何必要之处?
HFAN-03.1.1: 数字可编程低噪声雪崩光电探测器(APD)偏置电路
新唐科技NUC978DK41Y参数
智慧车站3D可视化监控平台
如何解决安全问题?——重新定义与供应链伙伴的合作
关于视频解码你不知道的事
openharmony代码获取分析
机器学习和人工智能的发展 正在让移动广告业发生一场重大变革
异质运算架构前景好 手机芯片核心数能否增加?
PLC组态FESTO焊枪
16种零件测量方法盘点
无论是单车智能还是车路协同,自动驾驶和智能交通都会离我们越来越近
FPC软板制造过程中需要注意什么
网易游戏业务赚翻了,三季度净收入超百亿元
Linux平台下生成C语言数据结构关系图