DPDK — 安装部署

Trina ·
更新时间:2024-11-14
· 914 次阅读

目录 文章目录目录官方手册环境参数环境准备RT Kernel基础软件依赖设置大页内存安装 DPDK获取 DPDK 代码设置环境变量编译安装目标环境目录加载内核模块绑定网卡到新的内核驱动模块适配 Mellanox ConnectX-5 网卡(可选)hellowrold 官方手册

https://doc.dpdk.org/guides/linux_gsg/index.html
中文版:https://dpdk-docs.readthedocs.io/en/latest/linux_gsg/index.html

环境参数 Intel x86 CentOS7 NUMA node = 2 Memory = 16GB NICs == 3 + 1 Kernel >= 2.6.33(支持 UIO、HUGETLBFS、PROC_PAGE_MONITOR)

NOTE:对大多数平台,使用基本的 DPDK 功能无需对 BIOS 进行特殊设置。然而,对于 HPET(High Precision Event Timer,高精度定时器,到时了会产生中断)定时器和电源管理功能,以及为了获得 40G 网卡上小包处理的高性能,则可能需要更改 BIOS 设置。查看是否开启了 HPET:

grep hpet /proc/timer_list 环境准备 $ yum update -y && yum upgrade -y RT Kernel

注:实际上并非一样要使用 RT Kernel,本文只作为推荐使用。

RT repo sudo tee /etc/yum.repos.d/CentOS-rt.repo >/dev/null <<EOF # CentOS-rt.repo [rt] name=CentOS-7-rt baseurl=http://mirror.centos.org/centos/\$releasever/rt/\$basearch/ gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 EOF RT Kernel 依赖 $ yum install tuna tuned tuned-profiles-realtime rt-setup rt-tests -y RT Kernel kernel-rt.x86_64:包含实时内核所有的源代码。 kernel-rt-devel:如果某个程序需要内核提供的一些功能,它就需要内核的 C header 来编译程序,这个时候就需要使用到 kernel-devel 了。例如:NVIDIA 的显卡驱动需要编译一个放在内核里面运行的模块,编译这个模块就需要内核的 heade r文件才能顺利完成。另外,kernel-devel 不光只是 C Header 文件,它还有内核的配置文件,以及其他的开发用的资料。 kernel-headers:提供内核的信息,包含内核的头文件、Kconfig 和 Makefile,是内核对外的一个接口,当需要向内核提供兼容的功能模块时,就需要提供内核的信息。所以,在安装驱动时往往也需要 kernel-header。 $ yum install kernel-rt.x86_64 kernel-rt-devel.x86_64 kernel-headers.x86_64 -y $ uname -a ; rpm -qa kernel\* | sort Linux nes 3.10.0-957.1.3.el7.x86_64 #1 SMP Thu Nov 29 14:49:43 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux kernel-3.10.0-1127.el7.x86_64 kernel-3.10.0-693.5.2.el7.x86_64 kernel-3.10.0-957.1.3.el7.x86_64 kernel-headers-3.10.0-1127.el7.x86_64 kernel-rt-3.10.0-1127.rt56.1093.el7.x86_64 kernel-rt-devel-3.10.0-1127.rt56.1093.el7.x86_64 kernel-tools-3.10.0-1127.el7.x86_64 kernel-tools-libs-3.10.0-1127.el7.x86_64 $ ll /boot/vmlinuz* -rwxr-xr-x. 1 root root 5878368 10月 30 2017 /boot/vmlinuz-0-rescue-1e6e9c9002cd9609bf851a132b8bf805 -rwxr-xr-x 1 root root 6762688 4月 1 07:40 /boot/vmlinuz-3.10.0-1127.el7.x86_64 -rwxr-xr-x 1 root root 6672944 5月 1 22:55 /boot/vmlinuz-3.10.0-1127.rt56.1093.el7.x86_64 -rwxr-xr-x. 1 root root 5878368 10月 21 2017 /boot/vmlinuz-3.10.0-693.5.2.el7.x86_64 -rwxr-xr-x 1 root root 6639808 11月 29 2018 /boot/vmlinuz-3.10.0-957.1.3.el7.x86_64 # 设置 RT Kernel 为默认内核 $ grubby --set-default /boot/vmlinuz-3.10.0-1127.rt56.1093.el7.x86_64

