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\n", 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\n");

	/* 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM