咱们干弱电这行的,都知道现在数据中心越来越难伺候。前阵子有个兄弟问我,为啥非得搞那个无损网络?不就是个网络嘛,丢几个包能咋地?我跟他讲,你要是在线搜索、购物、直播这些业务,用户那边点一下,你这边慢个半秒,人家扭头就走。还有现在那些搞机器学习和AI的,分布式计算集群里跑着复杂的神经网络,并行程序通讯延迟一高,整个训练效率就拉胯了。更别提分布式存储,数据流都是大象流,一旦丢包重传,那拥塞就跟堵车一样越堵越死。
所以,现在数据中心对网络的要求就两条:延迟越低越好,效率越高越好。RDMA技术就是干这个的,它让用户态的应用直接读写远程内存,不用CPU一遍遍拷贝,还能绕过内核直接往网卡写数据,吞吐量高、时延超低、CPU开销还小。以太网上跑RDMA主要用RoCEv2协议,它基于UDP,比TCP快,但UDP没有滑动窗口、确认应答那套可靠机制。一旦丢包,得等上层应用发现再重传,RDMA的效率就大打折扣。所以,要想发挥RDMA的真正实力,必须给它搭个不丢包的无损环境,关键就是解决网络拥塞。
说到拥塞,原因挺多,但数据中心里最常见的就三个:
- 收敛比:设计网络时,成本和收益得平衡,多数用非对称带宽。比如锐捷的万兆交换机RG-S6220-48XS6QXS-H,下行48个10G口,总共480G输入,上行6个40G口,总共240G输出,收敛比2:1。25G的RG-S6510-48VS8CQ,下行1200G,上行800G,收敛比1.5:1。下联服务器发得太猛,上行带宽不够,上行口就堵了。
- ECMP:现在Fabric架构常用ECMP做负载均衡,它只管把流分散到不同链路,不管链路本身是不是已经堵了。碰上拥塞链路,ECMP还往里塞流量,等于火上浇油。
- TCP Incast:这是Many-to-One通信模式,分布式存储和计算经常碰到,像Hadoop、MapReduce这些。一个Parent Server向一群节点发请求,节点几乎同时响应,大量数据流同时涌向一台机器,交换机端口瞬间缓存不够,就拥塞了。
这里我得插一句实际经验。以前有个项目,客户非要用便宜交换机,收敛比搞到4:1,结果一到业务高峰,上行口丢包丢得飞起。后来我硬逼着他们换了个收敛比1.5:1的,问题才解决。别小看这个,省钱归省钱,但关键地方不能省,不然RDMA跑不起来,回头还得返工。
普通微突发流量,交换机Buffer能扛一会儿,但Buffer成本高,容量有限,报文一多照样丢包。要实现端到端无损转发,得引入流量控制,比如PFC。
PFC怎么干活?
IEEE 802.1Qbb,就是PFC,是数据中心桥接协议族里的一个技术,算是流量控制的增强版。先说说IEEE 802.3X的基础流控:接收者处理不过来时,发PAUSE帧让发送者停一停。比如端口G0/1和G0/2以1Gbps转发,端口F0/1堵了,交换机B就在缓冲区排队,超过阈值时,G0/2向G0/1发PAUSE帧,让它暂停。暂停时间由PAUSE帧里指定,超时或收到Timeout值为0的控制帧再继续。
但802.3X有个毛病:一旦链路暂停,所有数据包都不能发了。要是因为低优先级的数据流引发暂停,高优先级的也被拖累,得不偿失。PFC就聪明了,它允许在一条以太网链路上创建8个虚拟通道,每个通道指定优先级,可以单独暂停和重启其中一条,不影响其他通道。
PFC的流控粒度从物理端口细化到8个虚拟通道,对应Smart NIC硬件上的8个发送队列(叫Traffic Class,TC0到TC7)。RDMA不同封装协议下映射方式也不同:
- RoCEv1:RDMA数据段封装到以太网数据段内,加以太网头部,是二层数据包。用VLAN头部里的PCP域3 Bits设优先级。
- RoCEv2:RDMA数据段先封装到UDP数据段,加UDP头部、IP头部、以太网头部,是三层数据包。可以用VLAN的PCP域,也可以用IP头部的DSCP域。
二层网络用PCP,三层网络用DSCP更灵活。现在数据中心大多三层,用DSCP比PCP有优势。
再说个我踩过的坑。有次给一个AI公司搭RDMA环境,DSCP配置没跟交换机协商好,结果PFC优先级映射乱套,低优先级的流量把高优先级的堵死了。后来一条条查配置,折腾了两天才搞定。所以啊,配置前一定跟交换机厂家确认好映射规则,别想当然。
PFC死锁
PFC虽然好用,但会引入新问题——PFC死锁。死锁就是多个交换机因微环路同时拥塞,各自缓存超过阈值,互相等对方释放资源,结果所有数据流都卡死。正常情况下,端口拥塞触发XOFF水线,下游设备发PAUSE帧反压,一级级反压到终端服务器暂停发送。但链路故障或设备故障时,BGP路由重新收敛可能出现短暂环路,导致循环依赖。比如4台交换机都达到XOFF水线,都向对端发PAUSE帧,整个网络吞吐量就变零了。
就算无环网络,形成短暂环路也可能死锁。修复后环路消失,但死锁不会自动恢复,重启服务器也没用。要解除死锁,一是杜绝环路,二是靠网络设备的死锁检测功能。比如锐捷的交换机就有这个功能,能自动检测和恢复。
最后分享个省钱技巧。PFC配置时,别一上来就把8个队列全用上。实际业务中,一般就两三个优先级够用了。比如RDMA流量设一个高优先级,普通TCP流量设一个低优先级,其他流量默认。这样既能保证关键业务,又减少PFC反压的复杂度,交换机处理压力也小,省得买太贵的设备。
