鲲鹏社区首页
中文
注册
dpdk主机与容器部署测试操作指导

dpdk主机与容器部署测试操作指导

DPDK容器

发表于 2025/08/06

0

作者|丁浩源


环境信息

配置名称

版本

CPU

鲲鹏920系列

网卡Mellanox CX6,  MCX623106AN-CDA

dpdk

22.07

docker

18.09

操作系统2203sp4

测试组网


机器A为打流机器(若有发包仪则用发包仪),测试都在单网口,即单网口进,单网口出

驱动安装

下载地址:https://network.nvidia.com/products/infiniband-drivers/linux/mlnx_ofed/
根据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基础镜像可以从社区下载:https://gitee.com/openeuler/openeuler-docker-images

创建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号信息换成自己的。

测试

到用作打流的机器编译安装好dpdk和dpdk-pktgen,  到pktgen对应版本的目录,
 cd pktgen-dpdk-pktgen-22.07.0
 export PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig
 meson setup build
 ninja -C build
启动pktgen:

./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网卡




本页内容