ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

【网络测试】Ubuntu 22.04 下超聚变服务器 DPDK L3fwd 三层双向转发实战与避坑指南(附信而泰仪表配置)

【网络测试】Ubuntu 22.04 下超聚变服务器 DPDK L3fwd 三层双向转发实战与避坑指南(附信而泰仪表配置)

前言

在服务器网卡性能测试中,DPDK 是绕不开的“性能天花板”。最近在超聚变 V7/V8 服务器(Intel Xeon,搭载Intel E810-XXV 25G 双口网卡)上,配合信而泰(Renix)测试仪表,完成了一次基于 DPDKl3fwd的三层双端口双向转发测试。

由于网上大多是基于 CentOS/BCLinux 的教程,且针对 L3fwd 的流量走向与仪表配置讲得不够透彻,导致新手极易踩坑(比如明明打流了,DPDK 接收却一直是 0,或者疯狂丢包)。

本文基于Ubuntu 22.04 LTS系统,从底层原理、环境搭建、路由逻辑、仪表配置四个维度,带你完整跑通这套测试闭环,并附上血泪排障经验。


一、 核心原理:小白必读

1.1 DPDK 与 L3fwd 是什么?

  • DPDK (Data Plane Development Kit):简单来说,它是一个“劫持”了网卡控制权的开发套件。它绕过 Linux 内核庞大的协议栈,直接在用户态采用轮询模式(PMD)收发数据包,从而榨干网卡的极限性能。

  • L3fwd:是 DPDK 官方提供的一个三层(网络层)转发示例程序。它的工作逻辑很纯粹:收包 -> 提取目的 IP -> 查本地路由表 -> 从指定端口转发出去。

1.2 流量打不通?因为这三个条件缺一不可!

为了让 DPDK 成功转发报文,你的环境必须同时满足:

  1. 二层 MAC 匹配:仪表发出的包,目的 MAC 必须是服务器网卡的真实 MAC,否则网卡硬件层直接过滤。

  2. 三层 IP 路由命中:仪表发出的包,目的 IP 必须在l3fwd启动时加载的路由表里,否则查表失败被丢弃。

  3. 双向闭环:仪表 Port_1 发往服务器 Port 0,服务器查路由后从 Port 1 发出,最终被仪表 Port_2 接收。


二、 环境准备与编译 (Ubuntu 22.04)

2.1 安装编译依赖

Ubuntu 下的包名与 CentOS 不同,直接复制以下命令:

sudo apt update sudo apt install -y build-essential python3 python3-pip pkg-config libnuma-dev libpcap-dev libelf-dev libssl-dev meson ninja-build

2.2 下载与编译 DPDK 24.11.7

mkdir -p ~/dpdk && cd ~/dpdk wget https://fast.dpdk.org/rel/dpdk-24.11.7.tar.xz tar xf dpdk-24.11.7.tar.xz cd dpdk-stable-24.11.7 编译 DPDK 并包含 l3fwd 示例 meson setup build -Dexamples=l3fwd ninja -C build

编译完成后,生成的l3fwd可执行文件位于build/examples/dpdk-l3fwd。


三、 大页内存与网卡绑定

3.1 配置 Hugepages

Ubuntu 默认没有挂载大页内存,我们需要手动分配并挂载 2MB 的大页(E810 推荐分配 1024 个):

# 临时分配 1024 个 2MB 的大页 sudo sysctl -w vm.nr_hugepages=1024 sudo mkdir -p /mnt/huge sudo mount -t hugetlbfs nodev /mnt/huge

3.2 绑定网卡到 vfio-pci

首先查看网卡 PCI 地址(假设是0000:2a:00.0和0000:2a:00.1):

lspci | grep -i ether

然后关闭内核驱动,绑定至 DPDK:

# 加载 vfio 模块 sudo modprobe vfio-pci 关闭网卡并解绑(Ubuntu 网卡名通常是 enpXXX,请根据实际情况替换) sudo ip link set enp42s0f0 down sudo ip link set enp42s0f1 down 绑定 sudo ./usertools/dpdk-devbind.py --bind=vfio-pci 0000:2a:00.0 0000:2a:00.1 确认状态(显示 driver=vfio-pci 即成功) sudo ./usertools/dpdk-devbind.py --status

四、 L3fwd 启动与路由表解析

4.1 L3fwd 默认路由

如果不使用外部文件,l3fwd默认加载的路由表如下:

  • 去往198.18.0.0/24的包,从Port 0发出。

  • 去往198.18.1.0/24的包,从Port 1发出。

4.2 启动命令

sudo ./build/examples/dpdk-l3fwd \ -l 1,2,3,4,5,6,7,8 -n 4 -- \ -P -p 0x3 \ --config="(0,0,1),(0,1,2),(0,2,3),(0,3,4),(1,0,5),(1,1,6),(1,2,7),(1,3,8)" \ --parse-ptype
  • -P:开启混杂模式。

  • -p 0x3:掩码,表示使用第 0 和第 1 个网口。

  • --config:核心绑定,端口 0 用 1~4 核处理,端口 1 用 5~8 核处理。


五、 信而泰 (Renix) 仪表配置(保姆级解析)

假设你的连线是:仪表 Port_1 连服务器 Port 0,仪表 Port_2 连服务器 Port 1。
根据日志,服务器 Port 0 的 MAC 是6C:B3:11:00:1D:28,Port 1 是6C:B3:11:00:1D:2A。

5.1 MAC 与 IP 配置矩阵

