Linux

在 Linux 上調試丟棄的 UDP 消息

  • June 20, 2016

這是我的設置:我有 1 個具有 1 Gbit 乙太網連接的主機和 2 個具有 100 mbit 連接的主機(通過不同的交換機連接到 1Gbit 主機)。

在測試中,我從 1Gbit 主機向 100 mbit 主機發送 1000 條 1kb 消息(在 btwn sendto() 呼叫中沒有延遲)。對於 100 mbit 主機之一,不會丟棄任何數據包。另一個雖然在第 100 個左右之前沒有下降,然後開始下降剩餘的大部分。非常可重複。當我引入 1 毫秒延遲時,兩台主機上都沒有丟包。

我想知道為什麼兩台主機會有不同的行為。

我應該使用哪些方法/工具來追踪這一點?我正在使用 Linux 6.8。我的 rmem_max 在兩台主機上都設置為 10MB。

當您的速度不匹配並且執行速度不匹配時,這是預期的行為。如果您能夠使 1GB 鏈路飽和,則在您發送 1000 個數據包時,另一端將僅讀取 100 個數據包。您的路由器不太可能緩衝剩餘的 900 個數據包。

UDP是一種不可靠的協議。與 TCP 不同,它沒有內置的可靠傳遞。

使用 TCP 連接執行類似的測試可能會有所幫助。在兩個方向上執行它可能有助於確定問題是否是單向的。

在程序上執行time可能會給出一個想法,如果其中一個程序執行得比另一個慢。 netstat -i在執行測試之前和之後,您可以計算到達的數據量,並查看是否生成了任何錯誤。

ethtool可能會告訴您其中一台主機是否處於半雙工模式。半雙工連接容易出現您所看到的問題。如果存在佈線或其他問題,連接可能會在一個或兩個方向上回退到 10 Mbit 半雙工。

如果交換機是託管的,那麼應該檢查相關埠上的配置和錯誤計數器。

如果兩個系統具有不同的乙太網硬體,則可能是問題所在。一些硬體無法處理飽和連結。

引用自:https://serverfault.com/questions/784894