dpdk主机与容器部署测试操作指导
发表于 2025/08/06
0
作者|丁浩源
环境信息
配置名称 |
版本 |
CPU |
鲲鹏920系列 |
网卡 | Mellanox CX6, MCX623106AN-CDA |
dpdk |
22.07 |
docker |
18.09 |
操作系统 | 2203sp4 |
测试组网
机器A为打流机器(若有发包仪则用发包仪),测试都在单网口,即单网口进,单网口出
驱动安装
根据OS下载对应的OFED驱动,以OPENEULER-OPENEULER 22.03-aarch64为例
tar -xf MLNX_OFED_LINUX-5.8-1.0.1.1-openeuler22.03-aarch64.tgz
cd MLNX_OFED_LINUX-5.8-1.0.1.1-openeuler22.03-aarch64/
yum install kernel-devel-$(uname -r) kernel-headers-$(uname -r)
yum install gcc make rpm-build elfutils-libelf-devel pciutils rpm-build
yum install kernel-devel-5.10.0-216.0.0.115.oe2203sp4.aarch64
yum install kernel-rpm-macros
yum install python3-unversioned-command lsof python3-devel ethtool
./mlnxofedinstall --dpdk --without-dkms --add-kernel-support --kernel `uname -r` --without-fw-update
主机安装DPDK
安装dpdk22.07
安装依赖
dnf install kernel-devel numactl-devel meson ninja-build python3-pyelftools python3-devel fuse-devel pciutils-devel tcsh libpcap-devel createrepo make gcc rpm-build lsof python3-unversioned-command patch gdb-headless -y
编译
cd dpdk-22.07
meson setup build
ninja -C build
ninja -C build install
ldconfig
编译l3fwd
cd dpdk-22.07/examples/l3fwd
修改一下l3fwd.h,使其性能更佳:
改成2048 2048 64
export PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig
执行编译: make
机器A和B运行dpdk需要操作系统配置好内存大页,以1G的大页为例:
在/etc/default/grub中添加
重新生成gurb文件并重启生效:grub2-mkconfig -o /boot/efi/EFI/openEuler/grub.cfg
容器安装DPDK
创建docker容器:
docker run -d --privileged \
--cpuset-cpus="64-85" \
-v /sys/bus/pci/devices:/sys/bus/pci/devices \
-v /sys/devices/system/node:/sys/devices/system/node \
-v /sys/kernel/mm/hugepages:/sys/kernel/mm/hugepages \
-v /sys/class/net:/sys/class/net \
-v /lib/modules:/lib/modules \
-v /dev:/dev \
-v /var/run:/var/run \
--name openeuler_dpdk_1 \
openeuler-dpdk-working:latest \
tail -f /dev/null
--cpuset-cpus设置的范围请按照网卡所在的numa来设置。
lspci -vvvs <pci-businfo> 查看NUMA node.
将网卡驱动的RPMS目录和dpdk22.07复制进容器
进入容器:
docker容器安装网卡相关依赖,否则dpdk无法识别到cx6网卡
安装MLX依赖
cd /opt/RPMS
yum install libibumad-58mlnx43-1.58101.aarch64.rpm
yum install libibverbs-58mlnx43-1.58101.aarch64.rpm libibverbs-utils-58mlnx43-1.58101.aarch64.rpm librdmacm-58mlnx43-1.58101.aarch64.rpm librdmacm-utils-58mlnx43-1.58101.aarch64.rpm
yum install infiniband-diags-58mlnx43-1.58101.aarch64.rpm infiniband-diags-compat-58mlnx43-1.58101.aarch64.rpm
yum install rdma-core-58mlnx43-1.58101.aarch64.rpm rdma-core-devel-58mlnx43-1.58101.aarch64.rpm
上面的以此完成后开始编译dpdk
步骤与主机编译一样, 构建的时候要看
meson构建完成后
没有出现mlx5缺失则表示识别到了网卡依赖。
编译完成后:
这是正常的,链接了网卡依赖库
这是不正常的,没有链接网卡依赖库
同样在容器里面编译l3fwd.
编译好之后,将该容器制作成镜像:
docker commit d358307bc897 openeuler-dpdk-test:latest
删除之前容器,重新创建容器,使用host网络:
注意网卡所在的numa, --cpuset-cpus要在网卡的numa的范围里面
docker run -d --privileged --net=host \
--cpuset-cpus="64-85" \
-v /sys/bus/pci/devices:/sys/bus/pci/devices \
-v /sys/devices/system/node:/sys/devices/system/node \
-v /sys/kernel/mm/hugepages:/sys/kernel/mm/hugepages \
-v /sys/class/net:/sys/class/net \
-v /lib/modules:/lib/modules \
-v /dev:/dev \
-v /var/run:/var/run \
--name openeuler_dpdk_test1 \
openeuler-dpdk-test:latest \
tail -f /dev/null
注意如上使用的是host网络,相当于容器能看到宿主机的全部网卡设备。
介绍另外两种方式:
方式一:
将创建网络命名空间,将单网口传入
CONTAINER_PID=$(docker inspect --format '{{.State.Pid}}' container_id)
ip link set enp129s0f0np0 netns $CONTAINER_PID
方式二:创建VF,将VF传入
设置vf数量
echo 1 > /sys/class/net/enp129s0f0np0/device/mlx5_num_vfs
设置VF信任模式
echo 0000:81:00.2 >> /sys/bus/pci/drivers/mlx5_core/unbind
echo ON | tee /sys/class/net/enp129s0f0np0/device/sriov/0/trust
echo "0000:81:00.2" >> /sys/bus/pci/drivers/mlx5_core/bind
ip link set enp129s0f0np0 vf 0 trust on
mlxreg -d /dev/mst/mt4125_pciconf0 --reg_name VHCA_TRUST_LEVEL --yes --indexes 'all_vhca=0x1,vhca_id=0x0' --set 'trust_level=0x1'
将VF传入
CONTAINER_PID=$(docker inspect --format '{{.State.Pid}}' container_id)
ip link set enp129s0f0v0 netns $CONTAINER_PID
以上网卡信息和pci号信息换成自己的。
测试
./pktgen -l 4-23 -a 01:00.0 -n 8 --main-lcore=4 --socket-mem=8192,0,0,0 -- --txd=4096 --rxd=4096 -N -T -P -m "[5-15:16-23].0"
因为我的网卡在numa0,所以分配numa0的cpu和内存。
配置pktgen生成128B随机流量包:
enable 0 range
range 0 dst ip 192.168.101.3 192.168.101.3 192.168.101.3 0.0.0.0
range 0 src ip 192.168.0.1 192.168.0.1 192.168.0.100 0.0.0.1
range 0 dst mac 00:00:00:00:00:01 00:00:00:00:00:01 ff:ff:ff:ff:ff:ff 00:00:00:00:00:01
range 0 size 128 128 128 0
set 0 size 128
start 0
如上源和目的ip可以自行配置。 简单的方法为 ip addr add 192.168.101.3/24 dev <网卡名>
测试机在主机或者容器执行testpmd:
dpdk-testpmd --iova-mode=pa -l 64-80 -n 4 -a 0000:81:00.0 --main-lcore=64 --socket-mem=0,0,8192,0 -- -i --txd=2048 --rxd=2048 --burst=64 --forward-mode=macswap --nb-cores=16 --rxq=16 --txq=16
或者l3fwd
./l3fwd -l 64-80 -n 4 -a 0000:81:00.0,mprq_en=1,rxqs_min_mprq=16 --main-lcore=64 --socket-mem=0,0,8192,0 -- -p 0x1 -P --config='(0,0,80),(0,1,65),(0,2,66),(0,3,67),(0,4,68),(0,5,69),(0,6,70),(0,7,71),(0,8,72),(0,9,73),(0,10,74),(0,11,75),(0,12,76),(0,13,77),(0,14,78),(0,15,79)' --rx-queue-size=2048 --tx-queue-size=2048
观察pktgen的数据:
打满100G网卡