低吞吐量时 WiFi 适配器会延迟数据包

低吞吐量时 WiFi 适配器会延迟数据包

当我测试 WebSocket 连接时,我注意到了抖动;一些 TCP 数据包被延迟了。因此我开始 ping 目标。我这样做后,TCP 数据包不再延迟,很奇怪。我停止 ping;我又开始出现抖动。

似乎如果我超出某个流量阈值,那么网络适配器就不再有抖动,但是低于该阈值时它似乎会延迟数据包。

我再次通过 ping 与 WebSocket 连接路径无关的其他站点进行了测试,这也消除了抖动。无论流量和路径如何,这种情况也会发生,例如,如果我从不同的目的地流式传输数据并测试 WS 连接,则不会出现抖动。这似乎表明它特定于本地网络接口,因为这是这里唯一不变的。

在我看来,NIC 和 IP 堆栈之间存在一些缓冲,并且在低音量时缓冲区没有得到适当刷新

我查看了环形缓冲区大小(驱动程序队列),它们都设置为 0:

Ring parameters for wlp3s0:
Pre-set maximums:
RX:     0
RX Mini:    0
RX Jumbo:   0
TX:     0
Current hardware settings:
RX:     0
RX Mini:    0
RX Jumbo:   0
TX:     0

这是正常的吗?我假设 QDisc 缓冲区将进行缓冲。如果队列大小较小,延迟会降低,但会出现丢包的情况,而我并没有看到这种情况。

我知道 BQL(字节限制队列)是 IP 堆栈和 NIC 之间缓冲的一个功能,但我看不出它会如何像我看到的那样表现。

所以我的问题是;Linux 的网络堆栈中是否存在任何已知的排队算法,该算法可以在 NIC 上的低流量下进行限制,但不再限制高流量下的流量?

答案1

这是由无线网卡上的主动电源管理引起的。

运行此命令关闭 NIC 的电源管理可解决此问题:

sudo iwconfig wlp3s0 power off

似乎此特定 NIC 的电源管理在极短的超时时间内处于活动状态。例如,约 200 毫秒内没有传输任何流量将使 NIC 进入低功耗模式,这意味着 NIC 必须在低流量时不断被唤醒,从而导致数据包延迟。

相关内容