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 必須在低流量時不斷被喚醒,導致封包延遲。

相關內容