有没有办法让 RSS 对 SRv6 数据包起作用?

问题描述

我正在使用 github my project,它使用 eBPF 基于 SRv6 路由过滤/查找/重定向/丢弃数据包。 eBPF 代码在 mellanox Connect5X 上运行以实现 SRv6 功能

我的期望是 mellanox Connect5X 将查看 SRv6 目标外部 IPv6 地址标头并在 RX 队列上进行 RSS 数据包传播。这将允许我在多个内核上运行 XDP 进行处理。

我目前的结果是当 SRv6 数据包是多流数据包时,只使用一个 cpu 核心(与单流数据包的负载效率相同)。

问题是即使对于 SRv6 数据包,我如何才能对 cpu 进行负载平衡?

我期待的答案的一个例子是 了解如何为 IPv6 src、dst addr 等启用 RSS

谢谢。

解决方法

Mellanox NIC 支持基本 RSS 没有问题,即:outer SRC-IP + Dst-IP + protocol,但期望 Mellanox NIC 为 SRV6 标头内容做 RSS 是不正确的.对于截至今天的当前库(动词)和固件,RSS 和 RPS 可以通过

验证
  1. ethtool -S [interface-name] | grep packets | grep rx - 用于在多个 RX 队列上传播的 HW RSS
  2. grep mxl5 /proc/interupts - 用于队列到 CPU 的映射。
  3. ethtool --show-rxfh-indir [interface-name] - 用于识别流哈希设置

根据评论,对 SRv6 的数据包格式的理解也存在差距。数据包格式为 ETh + IPv6 + next-header is 43 + srv6 header (next header can be ip/tcp/udp)

因此RSS是在outer src-IP + dst-ip + protocol (43)上完成的,具有不同hash的数据包被传播到不同的队列

enter image description here

现在使用加载到接口的 XDP,可以filter for SRv6 headers 并应用简单的 xor 哈希或 murmur 哈希,然后重定向 AF_XDP 套接字或接口。

因此整个预期和假设是不正确的

[EDIT-1] 基于实时调试,我们花了 1.5 小时解释和教育相同的内容。

[EDIT-2] 解决提出的意见 1.指的是rx-flow-counter已经积累的,不是SRv6数据包的增加 在实时调试中,@takeru 使用 TREX packet generator 向 NIC 发送数据包,数据包格式为 ETH + SRC-IP-1 ... SRC-IP-n + DST-IP + Srv6。使用直接接口到接口连接,不会收到除 SRv6 数据包之外的其他数据包

2.事实上,如果你在 SRv6 数据包的情况下检查 CPU 上的负载,你会看到只有一个 CPU 核被加载 在实时调试中,@takeru 没有运行 top/htop,这是新信息。 @takeru 试图了解外部 IP 上的 RSS 是否正在发生。我已要求提供 CPU 使用率和 tcpdump 的屏幕截图。

3.如果只是 IPv6,CPU 负载会加到其他核上 该请求已被放置以运行简单的 XDP-eBPF 程序,该程序重定向/丢弃 ipv6-Srv6 数据包。 @takeru 还没有运行相同的

4.只有 IPv6 和 ip / udp 情况通过您提到的调试方法增加了值计数 Linux 内核中的 SRv6 也发生了同样的事情 我已经向@takeru 指出,他正在生成格式为 ETH + Ipv6 + next-hdr routing + Srv6 header + next-header UDP 的 TREX 数据包。因此,内核静态将更新为 ipv6/UDP,因为它不是 TCP 或 SCTP 或未知协议。

注意:takeru's reference github project