Networking

當多個並發程序正在傳輸數據時,LACP 綁定似乎更傾向於一個介面

  • July 16, 2022

這可能是一個非常容易的(即我從根本上錯過了一些東西,這只是我的錯/缺乏知識/假設)。

所以我有一台機器,它有 2 個 25GbE 光纖,通過 LACP(思科交換機)與兩個 VLAN 綁定到bond0。

當我啟動 5 或 6 個並發 rsync 將不同的數據從一個源傳輸到目標路徑時,我有點驚訝地發現這些數據基本上只支持一個物理介面(~900MiB/s)。我的假設是負載會在構成鍵的兩個界面之間有所分配。Grafana 圖的圖像,顯示每個介面的網路流量

我完全知道數據包不會跨介面拆分為單個流,但由於我的 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 將構成不同的數據“流”。

預設情況下, LACP將使用第 2 層 XOR策略

傳出流量的從站選擇是根據傳輸雜湊策略完成的,該策略可以 通過選項從預設的簡單 XOR 策略xmit_hash_policy更改,如下所述。

第 2 層

使用硬體 MAC 地址和數據包類型 ID 欄位的 XOR 來生成雜湊。公式是

雜湊 = 源 MAC XOR 目標 MAC XOR 數據包類型 ID

從站編號 = 雜湊模從站計數

該算法會將所有流量放在同一個從屬設備上的特定網路對等方

使用預設設置layer2layer2+3使用單個 IP 地址的對等系統之間的設置,從解析為單個源 MAC 地址的單個源 IP 地址到解析為單個目標 MAC 地址的單個目標 IP 地址的流量將始終散列到相同的界面。

您應該使用layer3+4將在介面計算中包含埠的算法:

3+4層

此策略使用上層協議資訊(如果可用)來生成散列。這允許到特定網路對等方的流量跨越多個從站,儘管單個連接不會跨越多個從站。

ip linkxmit_hash_policy選項轉換為netplantransmit_hash_policy參數。所以你應該在配置中添加這個附加參數:

   transmit_hash_policy: layer3+4

如果流量將通過隧道傳輸到同一目的地的單個地址,encap3+4則可以考慮改為。

此策略需要更多注意,因為在出現碎片時它不完全符合 LACP。由於第 4 層的協議(TCP/UDP…)埠不包含在片段中,這可能會使第一個片段和後續片段使用不同的介面,並使連接在到達時遭受不需要的數據包重新排序。只要所有涉及的系統都具有相同的 MTU (9000),這應該不是問題,因為 TCP 試圖避免碎片:

此算法不完全符合 802.3ad。包含分段和未分段數據包的單個 TCP 或 UDP 會話將看到跨兩個介面的數據包條帶化。這可能會導致無序傳遞。

$$ … $$

引用自:https://unix.stackexchange.com/questions/710127