重启操作系统之后,首先需要确定操作系统各个层面的 Kernel 版本是一致的。否则会出现 make: *** /lib/modules/3.10.0-957.12.2.el7.x86_64/build: 没有那个文件或目录。 停止。 的错误:

$ uname -r 3.10.0-1127.rt56.1093.el7.x86_64 $ ls /usr/src/kernels/ 3.10.0-1127.rt56.1093.el7.x86_64

也可以将没有的 Kernel 卸载掉,例如:

rpm -e kernel-3.10.0-957.12.2.el7.x86_64 基础软件依赖 libpcap 网络数据包捕获函数库(A system-independent interface for user-level packet capture)。 libpcap-devel 用于编译和使用基于 libcap 的 PMD 轮询模式驱动程序。 $ yum install -y libpcap.x86_64 libpcap-devel.x86_64

DPDK pdump 抓包工具依赖基于 libpcap 的 PMD 驱动。默认情况下,该驱动程序被禁用,可以通过在构建时修改配置文件来开启:

$ vim dpdk-18.08/x86_64-native-linuxapp-gcc/.config CONFIG_RTE_LIBRTE_PMD_PCAP=y CONFIG_RTE_LIBRTE_PDUMP=y NUMA Tools $ yum install numactl numactl-devel.x86_64 numactl-libs.x86_64 -y lspci $ yum install pciutils -y ifconfig $ yum install net-tools.x86_64 -y C/C++ 编译器 $ yum install gcc gcc-c++ -y 设置大页内存

对于 64 位系统,如果平台支持,建议使用 1GB 的 hugepages。

# Step 1. 查看 Linux 操作系统是否启动了大页内存,如果 HugePages_Total 为 0,意味着 Linux 没有设置或没有启用 Huge pages。 $ grep -i HugePages_Total /proc/meminfo HugePages_Total: 0 # Step 2. 查看是否挂载了 hugetlbfs $ mount | grep hugetlbfs hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime) # Step 3. 如果没有挂载则手动挂载 $ mkdir /mnt/huge_1GB $ mount -t hugetlbfs nodev /mnt/huge_1GB $ vim /etc/fstab nodev /mnt/huge_1GB hugetlbfs pagesize=1GB 0 0 # 修改 grub2,例如为系统配置 2 个 1GB 的大页面 $ vi /etc/grub2.cfg # 定位到 linux16 /boot/vmlinuz-3.10.0-1127.rt56.1093.el7.x86_64 在行末追加 default_hugepagesz=1G hugepagesz=1G hugepages=2 # 立即生效 # NUMA 架构 $ echo 1024 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages $ echo 1024 > /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages # 非 NUMA 架构 # echo 1024 >/sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages # Step 5. 查看更详细的大页内存信息 $ cat /proc/meminfo | grep Huge HugePages_Total: 1024 HugePages_Free: 1024 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB # Step 6. 如果上述输出看见 Hugepagesize 已经设置成 1GB,但 HugePages_Total 还是为 0,那么需要修改内核参数设定大页面的数量 $ sysctl -w vm.nr_hugepages=2 # 或者 $ echo 'vm.nr_hugepages = 2' > /etc/sysctl.conf $ sysctl -p

NOTE:一般情况下,配置的大页面可能主要供特定的应用程序或服务使用,其他进程是无法共享这部分空间的(如 Oracle SGA)。 请根据系统物理内存和应用需求来设置合适的大小,避免大页面使用的浪费;以及造成其他进程因竞争剩余可用内存而出现内存溢出的错误,进而导致系统崩溃的现象。默认的,当存在大页面时,会在应用进程或者内核进程申请大页内存的时候,优先为它们分配大页面,大页面不足以分配时,才会分配传统的 4KB 页面。查看哪个程序在使用大页内存:

