zoukankan      html  css  js  c++  java
  • DPDK — 安装部署

    目录

    官方手册

    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
    ============================================
    <none>
    
    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: <LOOPBACK,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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 的错误。

    1. 下载 Mellanox ConnectX-5 网卡驱动(https://cn.mellanox.com/products/infiniband-drivers/linux/mlnx_ofed)
      在这里插入图片描述
    2. 安装驱动
    $ yum install python-devel redhat-rpm-config rpm-build createrepo -y
    $ cd /opt/MLNX_OFED_LINUX-5.0-2.1.8.0-rhel7.8-x86_64
    
    $ ./mlnx_add_kernel_support.sh -m /opt/MLNX_OFED_LINUX-5.0-2.1.8.0-rhel7.8-x86_64
    Note: This program will create MLNX_OFED_LINUX TGZ for rhel7.8 under /tmp directory.
    Do you want to continue?[y/N]:y
    See log file /tmp/mlnx_iso.22948_logs/mlnx_ofed_iso.22948.log
    
    Checking if all needed packages are installed...
    Building MLNX_OFED_LINUX RPMS . Please wait...
    Creating metadata-rpms for 3.10.0-1127.rt56.1093.el7.x86_64 ...
    WARNING: If you are going to configure this package as a repository, then please note
    WARNING: that it contains unsigned rpms, therefore, you need to disable the gpgcheck
    WARNING: by setting 'gpgcheck=0' in the repository conf file.
    Created /tmp/MLNX_OFED_LINUX-5.0-2.1.8.0-rhel7.8-x86_64-ext.tgz
    
    # 安装 MLNX 驱动并支持 DPDK
    # 安装 DPDK 驱动
    # yum install tcl tk -y
    # ./mlnxofedinstall --dpdk --upstream-libs --add-kernel-support
    # 安装完整的驱动
    $ yum install tcl tk gtk2 atk cairo gcc-gfortran tcsh -y
    $ ./mlnxofedinstall --add-kernel-support
    Note: This program will create MLNX_OFED_LINUX TGZ for rhel7.8 under /tmp/MLNX_OFED_LINUX-5.0-2.1.8.0-3.10.0-1127.rt56.1093.el7.x86_64 directory.
    See log file /tmp/MLNX_OFED_LINUX-5.0-2.1.8.0-3.10.0-1127.rt56.1093.el7.x86_64/mlnx_iso.4764_logs/mlnx_ofed_iso.4764.log
    
    Checking if all needed packages are installed...
    Building MLNX_OFED_LINUX RPMS . Please wait...
    Creating metadata-rpms for 3.10.0-1127.rt56.1093.el7.x86_64 ...
    WARNING: If you are going to configure this package as a repository, then please note
    WARNING: that it contains unsigned rpms, therefore, you need to disable the gpgcheck
    WARNING: by setting 'gpgcheck=0' in the repository conf file.
    Created /tmp/MLNX_OFED_LINUX-5.0-2.1.8.0-3.10.0-1127.rt56.1093.el7.x86_64/MLNX_OFED_LINUX-5.0-2.1.8.0-rhel7.8-ext.tgz
    Installing /tmp/MLNX_OFED_LINUX-5.0-2.1.8.0-3.10.0-1127.rt56.1093.el7.x86_64/MLNX_OFED_LINUX-5.0-2.1.8.0-rhel7.8-ext
    /tmp/MLNX_OFED_LINUX-5.0-2.1.8.0-3.10.0-1127.rt56.1093.el7.x86_64/MLNX_OFED_LINUX-5.0-2.1.8.0-rhel7.8-ext/mlnxofedinstall --force
    Logs dir: /tmp/MLNX_OFED_LINUX.22553.logs
    General log file: /tmp/MLNX_OFED_LINUX.22553.logs/general.log
    Verifying KMP rpms compatibility with target kernel...
    Detected KMP rpms incompatibility.
    Will run installation without KMP support since mlnx_add_kernel_support.sh already ran.
    Logs dir: /tmp/MLNX_OFED_LINUX.23774.logs
    General log file: /tmp/MLNX_OFED_LINUX.23774.logs/general.log
    This program will install the MLNX_OFED_LINUX package on your machine.
    Note that all other Mellanox, OEM, OFED, RDMA or Distribution IB packages will be removed.
    Those packages are removed due to conflicts with MLNX_OFED_LINUX, do not reinstall them.
    
    
    rpm --nosignature -e --allmatches --nodeps mft
    
    Starting MLNX_OFED_LINUX-5.0-2.1.8.0 installation ...
    
    Installing mlnx-ofa_kernel 5.0 RPM
    Preparing...                          ########################################
    Updating / installing...
    mlnx-ofa_kernel-5.0-OFED.5.0.2.1.8.1.g########################################
    Installing mlnx-ofa_kernel-modules 5.0 RPM
    Preparing...                          ########################################
    Updating / installing...
    mlnx-ofa_kernel-modules-5.0-OFED.5.0.2########################################
    Installing mlnx-ofa_kernel-devel 5.0 RPM
    Preparing...                          ########################################
    Updating / installing...
    mlnx-ofa_kernel-devel-5.0-OFED.5.0.2.1########################################
    Installing kernel-mft 4.14.0 RPM
    Preparing...                          ########################################
    Updating / installing...
    kernel-mft-4.14.0-105.kver.3.10.0_1127########################################
    Installing knem 1.1.3.90mlnx1 RPM
    Preparing...                          ########################################
    Updating / installing...
    knem-1.1.3.90mlnx1-OFED.5.0.0.3.8.1.g1########################################
    Installing knem-modules 1.1.3.90mlnx1 RPM
    Preparing...                          ########################################
    Updating / installing...
    knem-modules-1.1.3.90mlnx1-OFED.5.0.0.########################################
    Installing iser 5.0 RPM
    Preparing...                          ########################################
    Updating / installing...
    iser-5.0-OFED.5.0.2.1.8.1.g5f67178.kve########################################
    Installing srp 5.0 RPM
    Preparing...                          ########################################
    Updating / installing...
    srp-5.0-OFED.5.0.2.1.8.1.g5f67178.kver########################################
    Installing isert 5.0 RPM
    Preparing...                          ########################################
    Updating / installing...
    isert-5.0-OFED.5.0.2.1.8.1.g5f67178.kv########################################
    Installing rshim 1.18 RPM
    Preparing...                          ########################################
    Updating / installing...
    rshim-1.18-0.gb99e894.kver.3.10.0_1127########################################
    Installing mpi-selector RPM
    Preparing...                          ########################################
    Updating / installing...
    mpi-selector-1.0.3-1.50218            ########################################
    Installing user level RPMs:
    Preparing...                          ########################################
    ofed-scripts-5.0-OFED.5.0.2.1.8       ########################################
    Preparing...                          ########################################
    rdma-core-50mlnx1-1.50218             ########################################
    Preparing...                          ########################################
    libibverbs-50mlnx1-1.50218            ########################################
    Preparing...                          ########################################
    librdmacm-50mlnx1-1.50218             ########################################
    Preparing...                          ########################################
    libibumad-50mlnx1-1.50218             ########################################
    Preparing...                          ########################################
    infiniband-diags-50mlnx1-1.50218      ########################################
    Preparing...                          ########################################
    rdma-core-devel-50mlnx1-1.50218       ########################################
    Preparing...                          ########################################
    libibverbs-utils-50mlnx1-1.50218      ########################################
    Preparing...                          ########################################
    ibsim-0.9-1.50218                     ########################################
    Preparing...                          ########################################
    ibacm-50mlnx1-1.50218                 ########################################
    Preparing...                          ########################################
    librdmacm-utils-50mlnx1-1.50218       ########################################
    Preparing...                          ########################################
    opensm-libs-5.6.0.MLNX20200217.cedc1e4########################################
    Preparing...                          ########################################
    opensm-5.6.0.MLNX20200217.cedc1e4-0.1.########################################
    Preparing...                          ########################################
    opensm-devel-5.6.0.MLNX20200217.cedc1e########################################
    Preparing...                          ########################################
    opensm-static-5.6.0.MLNX20200217.cedc1########################################
    Preparing...                          ########################################
    dapl-2.1.10mlnx-OFED.3.4.2.1.0.50218  ########################################
    Preparing...                          ########################################
    dapl-devel-2.1.10mlnx-OFED.3.4.2.1.0.5########################################
    Preparing...                          ########################################
    dapl-devel-static-2.1.10mlnx-OFED.3.4.########################################
    Preparing...                          ########################################
    dapl-utils-2.1.10mlnx-OFED.3.4.2.1.0.5########################################
    Preparing...                          ########################################
    perftest-4.4-0.23.g89e176a.50218      ########################################
    Preparing...                          ########################################
    mstflint-4.13.0-1.41.g4e8819c.50218   ########################################
    Preparing...                          ########################################
    mft-4.14.0-105                        ########################################
    Preparing...                          ########################################
    srp_daemon-50mlnx1-1.50218            ########################################
    Preparing...                          ########################################
    ibutils2-2.1.1-0.121.MLNX20200324.g061########################################
    Preparing...                          ########################################
    ibutils-1.5.7.1-0.12.gdcaeae2.50218   ########################################
    Preparing...                          ########################################
    cc_mgr-1.0-0.48.MLNX20200216.g4ea049f.########################################
    Preparing...                          ########################################
    dump_pr-1.0-0.44.MLNX20200216.g4ea049f########################################
    Preparing...                          ########################################
    ar_mgr-1.0-0.49.MLNX20200216.g4ea049f.########################################
    Preparing...                          ########################################
    ibdump-6.0.0-1.50218                  ########################################
    Preparing...                          ########################################
    qperf-0.4.11-1.50218                  ########################################
    Preparing...                          ########################################
    mxm-3.7.3112-1.50218                  ########################################
    Preparing...                          ########################################
    ucx-1.8.0-1.50218                     ########################################
    Preparing...                          ########################################
    ucx-devel-1.8.0-1.50218               ########################################
    Preparing...                          ########################################
    sharp-2.1.0.MLNX20200223.f63394a9c8-1.########################################
    Preparing...                          ########################################
    ucx-cma-1.8.0-1.50218                 ########################################
    Preparing...                          ########################################
    ucx-ib-1.8.0-1.50218                  ########################################
    Preparing...                          ########################################
    ucx-rdmacm-1.8.0-1.50218              ########################################
    Preparing...                          ########################################
    ucx-knem-1.8.0-1.50218                ########################################
    Preparing...                          ########################################
    hcoll-4.5.3045-1.50218                ########################################
    Preparing...                          ########################################
    openmpi-4.0.3rc4-1.50218              ########################################
    Preparing...                          ########################################
    mlnx-ethtool-5.4-1.50218              ########################################
    Preparing...                          ########################################
    mlnx-iproute2-5.4.0-1.50218           ########################################
    Preparing...                          ########################################
    mlnxofed-docs-5.0-2.1.8.0             ########################################
    Preparing...                          ########################################
    mpitests_openmpi-3.2.20-e1a0676.50218 ########################################
    
    Installation finished successfully.
    
    
    Preparing...                          ################################# [100%]
    Updating / installing...
       1:mlnx-fw-updater-5.0-2.1.8.0      ################################# [100%]
    
    Added 'RUN_FW_UPDATER_ONBOOT=no to /etc/infiniband/openib.conf
    
    Attempting to perform Firmware update...
    You may need to update your initramfs before next boot. To do that, run:
    
       dracut -f
    To load the new driver, run:
    /etc/init.d/openibd restart
    1. 加载新的 Mellanox 的内核驱动。
    $ dracut -f
    $ /etc/init.d/openibd restart
    Unloading HCA driver:                                      [  OK  ]
    Loading HCA driver and Access Layer:                       [  OK  ]
    
    $ lsmod | grep mlx
    mlx5_fpga_tools        14392  0
    mlx5_ib               402576  0
    ib_uverbs             134629  3 mlx5_ib,ib_ucm,rdma_ucm
    mlx5_core            1195286  2 mlx5_ib,mlx5_fpga_tools
    mdev                   20671  2 vfio_mdev,mlx5_core
    mlxfw                  18227  1 mlx5_core
    mlx4_ib               225298  0
    ib_core               384613  10 rdma_cm,ib_cm,iw_cm,mlx4_ib,mlx5_ib,ib_ucm,ib_umad,ib_uverbs,rdma_ucm,ib_ipoib
    mlx4_en               146708  0
    ptp                    19267  2 mlx4_en,mlx5_core
    mlx4_core             366087  2 mlx4_en,mlx4_ib
    mlx_compat             47180  17 mdev,rdma_cm,vfio_mdev,ib_cm,iw_cm,mlx4_en,mlx4_ib,mlx5_ib,mlx5_fpga_tools,ib_ucm,ib_core,ib_umad,ib_uverbs,mlx4_core,mlx5_core,rdma_ucm,ib_ipoib
    devlink                60067  4 mlx4_en,mlx4_ib,mlx4_core,mlx5_core
    1. 再次查看 DPDK 给网卡绑定的驱动,可以看见网卡绑定的还是我们在上述步骤中绑定的 igb_uio 内核模块,
    $ cd ${RTE_SDK}/usertools/
    $ ./dpdk-devbind.py --status
    
    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*

    Intel 网卡通常使用 igb_uio 之类的内核模块,但 Mellanox 会使用它特有的 mlx5_core 驱动来完成 Mellanox 网卡(PCI 设备)的注册,以及中断处理。所以我们需要重新加载正确的模块。

    在这里插入图片描述

    1. 所以我们需要重新进行绑定,但之前还需要再重新编译一次 DPDK 的 Target Env(目标环境)。修改 DPDK 的配置文件,重新编译一次,详见官方文档(http://doc.dpdk.org/guides-18.08/nics/mlx5.html)。
    $ yum install libmnl-devel.x86_64 -y
    
    $ cd ${RTE_SDK}/${RTE_TARGET}
    $ vi .config
    CONFIG_RTE_LIBRTE_MLX5_PMD=y
    
    $ make
    1. 重新绑定网卡到 mlx5_core 驱动。
    $ cd ${RTE_SDK}/usertools/
    
    $ ./dpdk-devbind.py --bind=mlx5_core 00:05.0
    $ ./dpdk-devbind.py --bind=mlx5_core 00:06.0
    $ ./dpdk-devbind.py --bind=mlx5_core 00:07.0
    
    $ ./dpdk-devbind.py --status
    
    Network devices using DPDK-compatible driver
    ============================================
    <none>
    
    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=eth1 drv=mlx5_core unused=igb_uio
    0000:00:07.0 'MT27800 Family [ConnectX-5 Virtual Function] 1018' if=eth2 drv=mlx5_core unused=igb_uio

    可以看见,Mellanox DPDK 的网卡驱动与 igb_uio 之类的实现有着很大的区别(依旧是内核的驱动),但并不妨碍我们使用 DPDK 的功能特性。而且很显然的,网卡使用 mlx5_core 驱动之后就不再依赖内核的 UIO 框架了,也自然就没有 uioX 设备了。

    $ ls -l /sys/class/uio/uio0/maps/
    ls: 无法访问/sys/class/uio/uio0/maps/: 没有那个文件或目录

    hellowrold

    注:以下测试均要求 UIO 驱动和 hugepage 必须在程序运行前设置好。

    编译运行 hellowrold 程序

    $ cd ${RTE_SDK}/examples/helloworld
    $ make
    
    $ ./build/helloworld
    EAL: Detected 6 lcore(s)
    EAL: Detected 1 NUMA nodes
    EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
    EAL: No free hugepages reported in hugepages-1048576kB
    EAL: Probing VFIO support...
    EAL: WARNING: cpu flags constant_tsc=yes nonstop_tsc=no -> using unreliable clock cycles !
    EAL: PCI device 0000:00:03.0 on NUMA socket -1
    EAL:   Invalid NUMA socket, default to 0
    EAL:   probe driver: 1af4:1000 net_virtio
    hello from core 1
    hello from core 2
    hello from core 3
    hello from core 4
    hello from core 5
    hello from core 0

    如果出现 hello from core X 则说明 DPDK 安装成功。下面分析一下 helloworld 的代码:

    /* SPDX-License-Identifier: BSD-3-Clause
     * Copyright(c) 2010-2014 Intel Corporation
     */
    
    #include <stdio.h>
    #include <string.h>
    #include <stdint.h>
    #include <errno.h>
    #include <sys/queue.h>
    
    #include <rte_memory.h>
    #include <rte_launch.h>
    #include <rte_eal.h>
    #include <rte_per_lcore.h>
    #include <rte_lcore.h>
    #include <rte_debug.h>
    
    static int
    lcore_hello(__attribute__((unused)) void *arg)
    {
    	unsigned lcore_id;
    	lcore_id = rte_lcore_id();
    	printf("hello from core %u
    ", lcore_id);
    	return 0;
    }
    
    int
    main(int argc, char **argv)
    {
    	int ret;
    	unsigned lcore_id;
    
    	ret = rte_eal_init(argc, argv);
    	if (ret < 0)
    		rte_panic("Cannot init EAL
    ");
    
    	/* call lcore_hello() on every slave lcore */
    	RTE_LCORE_FOREACH_SLAVE(lcore_id) {
    		rte_eal_remote_launch(lcore_hello, NULL, lcore_id);
    	}
    
    	/* call it on master lcore too */
    	lcore_hello(NULL);
    
    	rte_eal_mp_wait_lcore();
    	return 0;
    }
    
    1. 调用 rte_eal_init() 初始化 EAL(Environment Abstraction Layer,环境抽象层)。EAL 在每一个 slave lcore 上都创建一个线程,并进行绑核。所以你会发现当前的 CPU Cores 都是跑满的。
      在这里插入图片描述
    2. 再调用 RTE_LCORE_FOREACH_SLAVE() 遍历分配给 DPDK 的所有 slave lcore,然后调用 rte_eal_mp_remote_launch() 注册回调函数 lcore_hello() 进行打印 hello from core X
    3. 在 master lcore 上调用 lcore_hello()。
    4. rte_eal_mp_wait_lcore 等待所有的 slave lcore 退出,然后自己再退出。

    可以通过 -c 选型来指定 lcore mask:

    # 1
    $ ./build/helloworld -c 1 | grep hello
    hello from core 0
    
    # 10
    $ ./build/helloworld -c 2 | grep hello
    hello from core 1
    
    # 11
    $ ./build/helloworld -c 3 | grep hello
    hello from core 1
    hello from core 0
    
    # 100
    $ ./build/helloworld -c 4 | grep hello
    hello from core 2
    
    # 101
    $ ./build/helloworld -c 5 | grep hello
    hello from core 2
    hello from core 0
    
    # 110
    $ ./build/helloworld -c 6 | grep hello
    hello from core 1
    hello from core 2
  • 相关阅读:
    mysql-community-server-5.7.24 & 5.7.31 (5.6.35 升级到 5.7.24)
    企业 数据 能力 中台 大数据平台 CRM
    Tomcat日志切割配置
    你不知道的 Blob
    细说websocket快速重连机制
    DNS反向查询
    从安全的角度看待DNS
    LVS 负载均衡集群
    Linux服务器配置DNS解析
    react修改state的值
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13309269.html
Copyright © 2011-2022 走看看