【系统搭建】DPDK实现两虚拟机基于testpmd和l2fwd的收发包
testpmd
与l2fwd
的配合构建一个高性能的虚拟网络测试环境。l2fwd
服务工作在数据链路层,使用MAC地址寻址,很多基于DPDK的策略实现可以基于l2fwd
进行开发。
一、拓扑结构示意
+-------------------+ 虚拟化层网络 +-------------------+
| 虚拟机1 |<------------------>| 虚拟机2 |
| (运行testpmd) | TAP/virtio-net | (运行l2fwd) |
+-------------------+ +-------------------+
二、虚拟机设置
1. 设置子网:
- 新建一个虚拟机子网,并且取消勾选连接网络和IP地址分配选项,因为二层协议服务仅需要MAC地址寻址即可。
2. 网卡设置:
- 新建多张网卡(推荐三张,第三张用于联网)
- 选择自定义模式连接到虚拟网络,使两台虚拟机处于同一子网下
三、l2fwd服务启动
1. DPDK接管网卡
按照【系统搭建】DPDK安装配置与helloworld运行中的步骤配置DPDK,并且建议DPDK仅绑定一张网卡,否则会出现数据环流的情况,即l2fwd
发送数据流从一个端口到另一个端口。
2. 启动l2fwd
sudo ./dpdk-l2fwd -l 0-1 -n 4 --iova-mode=pa -- -p 0x1
关键参数解释:
-l 0-1
:指定DPDK使用的CPU逻辑核心(核绑定)-n 4
:设置内存通道(memory channel)数量,需与物理内存通道数一致(通过dmidecode -t memory查看)--iova-mode=pa
:强制使用物理地址模式(否则会VA报错)-p 0x1
:启用端口 0
启动成功后出现收发包的统计,并且10s更新一次。
四、testpmd发流
testpmd的可执行文件编译在了./build/app/目录下
发送端执行指令:
sudo ./dpdk-testpmd -l 0-3 -n 4 --vdev=net_tap0 -- \--txd=2048 --rxd=2048 --txq=1 --rxq=1 \--forward-mode=txonly --eth-peer=0,00:0C:29:12:9B:99
1. EAL参数
-l 0-3
- 作用:指定DPDK使用的CPU逻辑核心(核绑定)。
- 详细说明:
0-3
表示使用逻辑核心0、1、2、3。- 核心分工:
- 核心0:主线程(管理/统计)。
- 核心1-3:数据面线程(发包/收包)。
-n 4
- 作用:设置内存通道数量(需与主板实际物理内存通道数一致)。
- 验证方法:
dmidecode -t memory | grep "Channel" # 查看物理内存通道数
--vdev=net_tap0
- 作用:创建虚拟TAP设备。
- 使用场景:
- 用于连接虚拟机/容器网络。
- 在宿主机上生成
tap0
设备(需通过ip link
验证)。
2. testpmd 参数(--
后部分):
在l2fwd启动时可以看到网卡的MAC地址,注意在testpmd进行匹配
00:0C:29:12:9B:99
即在接收端查看的MAC地址
--txd=2048
/ --rxd=2048
- 作用:设置每个队列的发送/接收描述符数量。
- 推荐值:
- 10G网卡:1024-4096。
- 25G+网卡:4096-8192。
- 查看硬件支持最大值:
ethtool -g eth0 | grep "TX:" # 实际值必须 ≤ 硬件支持值
--txq=1
/ --rxq=1
- 作用:每个端口的发送/接收队列数。
- 多队列场景:
# 启用RSS(多队列) --rxq=4 --txq=4 --rss-ip --rss-udp
--forward-mode=txonly
- 作用:设置转发模式为仅发送。
- 其他模式:
rxonly
:仅接收。io
:收发双向。mac
:MAC地址重写转发。
--eth-peer=0,00:0C:29:12:9B:99
- 作用:指定端口0的对端MAC地址。
- 关键验证点:
- 必须与接收端(如l2fwd虚拟机)的实际MAC一致。
- 接收端启动l2fwd时会输出MAC地址
- 或在接收端查看MAC:
ip link show dev eth0 | grep link/ether