PFC功能原理

PFC是一种基于优先级的流量控制机制,确保以太网无丢包传输。它使用802.1p优先级对报文进行队列管理和流量控制,通过发送Pause帧实现拥塞管理。文章介绍了PFC的配置限制,包括Headroom缓存门限、动态反压帧触发门限等,旨在优化网络性能和避免丢包。

       RoCE的流量需要保证运行在无损队列中,无损队列使用了PFC技术,能针对某一队列发送Pause帧,迫使上游停流。设备在进行报文转发时,根据报文的优先级进入对应映射关系的队列中进行调度转发。当某一优先级报文发送速率超过接收速率,导致接收方可用数据缓冲空间不足时,设备通过PFC PAUSE帧反馈给上一跳设备,上一跳设备收到PAUSE帧报文后停止发送本优先级报文,直到再收到PFC XON帧或经过一定的老化时间后才能恢复流量发送。本文讲解具体的PFC配置限制和设置指导。  

PFC(Priority-based Flow Control,基于优先级的流量控制)功能是一种精细的流量控制机制,可 以满足以太网流量传输的无丢包要求,通过以太网提供无损服务。 PFC 功能基于 802.1p 优先级对报文进行流量控制。如下图 所示,PFC 允许在一条以太网链路上 创建 8 个虚拟通道,并为每条虚拟通道指定一个 802.1p 优先等级。在不影响其他通道流量转发的 情况下,任意一条虚拟通道都可以单独暂停和重启。通过此机制可以实现同一接口上多种类型流量 共存、多种流量共享链路。

 

当本端发生拥塞时,设备会根据本端收到报文的 802.1p 优先级进行判别,从而确定对报文的处理
方式:
如果收到报文的 802.1p 优先级开启了 PFC 功能,则接收该报文,并向对端发送 PFC PAUSE
帧,通知对端设备暂时停止发送该类报文。对端设备在接收到 PFC PAUSE 帧后,将暂时停
止向本端发送该类报文。当拥塞仍然存在时,此过程将重复进行,直至拥塞解除。
如果收到报文的 802.1p 优先级未开启 PFC 功能,则直接将报文丢弃。

      交换芯片都有固定的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)%
01/1280.77
11/641.53
2~31/323.03
4~51/165.88
6~111/811.11
12~201/420.00
21~331/233.33
34~50150.00
51~66266.66
67~80480.00
81~100888.88

动态水线alpha值=队列可申请缓存量/剩余共享缓存量。队列的α值越大,其在共享缓存中可使用的百分数占比也就越高。队列的α值设置越小,其最大可申请的共享缓存占比就越小。当端口拥塞时就会越早触发PFC流控,PFC流控生效后队列降速,可以很好地确保网络不丢包。

但从性能的角度看,过早触发PFC流控,会导致RDMA网络吞吐下降。因此我们在MMU水线设置时需要选取一个平衡值。

03-08
### PFC协议在网络通信中的应用和实现 #### PFC概述 优先级流控(Priority-based Flow Control, PFC)是一种用于减少网络拥塞的技术,在特定情况下可以防止数据包丢失。PFC允许针对不同类型的流量设置不同的优先级,确保高价值的数据流能够得到更好的服务质量[^1]。 #### 实现原理 当启用PFC时,它会在Flow Control (FC)的基础上增加优先级的概念[PFC为不同的Flow设置相应的Priority分类](https://example.com/reference)[^3]。这意味着每个数据帧都会被分配一个优先级标签,并据此映射到对应的缓冲区队列中等待处理。如果某个方向出现了拥塞情况,则只会暂停该方向上具有相同或更低优先级的新数据帧继续进入交换机或其他中间节点;而其他较高优先级别的流量则不受影响,依旧能顺利传输。 #### 应用场景 在数据中心内部署无损以太网环境时经常需要用到PFC技术。例如,在采用远程直接内存访问(RDMA)的应用程序之间传递大量小消息的情况下,即使发生短暂的链路饱和也不会造成严重的性能下降问题[^2]。此外,对于那些对延迟敏感的服务来说——比如实时视频会议系统或是金融交易平台——利用好PFC可以帮助维持较低水平的抖动并提高整体用户体验质量。 ```python def apply_pfc_policy(interface, priority_levels): """ Apply PFC policy on a given network interface with specified number of priority levels. :param interface: Network interface name where to apply the PFC settings :type interface: str :param priority_levels: Number of distinct priorities that should be supported by this interface :type priority_levels: int """ command = f"ethtool --set-pause {interface} autoneg off tx on rx on" os.system(command) for i in range(priority_levels): pfc_command = f"ethtool -T {interface} prio-flowctrl on priomap {i}" os.system(pfc_command) apply_pfc_policy('eth0', 8) ``` 此Python脚本展示了如何在一个名为`eth0`的接口上配置八个不同等级的PFC策略。实际操作可能因操作系统版本以及硬件平台的不同有所变化,请参照具体产品的文档进行适当调整。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值