RoCE的流量需要保证运行在无损队列中,无损队列使用了PFC技术,能针对某一队列发送Pause帧,迫使上游停流。设备在进行报文转发时,根据报文的优先级进入对应映射关系的队列中进行调度转发。当某一优先级报文发送速率超过接收速率,导致接收方可用数据缓冲空间不足时,设备通过PFC PAUSE帧反馈给上一跳设备,上一跳设备收到PAUSE帧报文后停止发送本优先级报文,直到再收到PFC XON帧或经过一定的老化时间后才能恢复流量发送。本文讲解具体的PFC配置限制和设置指导。
PFC(Priority-based Flow Control,基于优先级的流量控制)功能是一种精细的流量控制机制,可 以满足以太网流量传输的无丢包要求,通过以太网提供无损服务。 PFC 功能基于 802.1p 优先级对报文进行流量控制。如下图 所示,PFC 允许在一条以太网链路上 创建 8 个虚拟通道,并为每条虚拟通道指定一个 802.1p 优先等级。在不影响其他通道流量转发的 情况下,任意一条虚拟通道都可以单独暂停和重启。通过此机制可以实现同一接口上多种类型流量 共存、多种流量共享链路。
![](https://i-blog.csdnimg.cn/blog_migrate/73a47d6161536455984529bb276c626d.png)
交换芯片都有固定的Pipeline(转发流水线), Buffer管理处于入芯片流程和出芯片流程的中间位置。报文处于在这个位置上时,已经知道了该报文的入口和出口信息,因此逻辑上就可以分成入方向和出方向分别对缓存进行管理。
PFC水线是基于入方向缓存管理进行触发的。芯片在入口方向提供了8个队列,我们可以将不同优先级的业务报文映射到不同的队列上,从而实现对不同优先级的报文提供不同的Buffer分配方案。
缓存类型
具体到每个队列,其Buffer分配根据使用场景设计为3部分:保证缓存,共享缓存,Headroom。
- 保证缓存:每个队列的专用缓存,确保每个队列均有一定缓存以保证基本转发;
- 共享缓存:流量突发时可以申请使用的缓存,所有队列共享;
- Headroom:在触发PFC水线后,到服务器响应降速前,还可以继续使用的缓存。
PFC门限设置类型
通过配置PFC缓存门限可以有效解决因缓冲空间不足和入流量队列数量过大,导致发送数据缓冲区尾丢弃等问题。
为了灵活控制 PFC 功能,设备提供对 PFC 门限进行配置,合理利用接口存储空间。
PFC目前提供以下门限设置类型:
- Headroom缓存门限(如上图中的headroom):Headroom存储空间中某802.1p优先级报文的最大使用cell资源。当达到使用的cell资源后,该接口会丢弃收到的报文。
- 反压帧触发门限(如上图中的XOFF):Shared存储空间中某802.1p优先级报文在该存储空间使用cell资源上限。达到上限后,会触发PFC功能发送PAUSE帧。反压帧触发门限又分为动态反压帧触发门限和静态反压帧触发门限:
- 动态反压帧触发门限:设置某802.1p优先级报文触发PFC PAUSE帧的可用cell资源的百分比。
- 静态反压帧触发门限:设置某802.1p优先级报文触发PFC PAUSE帧的可用cell资源门限为一个固定值。
- 反压帧停止门限与触发门限间的偏移量(如上图中的ingress-threshold-offset):当某802.1p优先级报文使用的cell资源减小了一个固定值时,停止发送PFC PAUSE帧,使对端设备恢复流量发送——从Xoff水线回落多少就可以发送Xon的偏移量[需要保证报文到达之前不欠吞吐——buffer不会过早为0]。
- PFC预留门限(如上图中的reserved-buffer):Guaranteed存储空间中为某802.1p优先级报文预留的cell资源。Guaranteed缓存是一个静态水线(固定的、独享的)。
- Headroom最大可用的cell资源:配置Headroom存储空间某缓存池cell资源的大小。
Headroom缓存门限设置方法
如果想要进行更精确地控制,可以根据如下方法计算Headroom缓存门限值:计算从接收端发送PFC Pause帧到发送端收到PFC Pause帧并真正停止流量发送期间,在途流量大小。公式为:在途流量(bytes)=MTUR+MTUs+Response+2*link_delay。其中,
- MTUR:队列触发反压帧门限到发送Pause帧之间,如果芯片有大包要发,这个大包的长度。由于这个大包可能来自其它任何队列,所以这个大包的长度应该等于设备允许的最大帧长度9216字节。
- MTUs:如果上游设备在准备停止流量发送前,刚好开始发送上一个包,这个包的长度。由于只有PFC指定优先级的报文影响接收端的门限,所以MTUs的长度应该为PFC指定优先级报文的长度。
- Response:上游设备收到PFC Pause帧到停止发送的反应时间产生的数据长度,该值固定为3840字节。
- 2*link_delay:线路来、回方向上缓冲的报文长度。
反压帧触发门限设置方法
对于共享缓存的设置,需要采用更为灵活的动态水线。动态水线能根据当前空闲的Buffer资源,以及当前队列已使用的Buffer资源数量来决定能否继续申请到资源。由于系统中空闲共享Buffer资源与已使用的Buffer资源都是时刻变化的,因此阈值也处于不断变动中。相对于静态水线,动态水线能更灵活、有效的利用Buffer及避免造成不必要的浪费。
PFC动态反压帧触发门限动态如下:
百分比(动态反压帧触发门限值) | Alpha值(芯片寄存器配置值,表示队列中cell个数和可用cell个数比值) | 占可用总缓存的实际比例(alpha/(1+alpha)*100)% |
---|---|---|
0 | 1/128 | 0.77 |
1 | 1/64 | 1.53 |
2~3 | 1/32 | 3.03 |
4~5 | 1/16 | 5.88 |
6~11 | 1/8 | 11.11 |
12~20 | 1/4 | 20.00 |
21~33 | 1/2 | 33.33 |
34~50 | 1 | 50.00 |
51~66 | 2 | 66.66 |
67~80 | 4 | 80.00 |
81~100 | 8 | 88.88 |
动态水线alpha值=队列可申请缓存量/剩余共享缓存量。队列的α值越大,其在共享缓存中可使用的百分数占比也就越高。队列的α值设置越小,其最大可申请的共享缓存占比就越小。当端口拥塞时就会越早触发PFC流控,PFC流控生效后队列降速,可以很好地确保网络不丢包。
但从性能的角度看,过早触发PFC流控,会导致RDMA网络吞吐下降。因此我们在MMU水线设置时需要选取一个平衡值。