
用户发现显示器将下载速度限制至600Mbps
来源标题:My Monitor Was Cutting My Download Speed by 75%
一名拥有2.5G对称宽带的用户发现其下载速度降至600Mbps,上传仍保持2.4Gbps。排查后确认问题始于将所有连接接入Studio Display XDR显示器,此前通过该显示器从未测过网速。
以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。
我大概算得上那种少数走运的人,有机会在家里拉一条 2.5G 对称宽带。可有一天,我想向同样爱折腾技术的朋友们炫耀一番时,震惊加恐惧:下载只有 600 Mbps?还好上传速度仍然是 2.4 Gbps,所以炫耀的资本没全丢,但这还是很奇怪,对吧?按理说,你应该预期相反的情况才对!
我的 ISP 挺不错的。它由一个哥们儿运营(嘿,Keith!),我知道我随时可以给他发消息,他都会及时回复,这次也一样。我们试着走了一遍调试步骤,他们那边也检查了,一切正常。我又试了我的工作笔记本电脑,速度也一样。
我没时间继续调试,因为我得跨越 2000 公里到大陆另一端处理家庭紧急事务。
但一回来,我又好奇起来。会是什么呢?回想起来,我现在知道它是什么时候开始的:当我把所有连接都移到了我的 Studio Display XDR 上。我想要一套单线缆的方案,而显示器正好提供了这个。我用它已经半年了,我想我从来没通过它跑过速度测试。600 Mbps 对我来说已经足够快,以至于我从未意识到自己没拿到所付费速度的四分之三 🤦
在下载期间,通过插在屏幕上的适配器走以太网,ping 其他有线电脑会有 10% 的失败率,而走 Wi-Fi 则是 0%。更奇怪的是,macOS 的日志里完全没有丢帧错误。这对我来说是个重要线索:适配器在电脑知道之前就把它们丢掉了。
然后我把适配器直接插到我的 Mac 上,而不是显示器上,并在我的 UDR 7 上跑了一个 iperf3 服务器:2.3 Gbps。所以线缆、路由器和适配器都没问题?那 fast.com 呢?那里速度也完美!直连时下载 2.2、上传 2.3。可一旦把它接到显示器上,下载就又回到 600 了。
所以问题出在显示器上,对吧?嗯,我后来发现:算是,也不算是,这正是我想写这篇博文的原因。我在网上找不到任何解释确切原因的东西,而这个原因还挺酷的。
这个适配器用的是 Realtek RTL8156B,在 macOS 上它会绑定到苹果的通用 USB 网络驱动。但 Realtek 在官网上提供了他们自己的驱动,所以我想试试看!我装上后,出乎意料,下载速度几乎翻倍到了 1.1 Gbps,但离 2.5 还是差得远。这是第一个线索,说明不能全怪显示器。
然后我试了流控。我以前从没真正研究过这个,我觉得如果你也像我一样对此一无所知,了解一下还挺有意思的。基本上,当一个设备收到的以太网帧多到处理不过来时,它就直接丢弃。有了流控(这需要你的路由器或交换机支持),它可以向发送方发一个“暂停”帧,然后发送方就在自己这边缓冲数据,而不是让接收方(这里是适配器)缓冲。我在 UniFi 控制台里打开了它,你猜怎么着,下载跳到了大约 2 Gbps,上传仍然满速!耶!好吧,也没那么快……
我不喜欢让它一直开着,因为它会给其他系统(比如我的游戏 PC)增加延迟。能绕过吗?当然可以,你可以在那些电脑上禁用它,但这很别扭,而且当我的 Sauerbraten 游戏开始卡顿时,我又多了一件要记的事。我需要记的事越少越好,毕竟再过几个月我就 30 了。我的记忆力大不如前了。
是啊,这不奇怪吗?首先,这个端口看起来确实能双向跑 2.5。我早就知道这一点,因为我通过显示器的 Thunderbolt 端口从外置 SSD 得到的速度远高于此。所以问题又不在显示器?但肯定得是它啊!
嗯,我有了另一个主意。要不我连到我的 Linux 机器上——它也是 2.5——在关闭流控的情况下,以固定速率发送完全平滑的 UDP 流量?然后我就可以检查芯片自己的丢帧计数器了:
所以基本上,直连我的 Mac 时完全没有丢包,但一旦超过每秒约 16.8 万帧(大约 2 Gbps),就会出现大量丢包。记住这个数字。这个数字来自适配器自己的计数器:无论我发多少,它每秒成功交给 Mac 的帧数都稳定在约 168,000,超过这个数的全被丢弃了。
为什么我的 SSD 没这个问题?我能找到的唯一区别是什么?突发!
当 Mac 从 USB 3 设备读取数据时,设备会发送一些数据包,然后必须等 Mac 说“看起来不错,再发点!”。SSD 硬盘盒在需要收到放行消息前会发送 16 个数据包。而我以太网适配器里的 RTL8156B 只发 4 个。
下面这张图是我对这个问题成因的最佳理解。这张图我画了 100 遍,我觉得可能还能再改进,但如果它能帮你理解这个问题,那我的目的就达到了。
如你所见,进入适配器的数据包速度是 2.5 Gbps。这是路由器推过来的速度。出去的速度大约是 2 Gbps。原因是,如果你把通过我显示器集线器获得放行消息的平均时间(大约 7.6 微秒)加上发送 4 KB 的平均时间(大约 8.2 微秒),你就能算出最高速度是多少。
嗯,如果从我适配器到 Mac 的排出速度比输入速度慢半 G,那么你可以想象缓冲区会被越填越满,直到溢出。那些就是被丢弃的数据包,导致路由器重发时出现硬退避,于是速度大幅下降。这就是这一切的原因。
我有一个柜子,塞满了 USB-C 以太网适配器。别问。
(原文较长,此处译出前 6000 字,完整内容请点「打开原文」。)
正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。