DPDK 介绍
DPDK 是由 6WIND,Intel 等多家公司开发,主要基于 Linux 系统运行,用于快速数据包处理的函数库与驱动集合,可以极大提高数据处理性能和吞吐量,提高数据平面应用程序的工作效率。
DPDK 使用了轮询(polling)而不是中断来处理数据包。在收到数据包时,经 DPDK 重载的网卡驱动不会通过中断通知 CPU,而是直接将数据包存入内存,交付应用层软件通过 DPDK 提供的接口来直接处理,这样节省了大量的 CPU 中断时间和内存拷贝时间。
关于更多 DPDK 介绍,请登录官网 https://www.dpdk.org/
- DPDK 官方在 20.11 版本及以后将不再支持 make 编译, 官方提供 meson 和 ninja工具替换 make 工具。 详情请参考官方文档。
- DPDK20.02 版本官方源码包, 关闭了 IGB_UIO 模块。 在编译前需要将根路径的./config/common_base 文件里的 CONFIG_RTE_EAL_IGB_UIO 参数修改成 y,保存后再编译。vim ./config/common_base
1.环境配置及依赖工具
1.1 BIOS 配置
大多数平台,部署 DPDK 不需要更改 BIOS 配置。但是,如果使能 UEFI 安全启动方式,则 Linux 内核会禁止 uio 模块加载,进而无法挂载 igb_uio.ko 模块。在这种情况下可以使用 vfio 模块代替 igb_uio/uio_pci_generic 模块。
1.2 DPDK 源码编译
必要的软件工具:
yum groupinstall "Development Tools" -y //For RHEL/Fedora
apt install -y build-essential //For Ubuntu/Debian
Python 3.5+ //用来安装 meson and ninja (20.11 及以后版本需要使用)
Python 2.7+/3.2+ //用来执行 DPDK 源码中包含脚本
Meson (version 0.47.1+) and ninja //大部分 Linux 系统中自带安装,python 安装命令:pip3 install meson ninja
yum install kernel-devel-$(uname -r) //安装内核开发包For RHEL/Fedora
apt install linux-headers-$(uname -r) //安装内核开发包 For Ubuntu/Debian
管理 NUMA 的库:
yum install -y numactl-devel //For RHEL/Fedora
apt install -y libnuma-dev //For Ubuntu/Debian
解压DPDK
tar -xJf dpdk-18.11.tar.xz //将dpdk-18.11.tar.xz copy至系统文件夹 赋予权限 需使用root用户登录
设置 RTE_SDK 参数
root@nic-MS-7917:/dpdk-18.11/# export RTE_SDK=`pwd` //或者设置DPDK绝对路径
设置 RTE_TARGET 参数
root@nic-MS-7917:/dpdk-18.11/# export RTE_TARGET=x86_64-native-linuxapp-gcc //x86 架构选择 x86_64-native-linuxapp-gcc;ARM 平台选择arm64-armv8a-linuxapp-gcc;龙芯平台需要交叉编译。
打patch(沐创和网迅等国产网卡
网迅芯片:
复制网迅patch文件到dpdk-18.11/drivers/net/netswift
cd dpdk-18.11/drivers/net/netswift
patch -p1 < 20220809.patch
沐创芯片:
git apply ../tsrn10-pmd/19.11/0001-net-tsrn10-add-PMD-skeleton.patch
编译 DPDK 目标环境
make -j 4 install T=$RTE_TARGET
cd examples/l2fwd //编译l2fwd、l3fwd
make
CC main.o
LD l2fwd
INSTALL-APP l2fwd
INSTALL-MAP l2fwd.map
挂载 IGB_UIO 模块
[root@localhost dpdk-18.11]# modprobe uio
[root@localhost dpdk-18.11]# insmod x86_64-native-linuxapp-gcc/kmod/igb_uio.ko //insmod
1.3 绑定网卡设备到 IGB_UIO
注意:待绑定设备必须卸载物理驱动或者网络连接保持 down 的状态
[root@localhost dpdk-18.11]#./usertools/dpdk-devbind.py -b igb_uio 01:00.0 01:00.1 //pcie设备编号
[root@localhost dpdk-18.11]#./usertools/dpdk-devbind.py -s //查看绑定状态
1.4 配置大页内存(也可写入grub)
echo 1024 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages //X86
echo 4096 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages //飞腾
echo 4096 > /sys/kernel/mm/hugepages/hugepages-524288kB/nr_hugepages(大页划分)
[root@localhost /]# mkdir -p /mnt/huge
[root@localhost /]# mount -t hugetlbfs nodev /mnt/huge
[root@localhost /]# grep HugePages_ /proc/meminfo
HugePages_Total: 1024
HugePages_Free: 1024
HugePages_Rsvd: 0
HugePages_Surp: 0
2. DPDK测试脚本
4核4口
./l2fwd -l 2,3,4,5 -n 2 --socket-mem 1024 --file-prefix pg0 -- -q 1 -p 0xf -T 5 --no-mac-updating
4核8口
./l2fwd -l 2,3,4,5 -n 2 --socket-mem 1024 --file-prefix pg0 -- -q 2 -p 0xff -T 5 --no-mac-updating
2核2口
./l2fwd -l 2,3 -n 2 --socket-mem 1024 --file-prefix pg0 -- -q 1 -p 0x3 -T 5 --no-mac-updating
5核10口
./l2fwd -l 1,2,3,4,5,6 -n 2 --socket-mem 1024 --file-prefix pg0 -- -q 2 -p 0x3ff -T 5 --no-mac-updating
2核4口
./l2fwd -l 2,3 -n 1 --socket-mem 1024 --file-prefix pg0 -- -q 2 -p 0xf -T 5 --no-mac-updating
3. testpmd下portlist参数调整网口转发顺序
参考官网说明4. Testpmd Runtime Functions — Data Plane Development Kit 19.11.13 documentation
4.5.12. set portlist
Set the list of forwarding ports:
testpmd> set portlist (x[,y]*)
For example, to change the port forwarding:
testpmd> set portlist 0,2,1,3
testpmd> show config fwd
io packet forwarding - ports=4 - cores=1 - streams=4
Logical Core 3 (socket 0) forwards packets on 4 streams:
RX P=0/Q=0 (socket 0) -> TX P=2/Q=0 (socket 0) peer=02:00:00:00:00:01
RX P=2/Q=0 (socket 0) -> TX P=0/Q=0 (socket 0) peer=02:00:00:00:00:00
RX P=1/Q=0 (socket 0) -> TX P=3/Q=0 (socket 0) peer=02:00:00:00:00:03
RX P=3/Q=0 (socket 0) -> TX P=1/Q=0 (socket 0) peer=02:00:00:00:00:02
testpmd启动
./testpmd -l 1-5 -- -i
4. 海光平台特殊设置
需要关闭IOMMU
修改/etc/default/grub, 编辑GRUB_CMDLINE_LINUX选项:
GRUB_CMDLINE_LINUX=“amd_iommu=off”
更新grub
grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg //UEFI启动
grub2-mkconfig -o /boot/grub2/grub.cfg //legacy模式启动
5. 为了防止性能波动可做CPU隔离设置
修改/etc/default/grub, 编辑GRUB_CMDLINE_LINUX选项:添加如下内容:
default_hugepagesz=2M hugepagesz=2M hugepages=1024 isolcpus=1-5 nohz_full=1-5 rcu_nocbs=1-5
更新grub
grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg //UEFI启动
grub2-mkconfig -o /boot/grub2/grub.cfg //legacy模式启动
6. vfio-pci使用方法
加载用户态驱动并将我们的卡绑到dpdk 用户态,vfio-pci 或者使用igb_uio ,一般vfio-pci需要开启VT,并设置iommu,建议直接使用默认的igb_uio用户态驱动,igb_uio基本所有平台都支持。
vfio-pci使用如下:
modprobe vfio
modprobe vfio-pci
usertools/dpdk-devbind.py --force --bind=vfio-pci 0000:07:00.0 0000:07:00.1
7. 21.11之后版本l2fwd需要加参数-P,否则不转发