配置项流 1 (正向流)流 2 (反向流)配置原理与作用
发送端口Port_1Port_2仪表的物理发包口。
目的 MAC6C:B3:11:00:1D:286C:B3:11:00:1D:2A【极其关键】必须填服务器对应的 MAC,否则网卡硬件直接丢弃。
源 MAC默认默认随便填,因为l3fwd转发时会自动重写源 MAC。
源 IPv41.1.1.22.2.2.2随便填,不冲突即可。
目的 IPv4198.18.1.10198.18.0.10【极其关键】必须落在l3fwd的路由表内,否则查表失败。
启用签名勾选勾选仪表统计流量的“身份证”,不勾选无法计算时延和精确丢包。

5.2信而泰 RFC 2544 完整测试流程

第一阶段:测试前准备(基准打通)

在做 2544 之前,必须先确保你手动配置的两条流(双向)能 100% 无丢包转发,否则 2544 测试一定会失败。这一步是整个测试的“地基”:RFC 2544 的吞吐量、时延、丢包率等指标,都是在这两条已经打通的流基础上做速率扫描和统计的。如果基准流本身就存在丢包,向导在探底过程中会把“环境问题”误判成“性能瓶颈”,最终得到的吞吐量曲线和时延数据都不可信,白白浪费几十分钟甚至几小时的测试时间。因此建议先把发送速率压到 10% 线速,确认收发计数完全对齐、丢包率为 0,再进入向导配置阶段。

启动 L3fwd:确保服务器端命令已运行。

手动打流:在仪表“流模板”中启动你配置好的两条流(目的 IP 在 198.18.0.x 和 198.18.1.x)。

核对基准:仪表上的发送速率设为 10% 线速,观察接收端。必须做到发多少、收多少、零丢包。如果此时就丢包,先去排查 L3fwd(核隔离、NUMA等),不要往下走。

第二阶段:Renix 向导配置(核心避坑)

启动向导:菜单栏 -> 配置向导 -> 测试套件 -> RFC 2544 向导。

选择测试项:勾选 吞吐量 (Throughput)、时延 (Latency)、丢包率 (Packet Loss)。

选择端口:选择仪表连接服务器的 Port_1 和 Port_2。

配置流(防止多出流的关键):

模式选择:必须选择“手动 (Manual)”模式。

流选择:在下方列表中,勾选你之前调通的那两条原始流,取消勾选其他任何流。

配置测试参数:

帧长:勾选用例要求的 64, 128, 256, 512, 1024, 1280, 1518。

测试时长:设为 60 秒/轮。

精度:设为 10%(最高效)或 1%(更精确但耗时极长)。

可接受丢包率:设为 0.001%(对应测试用例要求)。

保存并运行:点击“完成”,向导会自动开始执行。

第三阶段:DPDK 侧性能保障(解决丢包)

RFC 2544 的吞吐量测试会从 100% 线速疯狂往下探底,如果 DPDK 侧有性能瓶颈,就会出现疯狂丢包。

隔离 CPU 核心:在 Ubuntu 的 /etc/default/grub 中找到 GRUB_CMDLINE_LINUX,加入 isolcpus=1-8 rcu_nocbs=1-8,然后 sudo update-grub 并重启。这能防止操作系统抢占 DPDK 的轮询核。

关闭校验和:在仪表的流编辑中,尝试把 IP/UDP 的 Checksum 字段设为 0(或者确保仪表开启了硬件 Offload)。

确认 NUMA 同侧:用 lscpu 和 lspci -vv 确认你的 E810 网卡插在哪个 CPU 上,L3fwd 的 -l 参数就只绑那个 CPU 的核心。

第四阶段:结果查看与保存

测试结束后,弹出 Result Analyzer 窗口。

看吞吐量:看 Throughput (fps/bps) 的数值。

看时延:看平均时延和最大时延。

导出报告:点击左上角 文件 -> 导出,保存为 PDF 或 HTML 格式。

5.3逐包变化 IP (Modifier 递增配置)

测试方案要求“逐包变化目的 IP”以测试查表性能。
在报文编辑界面,右键Destination IP-> 选择Modifier:

  • 流 1:起始198.18.1.1,步长1,Count 设为 254。

  • 流 2:起始198.18.0.1,步长1,Count 设为 254。

💡 避坑指南:为什么 Count 是 254?
因为l3fwd默认路由是/24掩码,只认识1~254。如果你设成了 1000,超过 254 后的 IP (如198.18.1.255) 在路由表里找不到,就会被 DPDK 丢弃,导致仪表上显示凭空丢包!


六、 常见排障与丢包分析

6.1 为什么仪表显示接收报文为 0?

  1. MAC 填错了:核对仪表的目的 MAC 是否和 DPDK 终端打印的网卡 MAC 完全一致。

  2. 没开混杂模式:启动命令里是不是漏了-P参数。

  3. IP 不在路由表:检查仪表的目的 IP 是否落在198.18.0.x或198.18.1.x。

  4. 发送端口地址没配对:信而泰界面里的“发送端口地址”是指测试仪机箱的管理地址,不要把它当成目的 MAC 填进去。

6.2 为什么刚打流就疯狂丢包(丢包率 20%+)?

  1. Modifier 越界:正如前文所述,递增数量超过了 254,后面的 IP 匹配不到路由。

  2. 线速过高导致 CPU 瓶颈:25G 跑 64 字节小包,线速可达 37 Mpps。检查服务器 CPU 是否被打满(top命令),如果是性能瓶颈,适当降低仪表的发送百分比(如调到 10%)。

  3. NUMA 跨节点:网卡插在 CPU 0 的 PCIe 槽,但--config绑定的核在 CPU 1(跨 NUMA 访存),性能会大打折扣。用lscpu确认绑核与网卡在同一 NUMA 节点。

  4. 没有使能签名:如果仪表没有勾选启用签名,DPDK 转发回来的包,仪表无法匹配到具体的某一条流,会全部当作无效包处理。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进