多個連接的聚合吞吐量 (Linux)
為什麼來自同一主機的多個連接比來自不同主機的多個連接獲得更好的吞吐量?
我懷疑是與核心相關的東西(Linux),但確認會有很大幫助。
更多細節我有 1 個接收器程序,我們稱之為 R。它接受傳入連接並使用 select() 接收數據。
我有 3 個發件人程序 S1、S2、S3。它們連接到 R 並以固定速率發送數據,即每個每秒 200Mbit。
如果 S1、S2 和 S3 在同一台機器上,我會比將它們中的每一個放在不同的機器上得到更好的結果。(R 在這兩種情況下都在其他機器上)
範例:主機 0 上的 R,主機 2 上的 S1、S2、S3,R 以 600Mbit/s 的速度接收
R 在 host0 上,S1 在 host1 上,S2 在 host2 上,S3 在 host3 上,R 以 480Mbit/s 接收
這對我來說看起來違反直覺,我期望相反,因為在第二種情況下,發件人不必共享網卡和處理器(不希望處理器或網卡成為瓶頸……)
$$ The hosts above are nodes in a linux cluster with a dedicated full-duplex Gigabit switch. They are running 2.6.24-24-generic (latest Ubuntu i guess) $$
我懷疑這與交換機如何管理爭用有關。1 個發送者沒有爭用,3 個發送者都盡可能快地推送,交換機可能會開始丟棄數據包,從而導致 TCP 退避和重新傳輸。
我想您可以通過將 3 張卡放入接收器並將它們直接連接到發送器來測試這一點(不要認為您需要千兆交叉電纜)
我相信這是一個經典的管道效率問題。
在多個發送主機的情況下,它們都將開始通過線路發送乙太網幀。這些幀將到達交換機背板,並在連接到 host0 的埠中排隊。Host0 將盡可能快地接收這些數據,但發送者將很快用每秒比 host0 交換機埠可以傳送的幀數更多的幀來淹沒交換機。他們試圖通過只能讀取 1 Gb/s 的埠推送 3 Gb/s。
通常,如果這些幀堆積在埠 0 隊列中,交換機將能夠緩衝這些幀。但他們不能創造奇蹟。所以交換機將開始在地板上丟幀。結果是很多 TCP 數據包會失去。您可以通過檢查發件人主機中此計數器的增加來驗證這一點:
netstat -s|grep ‘segments retrans’
正如您可以想像的那樣,重傳只會使擁塞變得更糟 - 即使使用退避算法
如果只有一台主機,它將以 1 Gigabit/s 傳輸。接收器可能會收到所有乙太網幀,它應該可以正常工作。我還建議使用 UDP 進行一對一測試,你會得到更好的結果。完成這項任務的一個不錯的工具是“iperf”。
祝你好運!