UC Berkeley--sigcomm'18
核心思想:从PFC为RoCEv2带来更多问题的角度质疑PFC在RoCEv2上部署的必要性,因此作者通过改进网卡(IRN,improved RoCE NIC),在网卡上引入一些对丢包的处理,替代PFC算法。相比于带有PFC策略的网卡,经改进后的IRN对网卡资源的占用提升了3-10%,性能方面在典型网络场景下提升了6-83%。
简介
主要贡献:(1)改进后的网卡可以对丢包进行快恢复(改进go-back-N)(2)基本的端到端流控策略(BDP-FC)可以限制网络中正在传输的数据包上限(从而可以设置相应的缓存大小,避免缓存溢出,导致丢包)
讨论了iWarp和IRN的区别(两者思想都是在网卡上处理丢包,而不是要求网络无损):iWarp过于强调通用性,将TCP/IP协议栈和RDMA全部实现在网卡上,RDMA数据包在处理时,网卡要进行复杂的TCP/IP层和RDMA抽象层协议的多层转换,大大增加了数据包处理的复杂度,也增加了开销,所有收效甚微。而IRN是建立在RoCE的基础上的,是通过在网卡上添加尽可能小的特性修改,而去除对PFC的依赖,从而避免了PFC带来的弊端。
提出iWarp的设计理念可能是正确的,只不过在实现中过于复杂,这与目前市场给出的反馈不同。后文将从两方面介绍(1)一种新性RoCE网卡设计,消除RoCE对无损网络和PFC的依赖(2)一种对iWarp设计理念的简化实现,达到了更高的性能。
IRN设计
介绍了IRN通用的传输逻辑设计,与RDMA具体的操作类型相互独立。IRN网卡也支持DCQCN和Timely等显式拥塞控制机制,可作为配置选项打开。
IRN的丢包恢复机制
类似TCP的选择重传机制,接收端不丢弃乱序的包,等待发送端选择性重传丢失的包。
接收端:当接收端的IRN网卡收到乱序包时,会发送一个NACK包。其中包含了下一个接收端想要接收的序列号(即累计确认序号)和触发NACK的序列号(类似于TCP的SACK,即选择确定序号)。
发送端:当发送端收到NACK包时(或者超时),进入丢包恢复模式。发端维持了一个位图用于跟踪数据包是否被累计确认或选择确认。在丢包恢复模式下,发送端先选择性重传丢失的包,重传的第一个包的序号是累计确认序号值。当更高序号的包被选择确认时,表明累计确认序号之后的包全部丢失。当丢失的包全部重传后,才会发送新数据包。
超时:当发送端在RTO时间段内仍未收到确认ack时,会触发超时重传。基于短流的重传基本上是靠超时触发的。作者根据流的大小(通过记录发送的数据包个数)设置了不同RTO(RTOlow和RTOhigh),从而保证性能。
IRN的BDP-FC机制
依据RTT和带宽计算BDP。它是一种端到端数据包级的流控机制,通过BDP来限制一条流在网络中传输的数据包数量上限。只有当网络中传输的数据包数量小于上限值时,IRN发送端才会发送新的数据包。
上限计算方法:最长路径的BDP除以RDMA的QP队列中设置的MTU。这是一个静态的上限值。
当前网络中传输的数据包数量计算方法:当前下一个要发送的数据包序列号减去上一个收到确认ACK的序列号
该机制通过限制发包上限的方法避免了数据包在交换机和对端的排队,同时也限制的乱序的数据包的上限值(因为同时允许在网络中传输的数据包数是有限的),从而降低了在网卡上记录跟踪数据包状态所带来的开销和需求。
评估IRN的传输逻辑
通过仿真实验,在多种情景和不同规模的环境下对比IRN和RoCE、iWarp的性能,证明RDMA的使用可以不依赖与无损网络。
评估参数:(1)平均slowdown:用一条流的完成时间除以在一张空网中以线速运行经历同一路径所需的时间。针对时延敏感的短流。(2)平均FCT(3)99th的流完成时间。其中后两个针对吞吐量敏感的流。
通过实验得出的结论:(1)IRN性能表现优于RoCE(with PFC)(2)IRN不需要PFC(启动PFC和不启动PFC的两种IRN方案对比)(3)RoCE需要PFC(启动PFC和不启动PFC的两种RoCE方案对比)(4)显式拥塞控制机制(Timely和DCQCN)对IRN和RoCE的影响。结论是IRN与这些显式拥塞控制机制的联合使用效果优于RoCE。(5)在与显式拥塞控制机制联合使用的前提下,启动PFC和不启用PFC对IRN的影响。结论是,在性能最好时启动PFC的方案优于不启用PFC方案不超过1%,在性能最差时下降了3.4%。(6)在与显式拥塞控制机制联合使用的前提下,启动PFC和不启用PFC对RoCE的影响。结论是在使用了显式拥塞控制方案的前提下,RoCE仍需要PFC。
IRN的关键因素的影响性分析:通过控制变量法单独分析IRN的两种修改(选择确认,BDP-FC)对性能的影响。
蓝色和黄色柱状条表示SACK机制与Go-Back-N机制对性能的影响,分析原因是由于go-back-N重传大量的冗余包,造成带宽浪费。
为什么超时重传的计时器没有像TCP那样设置为动态,作者做了动态的实验,发现这样不仅会增加设计的复杂度,最后效果也不理想,效果好坏与RTO初值的设置关系密切。
蓝色和绿色柱状条表示有无BDP-FC机制对IRN的影响,分析原因是由于BDP-FC机制减少了数据包的排队,同时也避免了一条流由于发送太多的新数据包引起丢包拥塞后造成的影响。
黄色和绿色柱状条表示IRN的两种策略对性能影响的大小,分析结果表明丢包恢复策略(SACK)的贡献比BDP-FC的更大。
实验结果的鲁棒性分析:通过在不同场景下用不同性能评估参数重复基础实验,来验证IRN的鲁棒性
变量:(1)链路利用率,30%-90%(2)链路带宽,40Gbps,10Gbps,100Gbps(3)更大的拓扑,128节点,250节点(4)不同的流大小,500KB,5MB(5)每个端口的缓存区大小,60KB-480KB(6)不同的RTO参数
在incast场景下,在不带背景流的条件下,RoCE(with PFC)的性能优于IRN,分析原因为此时每个端口只对应一条流,不会出现线头阻塞问题,作者说这是最能体现PFC优势的场景。在带背景流的条件下,若以RCT(请求完成时间)为参数,则IRN的性能相比RoCE下降4-30%,对于背景流而言,以之前的三个性能指标来看,IRN的性能优于RoCE32-87%。
IRN与弹性RoCE(with DCQCN,without PFC)的性能对比:性能参数不变,IRN更优。
IRN与iWarp的性能对比:在简化了iWarp设计复杂度的情况下,IRN的性能与iWarp仍具有可比性,在平均slowdown参数上,IRN表现更优。
硬件实现IRN中的问题和解决方案
实现方案:扩展RDMA包格式,增加数据包类型,在IP和UDP头添加新的域。这些扩展只会影响终端网卡的解析,不会对交换机行为造成影响。
先介绍了RDMA的相关操作:write、read、send、atomic
支持RDMA的read和atomic:
RoCE原本就支持对每个数据包的ack操作,但仅限于write和send操作。IRN的丢包恢复机制和BDP-FC机制都依赖于ack包。所以,IRN通过修改RoCE头中的opcode的剩余8个可选字段中的一个作为read操作的ACK确认。在read操作中,是将response端的特定位置的数据读取到request端的内存中,所以response是数据源,request是数据目的地,read操作是否成功的ack包也要由request端产生,用于确认数据包是否成功读取到request的相应内存中。同时,在response端也要添加超时timer机制,用于read操作超时后的预警。这一功能在RoCE网卡中已经实现了。
支持乱序包的处理:
简单的想法是将所有乱序包存储在网卡内存中,考虑到在一千条流同时发生乱序时所需的网卡内存容量远远超出目前RDMA网卡的容量,所以作者采用将乱序的包直接通过DMA方式传送到应用内存的最终位置,然后用bitmap跟踪。这种机制目前在最新的网卡中只支持write和read操作。作者通过扩展网卡将IRN部署,使其支持所有RDMA的所有操作。在扩展过程中需要注意以下四类问题:
(1)首包问题:一条流的关键信息只包含在第一个包中,这些信息在处理其他包时也需要。若要支持乱序包处理,则需要修改网卡,使得一条流中的每个包都携带一些必要的关键信息。
(2)WQE匹配问题:RDMA的某些操作要求到达的每个数据包匹配接收端对应序号的WQE。当顺序到达时,这种匹配操作是隐式完成的,当出现乱序包时,这种隐式匹配就会被打破。解决方案是发送端将WQE序列号显式的填入数据包头部中。针对不同操作,IRN给出了不同的实现方法。
对于send和write-with-immediate操作,每个receive WQE和request WQE都会维持一个recv_WQE_SN表示一条流中数据包的发送顺序。在send操作中,所有数据包都会携带这些值(以及当前数据包在整条流中的偏移量,即序列号),在write-with-immediate操作中,只有最后一个包会携带这些值。
对于read和atomic操作:接收者需要等待read或atomic操作所需要的数据包全部到达后才能处理read或atomic请求,因此,乱序的请求包需要存放在接收者的read WQE 缓存区内。IRN方案中,所有的read/atomic请求包都会携带一个read_WQE_SN值,用于标识该数据包在read WQE 缓存区中的位置。
(3)尾包问题:针对RDMA的某些操作的关键信息由最后一个包携带的情况。针对这种情况,网卡需要跟踪尾包的是否到达,并且将其存储在网卡或主机内存中,直到这条流的所有包都到达后才能处理最后一个包,确认该条信息已经接受完成,执行产生CQE包等后续操作。
具体来看,在RoCE接受端会维持一个MSN(消息序列号),当收到write/send消息的最后一个包或read/atomic请求包时,MSN会递增。然后MSN值会被携带在ack包中反馈给发送端,发送端收到后将对应的request WQE失效。同时接收端也将对应的receive WQE失效,表示write/send消息已经结束,同时根据最后一个包中的特定元数据生成CQE包。read/atomic操作在接收端不产生receive WQE。IRN的作用是确保当尾包提前到达的情况下,上述机制仍可以正确运行。在IRN接收端将维持两个bitmap,一个用来确认相应编号的数据包是否到达,另一个用来确认到达的包是否为尾包。若提前收到尾包,则会触发CQE的生成,这时需要将CQE存储在主存储器中,等到所有的包都到达再将其反馈给发送端。
(4)其他考虑:原来RoCE网卡中接收端发送和接收数据包的序列号空间是共享的,成为PSN空间。PSN空间是IRN执行丢包恢复和BDP-FC策略的接口,因此,IRN将其分为两份:sPSN,用于跟踪发送端发送的请求包,rPSN,用于跟踪发送端接收的反馈包。
评估IRN的实现开销
从三方面考量:(1)内存需求,增加了3-10%的内存开销(2)将IRN的包处理逻辑实现在FPGA上的开销(3)通过仿真测试不同IRN的实现方式对端到端性能的影响。
评估结果说明IRN方案是低开销的,易部署的,作者也说有些网卡厂商也正尝试将IRN方案实现在他们的网卡上。