如何使用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 无法识别 it.assume 我想通过循环的方式进行负载平衡,已经设置了多个 rx 队列。在这个问题的答案中:How to disable RSS but still using multiple RX queues in DPDK?它说它的 pos 可以通过使用 RTE_FLOW 以循环方式进行负载平衡。语法上正确的方法是什么? 我想知道 API 或用于设置循环法的结构 这是我的运行时环境信息: 1)dpdk版本:19.11.9 2)网卡PMD:ixgbe 3) fireware:825999 和 XXV710 4) os 版本: ubuntu 16.04 kernel:4.4.0-186

根据问题

RSS did not have a good load balance between CPU cores case the rx packets has been modified by insert tags between mac and ip

有几项需要澄清。所以让我解释一下

  1. 某些物理和虚拟 NIC 通过 DPDK RX 卸载公开 RSS 固定元组,如 IP、协议、TCP|UDP|SCTP​​ 端口号。
  2. 某些 NIC 允许配置 hash reta 算法以更好地满足需要(例如,当源目标 IP 地址固定时我们可以跳过并使用其他算法)。
  3. 正如我从 DPDK 18.11 中回忆的那样,引入了 RTE_FLOW 以在选定的 RX queue 上支持 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(来自英特尔)这样的 NIC,允许通过 DDP(动态设备角色)加载特殊固件以配置特殊结构 headers 或 MPLS,如 headers(在以太网和ip) 被解析、查找并用作 RSS 的种子(允许更好的分发)。
  6. 有支持 L2 层的网卡,但仅限于 SMAC、DMAC、VLAN1、VLAN2、MPLS 而不是自定义 header。

因此,根据 NIC、供应商、对 L2 的 RSS 支持和固件,在端口初始化或 RTE_FLOW 特定配置中计算字段之间的 RSS 的能力会有所不同。例如 RSS ETH

支持
  1. I40E 是 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,以太网和 IP 之间 custom header 没有现成的支持。

备选方案:

  1. 使用智能 NIC 或 FPGA:被编程为在您的特定 header 上解析和 RSS 到多个 RX queue
  2. 上的 RSS
  3. 使用 XXV710 (Fortville) 与英特尔合作:创建 DDP,它可以在多个 RX queue.
  4. 上将您的特定 header 解析为 RSS
  5. 识别DPDK NIC:可以解析RAW header定义的12.2.6.2。一旦供应商添加了支持,您就可以创建一个简单的 traffic spread tool,这将确保以循环方式在所需的 RX queue 之间分配流量。
  6. 使用软件支持缺少的硬件。

注意:我不推荐使用基于 HW 的静态 Round Robin,因为它会产生 2 倍问题

  • 如果它是纯的DPDK BOND Round ROBIN你不会有任何流固定
  • 如果您使用基于哈希的固定,大象流有可能推送 1 个或几个 queues,导致 cpu 处理性能下降。
  • 我的建议是使用具有原子模式的 EVENTDEV 模型,这可确保更好的缓存局部性(在给定实例中,相同的流将落入工作线程)和几乎线性的性能表现。 sample app

对于选项 4(软件模型):

  1. 在 port_init 函数中禁用 RSS
  2. 使用单个 RX queue 通过自定义 rx 线程接收所有数据包。
  3. 根据需要计算哈希header并更新mbuf哈希字段。
  4. 使用rte_distributor库根据自定义分配流量。
  5. 或将 rte_eventdev 与原子模型一起使用,以将工作负载分摊到多个工作人员身上。

[来自评论的澄清]:

  1. 问过相关同修,他们说修改pmd driver可以解决我的问题,只有这样吗?

[ANSWER] 由于您使用的是自定义 header 而不是通用 VLAN|IP|Port 此建议不正确。正如您在问题和评论中所澄清的那样,您希望像 RSS 一样分发自定义 header.

  1. 我还没有写任何关于 rte_flow 分发的代码,我阅读了 rte_flow 示例,没有看到配置 round-robin
  2. 的代码

[ANSWER] 如上所述,并不是所有的网卡都支持 RSS 和 RAW。由于您当前的网卡是ixgbe and i40e,因此不太可能为自定义header解析和执行RSS的功能。您可以为 i40e 尝试选项 2(与英特尔一起创建新的 ddp)以实现相同的效果或按照选项 4 中的建议在 SW 中实现。

  1. 我不是求解决方案,我只是想知道如何通过'RTE_FLOW'设置循环

[ANSWER] 通常使用用于重现错误的代码片段或步骤进行更新。但目前的问题更像是澄清。请参考上文。