在智能交換機上設置鏈路聚合組 (LAG) 時,頻寬的鏈路聚合(綁定)不起作用
我的問題是:為什麼在智能交換機上設置鏈路聚合組會降低兩台機器之間的頻寬?
我終於在兩台機器(執行 ubuntu 18.04 伺服器的伺服器)之間實現了更高的吞吐量(頻寬),通過 TP-LINK T1700X-16TS 智能交換機通過 2 條綁定的 10G CAT7 電纜連接。電纜連接到每台機器中的單個英特爾 X550-T2 NIC(每張卡上有 2 個 RJ45 埠),插入 PCI-E x8。
我做的第一件事是在交換機的配置中創建靜態 LAG 組,其中包含每台機器所連接的兩個埠。這最終成為我的第一個錯誤。
在每個盒子上,創建一個綁定,其中包含英特爾 X550-T2 卡上的兩個埠。我正在使用 netplan(和網路)。例如:
network: ethernets: ens11f0: dhcp4: no optional: true ens11f1: dhcp4: no optional: true bonds: bond0: mtu: 9000 #1500 dhcp4: no interfaces: [ens11f0,ens11f1] addresses: [192.168.0.10/24] parameters: mode: balance-rr transmit-hash-policy: layer3+4 #REV: only good for xor ? mii-monitor-interval: 1 packets-per-slave: 1
注意 9000 字節的 MTU(用於巨型數據包)和 balance-rr。
有了這些設置,我現在可以使用 iperf (iperf3) 來測試機器之間的頻寬:
iperf3 -s (on machine1) iperf3 -c machine1 (on machine2)
我得到每秒 9.9 Gbits 的速度(非常接近單個 10G 連接的理論最大值)
不過有些不對勁。我正在使用循環,機器之間有兩條 10G 電纜(理論上)。我應該可以得到20G的頻寬吧?
錯誤的。
奇怪的是,我接下來從智能交換機中刪除了 LAG 組。現在,在 linux 端我有綁定介面,但是對於交換機,沒有綁定(沒有 LAG)。
現在我再次執行 iperf3:
[ ID] Interval Transfer Bandwidth Retr Cwnd [ 4] 0.00-1.00 sec 1.77 GBytes 15.2 Gbits/sec 540 952 KBytes [ 4] 1.00-2.00 sec 1.79 GBytes 15.4 Gbits/sec 758 865 KBytes [ 4] 2.00-3.00 sec 1.84 GBytes 15.8 Gbits/sec 736 454 KBytes [ 4] 3.00-4.00 sec 1.82 GBytes 15.7 Gbits/sec 782 507 KBytes [ 4] 4.00-5.00 sec 1.82 GBytes 15.6 Gbits/sec 582 1.19 MBytes [ 4] 5.00-6.00 sec 1.79 GBytes 15.4 Gbits/sec 773 708 KBytes [ 4] 6.00-7.00 sec 1.84 GBytes 15.8 Gbits/sec 667 1.23 MBytes [ 4] 7.00-8.00 sec 1.77 GBytes 15.2 Gbits/sec 563 585 KBytes [ 4] 8.00-9.00 sec 1.75 GBytes 15.0 Gbits/sec 407 839 KBytes [ 4] 9.00-10.00 sec 1.75 GBytes 15.0 Gbits/sec 438 786 KBytes - - - - - - - - - - - - - - - - - - - - - - - - - [ ID] Interval Transfer Bandwidth Retr [ 4] 0.00-10.00 sec 17.9 GBytes 15.4 Gbits/sec 6246 sender [ 4] 0.00-10.00 sec 17.9 GBytes 15.4 Gbits/sec receiver
嗯,現在我得到 15.4 Gbits/sec(有時高達 16.0)。
重新發送讓我擔心(當我設置 LAG 時,我得到了零),但現在我至少獲得了一些優勢。
請注意,如果我禁用巨型數據包或將 MTU 設置為 1500,我只能得到大約 4Gbps 到 5Gbps。
有誰知道為什麼在智能交換機上設置連結聚合組(我認為應該有幫助),而不是限制性能?另一方面,不設置它們(哎呀,我本可以省錢買一個非託管交換機!)讓我發送更多正確路由的數據包?
交換機的 LAG 組有什麼意義?我在某處做錯了嗎?如果可能的話,我想增加頻寬甚至超過 16Gbps。
編輯
從我下面的評論中複製(更新):
我通過綁定連接驗證了真實應用程序 11Gbps(1.25 GiB/秒),使用 nc(netcat)將 60 GB 文件從一個系統上的 ramdisk 複製到另一個系統。我使用雜湊驗證了文件的完整性,兩邊都是同一個文件。
一次僅使用一個 10G 埠(或使用 balance-xor 等綁定),我得到 1.15 GiB/sec(約 9.9 Gbps)。預設情況下,iperf 和 nc 都使用 TCP 連接。將其複製到本地機器(通過環回)可以獲得 1.5 GiB/秒的速度。查看交換機上的埠使用情況,我看到發送方 Tx 端的使用率大致相同(iperf 為 70%,nc 文件複製為約 55%),並且 2 個綁定埠之間的使用率相同接收端。
因此,在目前設置中(balance-rr,MTU 9000,交換機上未定義 LAG 組),我可以實現超過 10Gbps,但只能勉強實現。
奇怪的是,現在在交換機上定義 LAG 組會破壞一切(iperf 和文件傳輸現在發送 0 個字節)。可能只是需要時間來弄清楚新的切換情況,但我重新執行了很多次並重新啟動/重置了幾次開關。所以,我不確定為什麼會這樣。
編輯 2
實際上,我在 kernel.org 文件中發現了條帶化和 balance-rr 允許高於單埠頻寬的內容。
https://www.kernel.org/doc/Documentation/networking/bonding.txt
具體來說
12.1.1 單開關拓撲的 MT Bonding 模式選擇
這種配置是最容易設置和理解的,儘管您必須決定哪種綁定模式最適合您的需要。每種模式的取捨詳述如下:
balance-rr:此模式是唯一允許單個 TCP/IP 連接跨多個介面條帶化流量的模式。因此,它是允許單個 TCP/IP 流利用多個介面的吞吐量的唯一模式。然而,這是有代價的:條帶化通常會導致對等系統無序地接收數據包,從而導致 TCP/IP 的擁塞控制系統啟動,通常是通過重新傳輸段。
可以通過更改 net.ipv4.tcp_reordering sysctl 參數來調整 TCP/IP 的擁塞限制。通常的預設值為 3。但請記住,TCP 堆棧能夠在檢測到重新排序時自動增加此值。
請注意,將無序傳送的數據包的比例是高度可變的,並且不太可能為零。重新排序的級別取決於多種因素,包括網路介面、交換機和配置的拓撲。一般而言,高速網卡會產生更多的重新排序(由於數據包合併等因素),並且“多對多”拓撲將以比“多慢到一快”配置更高的速率重新排序。
許多交換機不支持任何條帶化流量的模式(而是根據 IP 或 MAC 級別地址選擇埠);對於這些設備,通過交換機流向 balance-rr 綁定的特定連接的流量不會使用超過一個介面的頻寬。
如果您正在使用 TCP/IP 以外的協議,例如 UDP,並且您的應用程序可以容忍亂序傳遞,那麼此模式可以允許單流數據報性能隨著介面添加到綁定而接近線性擴展。
此模式要求交換機為“etherchannel”或“trunking”配置適當的埠。
因此,理論上,balance-rr將允許我對單個 TCP 連接的數據包進行條帶化。但是,它們可能會亂序到達,等等。
但是,它提到大多數交換機不支持條帶化。我的開關似乎就是這種情況。在真正的文件傳輸過程中觀察流量,Rx 數據包(即發送機器->交換機)平均分佈在兩個綁定埠上。但是,Tx 數據包 (switch->receiving_machine) 僅通過其中一個埠發出(並達到 90% 或更高的飽和度)。
通過不在交換機中明確設置鏈路聚合組,我能夠實現更高的吞吐量,但我不確定接收機器是如何告訴交換機將一個埠發送到一個埠,然後將另一個埠發送到另一個埠,等等。
結論:
交換機鏈路聚合組不支持循環(即埠條帶化)發送數據包。因此,忽略它們可以讓我獲得高吞吐量,但實際寫入記憶體(ramdisk)似乎會達到記憶體、CPU 處理或數據包重新排序的飽和點。
我嘗試增加/減少重新排序,以及使用 sysctl 為 TCP 讀寫記憶體緩衝區,但性能沒有變化。例如
sudo sysctl -w net.ipv4.tcp_reordering=50 sudo sysctl -w net.ipv4.tcp_max_reordering=1000 sudo sysctl -w net.core.rmem_default=800000000 sudo sysctl -w net.core.wmem_default=800000000 sudo sysctl -w net.core.rmem_max=800000000 sudo sysctl -w net.core.wmem_max=800000000 sudo sysctl -w net.ipv4.tcp_rmem=800000000 sudo sysctl -w net.ipv4.tcp_wmem=800000000
我注意到的唯一性能變化是在以下機器之間:
1)更強大的處理器(略高的單核時鐘,不關心 L3 記憶體)
2)更快的記憶體?(或相同數量的記憶體使用更少的 DIMM)
這似乎意味著我正在訪問匯流排、CPU 或記憶體讀/寫。在 ramdisk 中本地的簡單“複製”(例如 dd if=file1 of=file2 bs=1M)導致 2.6 Ghz 上大約 2.3GiB/sec、2.4 Ghz 上 2.2GiB/sec 和 2.0GiB/sec 上的最佳速度2.2GHz。第二個記憶體更慢,但這似乎並不重要。
從較慢的機器到 2.6 Ghz ramdisk 的所有 TCP 副本的速度為 1.15 GiB/s,從 2.4 Ghz 的速度為 1.30 GiB/s,從最快的機器到中間機器的速度為 1.02 GiB/s,再到較慢的機器(具有更快的記憶體) 1.03 GiB/s 等
最大的影響似乎是單核 CPU 和接收端的記憶體時鐘。我沒有比較 BIOS 設置,但都執行相同的 BIOS 版本並使用相同的主機板、eth 卡等。重新排列 CAT7 電纜或交換機埠似乎沒有效果。
我確實找到了
http://louwrentius.com/achieving-340-mbs-network-file-transfers-using-linux-bonding.html
誰用四個 1GbE 連接來做到這一點。我嘗試設置單獨的 VLAN,但它不起作用(沒有提高速度)。
最後,使用相同的方法發送給自己似乎會導致 0.3 GiB - 0.45 GiB/sec 的懲罰。所以,我觀察到的值並沒有比這種方法的“理論”最大值低多少。
編輯 3 (為後代添加更多資訊)
即使在交換機上設置了 balance-rr 和 LAG,我也剛剛意識到,儘管看到 9.9 Gbps,但 balance-rr 中的重試實際上比沒有 LAG 的情況下要高!每秒平均2500個帶組,1000個平均不帶組!
但是,在設置組後,我得到的平均實際文件傳輸速度記憶體為 1.15 GiB/s (9.9 Gbps)。如果我只在每台機器上插入一個埠,我會看到相同的速度 (1.15 GiB/s),並且重試次數很少。如果我將模式切換到 balance-xor,我會得到 1.15 GiB/s (9.9 Gbps),並且不會重新發送。因此,balance-rr 模式試圖在輸出上進行條帶化以切換事物的一面,我猜這會導致很多亂序數據包。
由於我使用 switch LAG 和 balance-xor 進行記憶體到記憶體傳輸的最大(真實世界)性能相似或更高,而重新發送(擁塞)更少,我正在使用它。但是,由於最終目標是 NFS 和 MPI 發送,我需要以某種方式找到一種方法來飽和並測量這些情況下的網路速度,這可能取決於 MPI 連接的實現方式……
最終編輯
我重新使用 balance-rr (在交換機端沒有設置 LAG),因為 XOR 將始終散列到相同的兩個對等端的相同埠。所以它只會使用其中一個埠。使用 balance-rr,如果我同時執行 2 個或更多(ram 到 ram)文件傳輸,我可以獲得 18-19 Gbps 的淨速度,非常接近 20 Gbps 的理論最大值。
Final Final Edit(使用幾個月後)
我必須在交換機中設置 LAG 組,因為我遇到了無法再通過 SSH 連接到機器的錯誤,我認為是因為數據包與一些定址內容混淆了。現在,我只能獲得每個連接的最大 10GBPS,但它是穩定的。
正如我在最後的編輯中提到的,當交換機設置了鏈路聚合組時,我無法使用循環綁定獲得更高頻寬的原因是交換機鏈路聚合組不會對單個數據包進行循環條帶化TCP 連接,而 linux 綁定可以。kernel.org 文件中提到了這一點:
https://www.kernel.org/doc/Documentation/networking/bonding.txt
12.1.1 單開關拓撲的 MT Bonding 模式選擇
這種配置是最容易設置和理解的,儘管您必須決定哪種綁定模式最適合您的需要。每種模式的取捨詳述如下:
balance-rr:此模式是唯一允許單個 TCP/IP 連接跨多個介面條帶化流量的模式。因此,它是允許單個 TCP/IP 流利用多個介面的吞吐量的唯一模式。然而,這是有代價的:條帶化通常會導致對等系統無序地接收數據包,從而導致 TCP/IP 的擁塞控制系統啟動,通常是通過重新傳輸段。
可以通過更改 net.ipv4.tcp_reordering sysctl 參數來調整 TCP/IP 的擁塞限制。通常的預設值為 3。但請記住,TCP 堆棧能夠在檢測到重新排序時自動增加此值。
請注意,將無序傳送的數據包的比例是高度可變的,並且不太可能為零。重新排序的級別取決於多種因素,包括網路介面、交換機和配置的拓撲。一般而言,高速網卡會產生更多的重新排序(由於數據包合併等因素),並且“多對多”拓撲將以比“多慢到一快”配置更高的速率重新排序。
許多交換機不支持任何條帶化流量的模式(而是根據 IP 或 MAC 級別地址選擇埠);對於這些設備,通過交換機流向 balance-rr 綁定的特定連接的流量不會使用超過一個介面的頻寬。
如果您正在使用 TCP/IP 以外的協議,例如 UDP,並且您的應用程序可以容忍亂序傳遞,那麼此模式可以允許單流數據報性能隨著介面添加到綁定而接近線性擴展。
此模式要求交換機為“etherchannel”或“trunking”配置適當的埠。
關於將埠配置為“中繼”的最後一點很奇怪,因為當我在 LAG 中創建埠時,來自交換機的所有傳出 Tx 都會下降到一個埠。刪除 LAG 使其在每個埠上發送和接收一半,但會導致許多重新發送,我認為是由於數據包亂序造成的。但是,我仍然會增加頻寬。