當多個並發程序正在傳輸數據時,LACP 綁定似乎更傾向於一個介面
這可能是一個非常容易的(即我從根本上錯過了一些東西,這只是我的錯/缺乏知識/假設)。
所以我有一台機器,它有 2 個 25GbE 光纖,通過 LACP(思科交換機)與兩個 VLAN 綁定到bond0。
當我啟動 5 或 6 個並發 rsync 將不同的數據從一個源傳輸到目標路徑時,我有點驚訝地發現這些數據基本上只支持一個物理介面(~900MiB/s)。我的假設是負載會在構成鍵的兩個界面之間有所分配。
我完全知道數據包不會跨介面拆分為單個流,但由於我的 rsync 都是獨立的程序,我希望至少有一個或兩個使用第二個物理介面….
作為參考,使用中的 netplan 配置的“粗略”大綱(即刪除的資訊我認為是敏感的):
network: version: 2 renderer: networkd ethernets: eno1: dhcp4: false dhcp6: false optional: true link-local: [] ens5f0np0: dhcp4: false dhcp6: false optional: true ens5f1np1: dhcp4: false dhcp6: false optional: true bonds: bond0: dhcp4: false dhcp6: false interfaces: [ens5f0np0, ens5f1np1] mtu: 9000 parameters: mode: 802.3ad lacp-rate: fast mii-monitor-interval: 100 vlans: bond0.xxx: id: xxx link: bond0 addresses: [ip] gateway4: ip mtu: 1500 nameservers: search: [domains] addresses: [ips] bond0.xxx: id: xxx link: bond0 addresses: [ip] mtu: 9000 routes: - to: random subnet via: local subnet ip - to: random subnet via: local subnet ip - to: random subnet via: local subnet ip
問題是儘管 rsync 是不同的程序,但源 IP 和目標 IP 是相同的(每個 rsync 都在一個位置讀取一個大的子文件夾,然後復製到一個公共位置),並且在綁定處進行散列基本上意味著它認為這一切都是相同的流量嗎?源數據位於 1 個 VLAN 中的伺服器上,而目標伺服器位於另一個 VLAN 上。
如果這是我的錯/不正確的假設仍然想學習所有相同的東西,因為我認為不同的 rsync 將構成不同的數據“流”。
傳出流量的從站選擇是根據傳輸雜湊策略完成的,該策略可以 通過選項從預設的簡單 XOR 策略
xmit_hash_policy
更改,如下所述。第 2 層
使用硬體 MAC 地址和數據包類型 ID 欄位的 XOR 來生成雜湊。公式是
雜湊 = 源 MAC XOR 目標 MAC XOR 數據包類型 ID
從站編號 = 雜湊模從站計數
該算法會將所有流量放在同一個從屬設備上的特定網路對等方。
使用預設設置
layer2
或layer2+3
使用單個 IP 地址的對等系統之間的設置,從解析為單個源 MAC 地址的單個源 IP 地址到解析為單個目標 MAC 地址的單個目標 IP 地址的流量將始終散列到相同的界面。您應該使用
layer3+4
將在介面計算中包含埠的算法:3+4層
此策略使用上層協議資訊(如果可用)來生成散列。這允許到特定網路對等方的流量跨越多個從站,儘管單個連接不會跨越多個從站。
ip link
的xmit_hash_policy
選項轉換為netplan的transmit_hash_policy
參數。所以你應該在配置中添加這個附加參數:transmit_hash_policy: layer3+4
如果流量將通過隧道傳輸到同一目的地的單個地址,
encap3+4
則可以考慮改為。此策略需要更多注意,因為在出現碎片時它不完全符合 LACP。由於第 4 層的協議(TCP/UDP…)埠不包含在片段中,這可能會使第一個片段和後續片段使用不同的介面,並使連接在到達時遭受不需要的數據包重新排序。只要所有涉及的系統都具有相同的 MTU (9000),這應該不是問題,因為 TCP 試圖避免碎片:
此算法不完全符合 802.3ad。包含分段和未分段數據包的單個 TCP 或 UDP 會話將看到跨兩個介面的數據包條帶化。這可能會導致無序傳遞。
$$ … $$