- PFC是一种流控的手段,是影响和生效在交换机上的行为,核心原理是下游控制上游某个通道开启和停止发送数据包,控制方式是发送PFC Pause和Resume帧,触发时机是根据下游SW的ingress的队列数量是否达到某个阈值
- PFC(Priority-based Flow Control,基于优先级的流量控制)
- PFC允许在一条以太网链路上创建8个虚拟通道(优先级队列),为每条虚拟通道指定一个优先等级,是基于Priority Group的也就是很多流在同一个优先级队列。分别实现独立的PAUSE机制。
- 如果交换机使能PFC功能,向上游SW发送PFC Pause帧(只影响某个虚拟通道),上游某个优先级通道暂停发送报文。暂停时间由PFC Pause帧携带。逐级反压上游,快速响应。
- 如果某个优先级队列被暂停,那么这个channel里面的所有流都会受影响,所以有一个不公平的问题
- DSCP 差分服务代码点和PFC队列结合可以提供很多可能性
- PFC是根据下游的ingress(输入)端口队列长度进行触发,交换机支持设定每个优先级的门限XOFF,达到门限XOFF之后发送pause。 相比于ECN是egress出口方向的参数进行处理的
- 交换机处理发送Pause之后在途报文处理方式,预留一定的buffer处理,这个buffer大小只要足够,可以保证缓存时钟不会溢出,可以实现无损网络
- 下游向上游发送RESUME帧通知重新开始发送
- PFC存在的问题:PFC风暴、PFC死锁、不公平
- PFC可以配合ECN,在egress方向发现问题后设置合适的阈值,影响接收端发送CNP报文提前影响发送端减低速率,从而可以做到在PFC可能发生前就降低速率,减少拥塞和一定程度避免PFC风暴
- PFC风暴是什么?如果多级拓扑下,所有上游的某个队列都会被影响,从而快速扩散成风暴(在蓝牙mesh的技术里面也有类似的广播风暴)
- PFC死锁是什么?PFC Pause发送之后,恢复依赖于发送RESUME。恢复依赖于交换机的ingress的队列占用降低,ingress的降低依赖于egress部分能够发送出去数据,如果egress的下游SW2在网络拓扑中形成类似环路,下游SW2也会收到pause,那么SW2的egress会阻塞,进一步造成SW2的ingress阻塞,SW2发送pause给SW1,造成SW1的egress阻塞,进一步造成SW1的ingress阻塞,那么SW1就无法恢复,就不会给SW1上游发送RESUME
- PFC死锁有不少解决办法,比如watchdog监控、结合ECN避免
参考链接:
https://asterfusion.com/priority-based_flow_control_pfc/