如何使用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
有几项需要澄清。所以让我解释一下
- 某些物理和虚拟 NIC 通过 DPDK RX 卸载公开 RSS 固定元组,如 IP、协议、TCP|UDP|SCTP 端口号。
- 某些 NIC 允许配置 hash reta 算法以更好地满足需要(例如,当源目标 IP 地址固定时我们可以跳过并使用其他算法)。
- 正如我从 DPDK 18.11 中回忆的那样,引入了 RTE_FLOW 以在选定的 RX queue 上支持 RSS(例如 Q1、Q2、Q3 可以是 TCP 数据包的 RSS,而 Q4、Q5 可以用于 UDP)。但这同样是基于内部或外部 IP+端口号
- 对于 DPDK 版本 19.11 及更高版本 RTE_FLOW 已得到增强以支持
RAW Pattern
。此功能的目的是支持默认情况下 NIC 不理解的特殊协议,如(VXLAN、GENEVE、RTP 和其他协议)。
- 对于像 Fortville 和 Columbiaville(来自英特尔)这样的 NIC,允许通过 DDP(动态设备角色)加载特殊固件以配置特殊结构 headers 或 MPLS,如 headers(在以太网和ip) 被解析、查找并用作 RSS 的种子(允许更好的分发)。
- 有支持 L2 层的网卡,但仅限于 SMAC、DMAC、VLAN1、VLAN2、MPLS 而不是自定义 header。
因此,根据 NIC、供应商、对 L2 的 RSS 支持和固件,在端口初始化或 RTE_FLOW 特定配置中计算字段之间的 RSS 的能力会有所不同。例如 RSS ETH
支持
- I40E 是
I40E_INSET_DMAC | I40E_INSET_SMAC
- DPAA2 是
NH_FLD_ETH_TYPE and NET_PROT_ETH
- CNXK 是
RSS_DMAC_INDEX
- OCTEONX2 是
FLOW_KEY_TYPE_VLAN and FLOW_KEY_TYPE_CH_LEN_90B
因此对于 NIC ixgbe and XXV710
,以太网和 IP 之间 custom header
没有现成的支持。
备选方案:
- 使用智能 NIC 或 FPGA:被编程为在您的特定 header 上解析和 RSS 到多个 RX queue
上的 RSS
- 使用 XXV710 (Fortville) 与英特尔合作:创建 DDP,它可以在多个 RX queue.
上将您的特定 header 解析为 RSS
- 识别DPDK NIC:可以解析
RAW
header定义的12.2.6.2。一旦供应商添加了支持,您就可以创建一个简单的 traffic spread tool
,这将确保以循环方式在所需的 RX queue 之间分配流量。
- 使用软件支持缺少的硬件。
注意:我不推荐使用基于 HW 的静态 Round Robin,因为它会产生 2 倍问题
- 如果它是纯的DPDK BOND Round ROBIN你不会有任何流固定
- 如果您使用基于哈希的固定,大象流有可能推送 1 个或几个 queues,导致 cpu 处理性能下降。
- 我的建议是使用具有原子模式的 EVENTDEV 模型,这可确保更好的缓存局部性(在给定实例中,相同的流将落入工作线程)和几乎线性的性能表现。 sample app
对于选项 4(软件模型):
- 在 port_init 函数中禁用 RSS
- 使用单个 RX queue 通过自定义 rx 线程接收所有数据包。
- 根据需要计算哈希header并更新mbuf哈希字段。
- 使用
rte_distributor
库根据自定义分配流量。
- 或将
rte_eventdev
与原子模型一起使用,以将工作负载分摊到多个工作人员身上。
[来自评论的澄清]:
- 问过相关同修,他们说修改pmd driver可以解决我的问题,只有这样吗?
[ANSWER] 由于您使用的是自定义 header 而不是通用 VLAN|IP|Port 此建议不正确。正如您在问题和评论中所澄清的那样,您希望像 RSS 一样分发自定义 header.
- 我还没有写任何关于 rte_flow 分发的代码,我阅读了 rte_flow 示例,没有看到配置 round-robin
的代码
[ANSWER] 如上所述,并不是所有的网卡都支持 RSS 和 RAW。由于您当前的网卡是ixgbe and i40e
,因此不太可能为自定义header解析和执行RSS的功能。您可以为 i40e 尝试选项 2(与英特尔一起创建新的 ddp)以实现相同的效果或按照选项 4 中的建议在 SW 中实现。
- 我不是求解决方案,我只是想知道如何通过'RTE_FLOW'设置循环
[ANSWER] 通常使用用于重现错误的代码片段或步骤进行更新。但目前的问题更像是澄清。请参考上文。
在我的问题中,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
有几项需要澄清。所以让我解释一下
- 某些物理和虚拟 NIC 通过 DPDK RX 卸载公开 RSS 固定元组,如 IP、协议、TCP|UDP|SCTP 端口号。
- 某些 NIC 允许配置 hash reta 算法以更好地满足需要(例如,当源目标 IP 地址固定时我们可以跳过并使用其他算法)。
- 正如我从 DPDK 18.11 中回忆的那样,引入了 RTE_FLOW 以在选定的 RX queue 上支持 RSS(例如 Q1、Q2、Q3 可以是 TCP 数据包的 RSS,而 Q4、Q5 可以用于 UDP)。但这同样是基于内部或外部 IP+端口号
- 对于 DPDK 版本 19.11 及更高版本 RTE_FLOW 已得到增强以支持
RAW Pattern
。此功能的目的是支持默认情况下 NIC 不理解的特殊协议,如(VXLAN、GENEVE、RTP 和其他协议)。 - 对于像 Fortville 和 Columbiaville(来自英特尔)这样的 NIC,允许通过 DDP(动态设备角色)加载特殊固件以配置特殊结构 headers 或 MPLS,如 headers(在以太网和ip) 被解析、查找并用作 RSS 的种子(允许更好的分发)。
- 有支持 L2 层的网卡,但仅限于 SMAC、DMAC、VLAN1、VLAN2、MPLS 而不是自定义 header。
因此,根据 NIC、供应商、对 L2 的 RSS 支持和固件,在端口初始化或 RTE_FLOW 特定配置中计算字段之间的 RSS 的能力会有所不同。例如 RSS ETH
支持- I40E 是
I40E_INSET_DMAC | I40E_INSET_SMAC
- DPAA2 是
NH_FLD_ETH_TYPE and NET_PROT_ETH
- CNXK 是
RSS_DMAC_INDEX
- OCTEONX2 是
FLOW_KEY_TYPE_VLAN and FLOW_KEY_TYPE_CH_LEN_90B
因此对于 NIC ixgbe and XXV710
,以太网和 IP 之间 custom header
没有现成的支持。
备选方案:
- 使用智能 NIC 或 FPGA:被编程为在您的特定 header 上解析和 RSS 到多个 RX queue 上的 RSS
- 使用 XXV710 (Fortville) 与英特尔合作:创建 DDP,它可以在多个 RX queue. 上将您的特定 header 解析为 RSS
- 识别DPDK NIC:可以解析
RAW
header定义的12.2.6.2。一旦供应商添加了支持,您就可以创建一个简单的traffic spread tool
,这将确保以循环方式在所需的 RX queue 之间分配流量。 - 使用软件支持缺少的硬件。
注意:我不推荐使用基于 HW 的静态 Round Robin,因为它会产生 2 倍问题
- 如果它是纯的DPDK BOND Round ROBIN你不会有任何流固定
- 如果您使用基于哈希的固定,大象流有可能推送 1 个或几个 queues,导致 cpu 处理性能下降。
- 我的建议是使用具有原子模式的 EVENTDEV 模型,这可确保更好的缓存局部性(在给定实例中,相同的流将落入工作线程)和几乎线性的性能表现。 sample app
对于选项 4(软件模型):
- 在 port_init 函数中禁用 RSS
- 使用单个 RX queue 通过自定义 rx 线程接收所有数据包。
- 根据需要计算哈希header并更新mbuf哈希字段。
- 使用
rte_distributor
库根据自定义分配流量。 - 或将
rte_eventdev
与原子模型一起使用,以将工作负载分摊到多个工作人员身上。
[来自评论的澄清]:
- 问过相关同修,他们说修改pmd driver可以解决我的问题,只有这样吗?
[ANSWER] 由于您使用的是自定义 header 而不是通用 VLAN|IP|Port 此建议不正确。正如您在问题和评论中所澄清的那样,您希望像 RSS 一样分发自定义 header.
- 我还没有写任何关于 rte_flow 分发的代码,我阅读了 rte_flow 示例,没有看到配置 round-robin 的代码
[ANSWER] 如上所述,并不是所有的网卡都支持 RSS 和 RAW。由于您当前的网卡是ixgbe and i40e
,因此不太可能为自定义header解析和执行RSS的功能。您可以为 i40e 尝试选项 2(与英特尔一起创建新的 ddp)以实现相同的效果或按照选项 4 中的建议在 SW 中实现。
- 我不是求解决方案,我只是想知道如何通过'RTE_FLOW'设置循环
[ANSWER] 通常使用用于重现错误的代码片段或步骤进行更新。但目前的问题更像是澄清。请参考上文。