概要

局域网内高速端口向低速端口发送数据,流控不当会有严重的帧溢出风险,引发上层丢包、乱序、重放等问题导致 TCP 重传;从而导致对重传敏感的无线信道性能急剧劣化。建议正确的全链路配置802.3x标准支持实现链路层流控,同时高速发送端使用对丢包不敏感的拥塞控制算法 BBR 。对于带无线接入的家庭环境,放弃 TrueNAS Core ,使用 TrueNAS SCALE 并配置BBR

背景

NAS 使用 TrueNAS Core ,万兆 SFP+ 直连主路由( RB5009 ),AP 使用 U6 Enterprise ,2.5GbE 接入主路由。AP 下连客户端协商速率隔墙可达 1.7Gbps ,SMB 从 NAS 中下载文件速率不足 30MB/s ,视无线环境可能更糟,上行可以正常跑到 110MB/s 以上,最高可达 150MB/s ,iperf3 双向测速情况和 SMB 表现基本一致,多线程可缓解,有线条件下一切正常。降级到全千兆接入,问题也极大缓解。

网络拓扑如图所示:

下载:

上传:

发现

问题最早发现的时候还不是这套无线设备,经过漫长的更换设备排查和观察定位,发现以下现象:

1 、主路由 SFP+ 口处发现海量 Rx Overflow

2 、客户端上抓包发现大量的 Dup ACK 和由此导致的 Retransmission ,还能看到很多 Out-of-Order 此处未截出

3 、TrueNAS Core 默认拥塞控制算法为 NewReno ,更换为 Cubic 之后好了一点,但很有限

解决

基本可以确定是高速端口在向低速端口发送数据的时候,因为没有正确的流控导致交换设备出现严重的溢出;同时更上层的拥塞控制算法,因为对丢包过于敏感,未能将发送窗口协商至合理的链路带宽;加之无线信道对重传也敏感的多,多种因素综合导致了无线下行拥塞大爆炸,下行速率远劣于上行。问题找到了,于是动手解决:

1 、RouterOS 所有端口手动配置 Flow Control (是的,默认未启用)

2 、更换 NAS 系统为 TrueNAS SCALE 并配置 BBR

下行立刻恢复至 130MB/s:

附言

不建议无差别启用链路层流控

在我本人的例子中,Rx Overflow 发生在交换设备的高速端口处,按理说只要交换机和端口上游(即 NAS 的网卡和系统)支持并启用(我使用的 ESXi 虚拟化方案和 CX4 网卡,应该都默认启用了),就可以暂停这条链路上的发送了。

启用后确实遏制了万兆口处 Rx Overflow 的进一步增长,但对速度的提升效果没预期那么好。有可能这个时候卡点变成了 AP 的无线链路本身,这里的 Flow Control 行为我就不太能控制了,Unifi App 里自己的 Flow Control 设置似乎是针对它家交换机的。

而且 802.3x 还有另外的副作用,即会无差别暂停掉整个链路的发送,在多设备重负载场景下对链路稳定性有负面影响。这个特性行为简单,应该是用来减缓一些没有流控和完整性保证能力的简单协议的丢包的。像 TCP 这种传输层协议,最好还是传输层自己做流控的保证,选用合适的拥塞控制算法。从这个角度看,RouterOS 默认不启用链路层流控是很合理的,是否启用请读者自行评估。