grep -e AnonHugePages /proc/*/smaps | awk '{if(2>4)print0}' | awk -F "/" '{print0;system("ps−fp"3)}' 安装 DPDK

DPDK 支持使用 dpdk-setup.sh 脚本和手动编译两者方式进行安装, dpdk-setup.sh 可以完成下列工作:

构建 DPDK 库 加载/卸载 DPDK IGB_UIO 内核模块 加载/卸载 VFIO 内核模块 加载/卸载 DPDK KNI 内核模块 创建/删除 NUMA 或 non-NUMA 平台的 hugepages 查看网络端口状态和预留给 DPDK 应用程序使用的端口 设置非 root 用户使用 VFIO 的权限 运行 test 和 testpmd 应用程序 查看 meminfo 中的 hugepages 列出在 /mnt/huge 中的 hugepages 删除内置的 DPDK 库 对于其中一个 EAL Target,一旦完成了这些步骤,用户就可以编译自己的在 EAL 库中链接的应用程序来创建 DPDK 映像。

这里我们使用后一种安装方式,可以更深入的理解 DPDK 安装的内容。

获取 DPDK 代码 $ cd /opt $ wget http://fast.dpdk.org/rel/dpdk-18.08.tar.gz $ tar -zxvf dpdk-18.08.tar.gz $ cd dpdk-18.08 $ ll 总用量 76 drwxrwxr-x 8 root root 150 8月 10 2018 app drwxr-xr-x 7 root root 119 5月 7 23:42 build drwxrwxr-x 3 root root 242 8月 10 2018 buildtools drwxrwxr-x 4 root root 4096 8月 10 2018 config drwxrwxr-x 3 root root 4096 8月 10 2018 devtools drwxrwxr-x 5 root root 97 8月 10 2018 doc drwxrwxr-x 11 root root 162 8月 10 2018 drivers drwxrwxr-x 49 root root 4096 8月 10 2018 examples -rw-rw-r-- 1 root root 291 8月 10 2018 GNUmakefile drwxrwxr-x 4 root root 69 8月 10 2018 kernel drwxrwxr-x 45 root root 4096 8月 10 2018 lib drwxrwxr-x 2 root root 105 8月 10 2018 license -rw-rw-r-- 1 root root 34749 8月 10 2018 MAINTAINERS -rw-rw-r-- 1 root root 136 8月 10 2018 Makefile -rw-rw-r-- 1 root root 2386 8月 10 2018 meson.build -rw-rw-r-- 1 root root 1393 8月 10 2018 meson_options.txt drwxrwxr-x 8 root root 4096 8月 10 2018 mk drwxrwxr-x 2 root root 23 8月 10 2018 pkg -rw-rw-r-- 1 root root 510 8月 10 2018 README drwxrwxr-x 7 root root 121 8月 10 2018 test drwxrwxr-x 2 root root 113 8月 10 2018 usertools lib:DPDK 库文件 drivers:DPDK 轮询驱动源文件 app:DPDK 应用程序(自动测试)源文件 examples:DPDK 应用例程 config, buildtools, mk:框架相关的 Makefile、脚本及配置文件 设置环境变量 # vi dpdk.rc export RTE_SDK=/opt/dpdk-18.08 export RTE_TARGET=x86_64-native-linuxapp-gcc export DPDK_BUILD=${DPDK_DIR}/${RTE_TARGET} export LD_LIBRARY_PATH=${RTE_SDK}/${RTE_TARGET}/lib:/usr/local/lib:/usr/lib:

NOTE:以下两个环节变量在每次运行 DPDK 示例程序的时候都需要加载,因为示例程序的 Makefile 里面定义了。

RTE(Run-Time Environment) RTE_SDK:指向 DPDK 的安装目录。 RTE_TARGET:指向 DPDK 目标环境目录。 编译安装 source dpdk.rc cd /opt/dpdk-18.08/ make config T=$RTE_TARGET make make install T=$RTE_TARGET 其中 T(Target)的描述格式为: ARCH-MACHINE-EXECENV-TOOLCHAIN # ARCH = i686, x86_64, ppc_64 # MACHINE = native, ivshmem, power8 # EXECENV = linuxapp, bsdapp # TOOLCHAIN = gcc, icc 目标环境目录

编译完成之后生成了 DPDK 的目标环境目录 x86_64-native-linuxapp-gcc:

$ cd ${RTE_SDK}/${RTE_TARGET}/ $ ll 总用量 24 drwxr-xr-x 2 root root 305 5月 7 23:53 app drwxr-xr-x 7 root root 75 5月 7 23:52 build drwxr-xr-x 4 root root 8192 5月 7 23:52 include drwxr-xr-x 2 root root 42 5月 7 23:49 kmod drwxr-xr-x 2 root root 4096 5月 7 23:52 lib -rw-r--r-- 1 root root 313 5月 7 23:47 Makefile

创建目标环境之后,可以进入目标环境目录 x86_64-native-linuxapp-gcc,继续更改代码并编译,还可以通过编辑目录中的 .config 文件对 DPDK 环境进行配置修改。

cd x86_64-native-linuxapp-gcc vi .config make

此外,make clean 命令可以用于删除任何现有的编译文件,以便后续完整、干净地重新编译代码。

目标环境目录下包含了开发 DPDK Application 所需的 DPDK 环境所有的库,包括 PMD 轮询驱动程序和头文件。 此外,用于测试的 test 和 testpmd 应用程序构建在 build/app 目录下。还有一个 kmod 目录,存放可能需要被加载的内核模块。

[root@c-dev x86_64-native-linuxapp-gcc]# ll kmod/ 总用量 1048 -rw-r--r-- 1 root root 289104 5月 7 23:49 igb_uio.ko -rw-r--r-- 1 root root 780936 5月 7 23:49 rte_kni.ko 加载内核模块

要运行 DPDK 应用程序,需要将合适的 UIO 模块线加载到内核中,UIO 包括:uio_pci_generic、uio、igb_uio、vfio_pci。

NOTE:在多数情况下,Linux 内核包含了标准的 uio_pci_generic 模块就可以提供 UIO 能力。区别于 uio_pci_generic ,DPDK 代码库还提供了 igb_uio 模块。需要注意的是,对于一下不支持传统中断机制的设备,例如:VF 设备,就必须使用 igb_uio 来替代 uio_pci_generic 模块。在 DPDK 1.7 版本还提供 VFIO 的支持,所以,对于支持 VFIO 的平台,可选择使用 UIO,也可以不用。还需要注意的是,若使用 VFIO,首先平台的内核版本必须支持 VFIO 功能。 Linux 内核从 3.6.0 版本之后就包含了 VFIO 模块,通常是默认存在的。此外,要使用 VFIO,内核和 BIOS 都必须支持,并配置为启用 IO 虚拟化,例如:Intel® VT-d。为了保证非特权用户运行 DPDK 时能够正确操作 VFIO,则还应设置正确的权限。这可以通过 DPDK 的配置脚本(dpdk-setup.sh)来完成。

# Loading Modules to Enable Userspace IO for DPDK $ cd ${RTE_SDK}/${RTE_TARGET}/kmod/ # 加载 UIO Framework 内核模块 $ modprobe uio # 加载 igb_uio 内核驱动程序模块 $ insmod igb_uio.ko # modprobe uio_pci_generic # modprobe vfio-pci $ lsmod | grep uio igb_uio 13542 0 uio 19338 1 igb_uio 绑定网卡到新的内核驱动模块

网卡要使用 DPDK,必须将网卡绑定到 igb_uio 内核模块。默认的,DPDK 在启动时不再自动地将内核模块解绑到网卡上,这一步骤需要手动完成。DPDK Application 使用的网卡必须跟 Linux 原生的驱动程序解绑,并重新绑定到 uio_pci_generic、igb_uio 或 vfio-pci 内核模块上。

$ cd ${RTE_SDK}/usertools/ # 查看当前网卡绑定的驱动状态 $ ./dpdk-devbind.py --status Network devices using DPDK-compatible driver ============================================ Network devices using kernel driver =================================== 0000:00:03.0 'Virtio network device 1000' if=eth0 drv=virtio-pci unused=virtio_pci,igb_uio *Active* 0000:00:05.0 'MT27800 Family [ConnectX-5 Virtual Function] 1018' if=ens5 drv=mlx5_core unused=igb_uio 0000:00:06.0 'MT27800 Family [ConnectX-5 Virtual Function] 1018' if=ens6 drv=mlx5_core unused=igb_uio 0000:00:07.0 'MT27800 Family [ConnectX-5 Virtual Function] 1018' if=ens7 drv=mlx5_core unused=igb_uio # 首先 DOWN 掉需要绑定 DPDK 驱动的网卡,否知绑定不成功。 $ ifconfig ens5 down $ ifconfig ens6 down $ ifconfig ens7 down # 把网卡从原驱动 e1000e 上解绑,要使用 DPDK,必须将网卡绑定到 igb_uio 模块。 $ ./dpdk-devbind.py --bind=igb_uio 00:05.0 $ ./dpdk-devbind.py --bind=igb_uio 00:06.0 $ ./dpdk-devbind.py --bind=igb_uio 00:07.0 # 再次查看 $ ./dpdk-devbind.py --status-dev net Network devices using DPDK-compatible driver ============================================ 0000:00:05.0 'MT27800 Family [ConnectX-5 Virtual Function] 1018' drv=igb_uio unused=mlx5_core 0000:00:06.0 'MT27800 Family [ConnectX-5 Virtual Function] 1018' drv=igb_uio unused=mlx5_core 0000:00:07.0 'MT27800 Family [ConnectX-5 Virtual Function] 1018' drv=igb_uio unused=mlx5_core Network devices using kernel driver =================================== 0000:00:03.0 'Virtio network device 1000' if=eth0 drv=virtio-pci unused=virtio_pci,igb_uio *Active* $ ls -l /dev/uio* crw------- 1 root root 243, 0 5月 9 18:30 /dev/uio0 crw------- 1 root root 243, 1 5月 9 18:30 /dev/uio1 crw------- 1 root root 243, 2 5月 9 18:30 /dev/uio2 $ ls -l /sys/class/uio/uio0/maps/ drwxr-xr-x 2 root root 0 5月 9 18:30 map0 $ ls -l /sys/class/uio/uio1/maps/ drwxr-xr-x 2 root root 0 5月 9 18:30 map0 $ ls -l /sys/class/uio/uio2/maps/ drwxr-xr-x 2 root root 0 5月 9 18:30 map0 # 如想修改回普通网卡模式,则使用如下命令 # ./dpdk-devbind.py -b e1000 00:08.0 # ifconfig ens33 up

NOTE:上述输出可以看出 uioX 设备只记录了一个 PCI BAR,是 Memory BAR。这跟 PCI 设备有关,有些网卡还可以看见 IO BAR,即:map1 目录。

被 DPDK 接管后的网卡在操作系统层面是看不见的:

$ ip l 1: lo: mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: eth0: mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000 link/ether fa:16:3e:91:5b:97 brd ff:ff:ff:ff:ff:ff 适配 Mellanox ConnectX-5 网卡(可选)

如果你使用的是 Intel 的网卡,那么上述的步骤当然没有问题。但笔者使用了 Mellanox 的 ConnectX-5 网卡所以还需要做一些适配的工作。否则就会出现 testpmd: No probed ethernet devices 的错误。

下载 Mellanox ConnectX-5 网卡驱动(https://cn.mellanox.com/products/infiniband-drivers/linux/mlnx_ofed)
博客专家 原创文章 583获赞 1466访问量 195万+ 关注 他的留言板 展开阅读全文
作者:范桂飓



dpdk 安装

需要 登录 后方可回复, 如果你还没有账号请 注册新账号
相关文章