簡體   English   中英

如何使用RTE_FLOW在DPDK中以round-robin的方式進行負載均衡?

[英]How to load balance by way of round-robin in DPDK using RTE_FLOW?

在我的問題中,RSS 在 CPU 內核之間沒有很好的負載平衡情況下,rx 數據包已被 mac 和 ip 之間的插入標記修改,因此 dpdk 無法識別它。假設我想通過循環法進行負載平衡,多個rx 隊列已設置。 在這個問題的答案中:How to disable RSS but still using multiple RX queues in DPDK? 它說可以通過使用 RTE_FLOW 以循環方式進行負載平衡。 語法上正確的方法是什么? 我想知道 API 或用於設置循環法的結構這里是我的運行時環境信息:1)dpdk 版本:19.11.9 2)nic PMD:ixgbe 3)fireware:825999 和 XXV710 4)操作系統版本: ubuntu 16.04 kernel:4.4.0-186

根據問題

RSS 在 CPU 內核之間沒有很好的負載平衡,如果rx 數據包已被 mac 和 ip 之間的插入標簽修改

有幾個項目需要澄清。 所以讓我解釋一下

  1. 某些物理和虛擬 NIC 通過 DPDK RX 卸載為固定元組(如 IP、協議、TCP|UDP|SCTP 端口號)公開RSS
  2. 某些 NIC 允許配置 hash reta 算法以更好地滿足需求(例如,當源目標 IP 地址固定時,我們可以跳過並使用其他算法)。
  3. 正如我從 DPDK 18.11 回憶起的那樣,RTE_FLOW 被引入以支持選定 RX 隊列上的 RSS(例如 Q1、Q2、Q3 可以是 TCP 數據包的 RSS,而 Q4、Q5 可以用於 UDP)。 但這同樣是基於內部或外部 IP+端口號
  4. 從 DPDK 版本 19.11 開始,RTE_FLOW 得到增強以支持RAW Pattern 此功能的目的是支持默認情況下 NIC 不理解的特殊協議,如(VXLAN、GENEVE、RTP 和其他協議)。
  5. Fortville & Columbiaville(來自 Intel)之類的 NIC 允許通過 DDP(動態設備角色)加載特殊固件,以配置特殊結構標頭或 MPLS 之類的標頭(在 ethe.net 和 ip 之間)進行解析、查找並用作 RSS 的種子(允許更好的分配)。
  6. 有支持 L2 層的 NIC,但僅限於 SMAC、DMAC、VLAN1、VLAN2、MPLS,而不是自定義 header。

因此,根據 NIC、供應商、對 L2 的 RSS 支持和固件,在端口初始化或 RTE_FLOW 特定配置中計算字段之間的 RSS 的能力各不相同。 例如 RSS ETH 支持

  1. I40E 是I40E_INSET_DMAC | I40E_INSET_SMAC I40E_INSET_DMAC | I40E_INSET_SMAC
  2. DPAA2是NH_FLD_ETH_TYPE and.NET_PROT_ETH
  3. CNXK 是RSS_DMAC_INDEX
  4. OCTEONX2 是FLOW_KEY_TYPE_VLAN and FLOW_KEY_TYPE_CH_LEN_90B

因此,對於 NIC ixgbe and XXV710 ,ethe.net 和 IP 之間的custom header沒有現成的支持。

備擇方案:

  1. 使用智能 NIC 或 FPGA:它被編程為將特定標頭上的 RSS 解析為多個 RX 隊列上的 RSS
  2. 使用 XXV710 (Fortville) 與 Intel 合作:創建 DDP,它可以在多個 RX 隊列上將您的特定標頭解析為 RSS。
  3. 識別 DPDK NIC:可以解析RAW header 定義12.2.6.2 一旦供應商添加了支持,您就可以創建一個簡單的traffic spread tool ,該工具將確保以循環方式在所需的 RX 隊列中分配流量。
  4. 使用 SW 支持缺少的硬件。

注意:我不建議使用基於 HW 的 static Round Robin,因為它會產生 2 倍問題

  • 如果它是純DPDK BOND Round ROBIN ,則不會有任何流固定
  • 如果您使用基於 hash 的固定,大象流可能會推送 1 個或幾個隊列,導致 CPU 處理性能下降。
  • 我的建議是使用具有原子模式的 EVENTDEV model,這可確保更好的緩存局部性(在給定實例中,相同的流將落入工作線程)和幾乎線性的性能表現。 示例應用程序

對於選項 4(軟件模型):

  1. 在 port_init 中禁用 RSS function
  2. 使用單個 RX 隊列接收所有數據包或自定義 rx 線程。
  3. 根據所需的 header 計算 hash 並更新 mbuf hash 字段。
  4. 使用rte_distributor庫根據自定義分配流量。
  5. 或者將rte_eventdev與 atomic model 一起使用,將工作負載分散到多個 worker 上。

[來自評論的澄清]:

  1. 我問過相關從業者,他們說修改pmd驅動可以解決我的問題,這是唯一的辦法嗎?

[ANSWER]由於您使用的是自定義 header 而不是通用 VLAN|IP|Port 此建議是不正確的。 正如您在問題和評論中所澄清的那樣,您希望像 RSS 一樣分發自定義 header。

  1. 我還沒有寫任何關於 rte_flow 分配的代碼,我讀了 rte_flow 示例,沒有看到配置循環的代碼

[ANSWER]如上所述,並非所有 nic 都支持 RSS 和 RAW。 由於您當前的 NIC 是ixgbe and i40e ,因此不太可能為自定義 header 解析和執行 RSS function。 您可以為 i40e 嘗試選項 2(與英特爾一起創建新的 ddp)以實現相同的效果或按照選項 4 中的建議在 SW 中實現。

  1. 我不要求解決方案,我只是想知道如何通過“RTE_FLOW”設置循環法你能給我一些嗎 API

[ANSWER]通常使用用於重現錯誤的代碼片段或步驟進行更新。 但目前的問題更像是澄清。 請參考上文。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM