为什么在运行 I/O 密集型应用程序时,DPDK + mellanox connectx5 处理 128B 数据包的速度比其他大小的数据包快得多?

Why does DPDK + mellanox connectx5 process 128B packets much faster than other sizes packets, when ruuning an I/O intensive application?

为了我的测量,有两台机器,一台作为客户端节点(Haswell),另一台作为服务器节点(Skylake),并且两个节点都带有NIC,mellanox connect5。客户端以高速率(Gpps)向服务器发送数据包,以及一个简单的应用程序——L2 转发,运行 在具有 4096 个 RX 描述符的服务器节点上。我发送了很多大小的数据包(64B、128B、256B、512B、1024B、1500B),但是我得到了一个有趣的结果。 当我发送 128B 数据包时,延迟(LAT99 和 LAT-AVG)比其他大小的数据包要好得多。

下面是我的测量结果:

packet size THROUGHPUT PPS LAT99 LATAVG
64B 14772199568.1 20983238.0228 372.75 333.28
128B 22698652659.5 18666655.1476 51.25 32.92
256B 27318589720 12195798.9821 494.75 471.065822332
512B 49867099486 11629454.1712 491.5 455.98037273
1024B 52259987845.5 6233300.07701 894.75 842.567256665
1500B 51650191179.9 4236400.1952 1298.5 1231.18194373

一些设置和配置: sudo mlxconfig -d 0000:18:00.1 q

服务器节点(Skylake)开启了DDIO,所以数据包直接发送到L3缓存。 333.28 和 32.92 之间的延迟差距类似于 L1 缓存和 L3 缓存之间的差距。 所以,我想这可能是由于 L1 预取。 L1 缓存预取更好,当接收到 128B 数据包时比其他大小的数据包。

我的question:1。我的猜测是否正确? 2.Why 处理128B数据包是否更快,有没有具体的L1预取策略可以解释这个结果? 3.如果我猜错了,请问是什么原因造成的?

@xuxingchen 有多个问题需要说明才能解决。所以让我一步步澄清

  1. 当前设置列为 Mellznox Connectx 5,但 mlxconfig 声明它是 DPU。 DPU 具有内部引擎,延迟将是与 Mellanox 不同的基础 NIC,例如 MLX-4、MLX-5、ConnectX-6。
  2. 建议将 PCIe 读取大小更新为 1024
  3. 的读取大小
  4. 它被称为具有 PCIe gen 3.0 的 SKYLAKE,但 mlxconfig 将 PCIe gen4.0 报告为连接
  5. CQE 压缩是平衡的,但推荐设置(即使是矢量模式)也很激进
  6. 要使 DDIO 工作,PCIe 设备(固件)需要激活 TPH(TLP 处理提示)以允许将 Steering 标签从用户 space 填充到 NIC 固件。在 Intel NIC 中,DPDK PMD 中有实现相同功能的代码。
  7. 如果是 Mellanox,我在 PMD 中找不到 TPH 启用代码。因此我不得不推测if the DPU NIC support DDIO, it might be through driver tag steering via MSIX interupts pinned to CPU core。为此,需要禁用当前 NIC 的 irqaffinity,并允许将所有中断固定到特定内核(DPDK 除外)。

根据这些我对正确设置的建议(仅限基础 NIC CX-5、CX-6 而不是 DPU,因为我还没有测试过)是

systemctl stop irqbalance.service
systemctl disable irqbalance.service
systemctl stop wpa_supplicant
systemctl disable wpa_supplicant
./set_irq_affinity_cpulist.sh [non dpdk cores] [desired NIC]
mlxconfig -d [pcie device id] set SRIOV_EN=0
mlx_tune -r
ifconfig [NIC] txqueuelen 20000
ethtool -G [NIC] rx 8192 tx 8192
ethtool -A [NIC] rx off tx off
mlxconfig -d [pcie address] set ZERO_TOUCH_TUNING_ENABLE=1
mlxconfig -d [pcie address] set CQE_COMPRESSION=1
mlxconfig -d [pcie address] s PCI_WR_ORDERING=1

通过上述设置和 MLX-5 基础 NIC 性能报告中的设置,我能够在 AMD EPYC 上实现以下结果