无损网络实现方式
端口流量控制
以太网PAUSE
下游设备接收能力不够时,会发PAUSE帧给上游设备,上游设备会暂停发送,根据PAUSE帧所携带时间参数计时,超时后再发送数据。以此控制流量速度,避免缓存溢出导致丢包。
PAUSE帧组织普通数据帧,不能阻止MAC控制帧。
PAUSE帧存在的问题:
PUASE帧会暂停链路上的所有流量,对于VIP服务的流量是不能接受的。
PFC
Priority-based Flow Control,基于优先级的流量控制,增强型的PAUSE。
PFC允许一条以太网链路上创建8个虚拟通道,各个通道有自己的优先级。数据包根据VLAN Tag中的User Priority(3 Bits)确定优先级,或者IP头DSCP域确定优先级,进而确定数据包的发送通道。
下游设备的某个虚拟通道的缓存队列超过阈值,则向上游设备发送反压信号STOP。
反压信号携带定时器参数,定时器为0时解除反压。
PFC可以按照虚拟通道进行流量控制,不影响其他通道流量。
在链路中,PFC控制的虚拟通道实现零丢包(无损),而非PFC控制的通道在拥塞时丢弃报文(尽力而为)
PFC存在的问题:
线头阻塞HOLB( head-of-line blocking),当某优先级通道触发PFC,该优先级其他流量也被阻塞住。上游会增加额外阻塞,PFC反压会向上游扩散。
PFC死锁,网络在出现可能的短暂环路时,循环反压导致死锁;网卡故障狂发PFC反压,PFC风暴扩散导致死锁。
死锁的检测,设备在PFC反压后,检测一段时间内该队列一直处于PFC-XOFF(流控)状态,判定为死锁,进行死锁恢复流程。
死锁的恢复,忽略PFC反压,持续发送该队列流量或者丢弃,恢复周期后再次开启PFC正常流控。
死锁的预防, Leaf对钩子流进行识别,并调整其优先级切换到队列。
以上方法并不能彻底解决死锁问题,得通过基于流的拥塞控制,尽量减少PFC的反压。
流的拥塞控制
ECN-显示拥塞通知
网络设备的无损队列出现拥塞,对数据包打上ECN标记(ECN 11),目的服务器收到ECN报文后,向源服务器发送CNP拥塞通知报文,源服务器降低发包速率。
ECN存在问题:
从ECN报文标记到源端收到CNP报文有一定延迟,流量大时仍会出发PFC流控。
ECN门限偏低时,对时延敏感的老鼠流有益,但是限制了大象流的带宽。
ECN门限偏高时,队列深度变大,引起较大的队列时延,对时延敏感的老鼠流无益。
ECN的和PFC的门限设置很难照顾周全,在有Incast的情况下同时满足无丢包、低时延、高吞吐的需求。
DCQCN
DCQCN是WRED和ECN的组合
交换机通过WRED给数据包打ECN标记,并且按照一定门限 不丢包、随机丢包、全丢包。
其中ECN采用入队标记方式。
接收端有一套算法实时出发CNP,源端有一套算法降低发送速率。
DCQCN并没有解决CNP报文延时,大流量导致的PFC流控。
iQCN
为了应对CNP未及时被源端收到的情况,iQCN让转发设备智能识别网络拥塞状况。
根据返回CNP的时间间隔太长,大于网卡降速的间隔,主动补偿CNP报文,让源端及时收到CNP,避免拥塞加剧。
流量调度
动态负载分担
固定特征(Flow)的负载均衡面对大象流和老鼠流无法均衡流量,多路径冲突,Incast常会发生。
如果Flow不选择同一个路径的强制负载均衡,会导致数据包乱序,大量的乱序会制造更大的吞吐量下降(乱序的报文超过终端TCP缓冲区,导致大量重传)。
动态负载分担,把Flow的流量按照突发流进行分割即Flowlet,保证一个Flowlet区间内按照同一路径负载均衡,下一个Flowlet到空闲的其他路径。更精细颗粒度的负载均衡,降低了静态多路径冲突发生的概率。
大小流区分调度
在PFC中每个端口有8个队列,数据包根据优先级进入队列处理。在大流和小流在同一队列时,大象流会影响老鼠流的延时。
在同一队列中增加一个阈值判断流量是大象流还是老鼠流,对识别到的大象流,将其降低到低优先级队列转发,老鼠流保持原队列转发,老鼠流的流完成时间(Flow Completion Time)得以保障。