一、安装前提条件
1.条件检查
uname -a
Kernel version >= 2.6.34
ldd --version
glibc >=2.7
我主板上的系统是centos8,具体信息如下
[root@bitway /]# uname -a
Linux bitway 4.18.0-394.el8.x86_64 #1 SMP Tue May 31 16:19:11 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
//Linux 系统版本是 CentOS 8(CentOS Stream 8) ,内核版本为 4.18.0-394.el8.x86_64,架构为 x86_64
//在 CentOS 8 中,内核版本通常会包含 .el8 表示为 CentOS 8 特定的内核版本。
[root@bitway /]# uname -r
4.18.0-394.el8.x86_64
要查看 Linux 系统的版本信息,您可以使用以下命令之一:
uname -a:显示有关内核和操作系统的详细信息,包括内核版本、主机名和操作系统类型。
cat /etc/os-release:显示操作系统的版本和其他详细信息,如发行版名称、版本号、ID 等。cat /etc/redhat-release:显示操作系统的版本
lsb_release -a:如果安装了 LSB(Linux Standard Base),则该命令将显示操作系统的版本信息。
hostnamectl:该命令显示有关主机的详细信息,包括操作系统名称、版本和架构。
lsb_release -d:显示发行版的描述信息,包括操作系统和版本。
[root@bitway /]# ldd --version
ldd (GNU libc) 2.28
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Roland McGrath and Ulrich Drepper.
ftp.gnu.org/gnu/glibc/ 查看glibc公布的版本,2.28版本高于2.7版本,2.28是2018年更新的。2.7版本是2007年更新的
2.检查linux是否安装了DPDK
1.检查库文件:DPDK 安装后会在系统中生成一些库文件。您可以使用以下命令来搜索系统中是否存在 DPDK 的相关库文件:
sudo updatedb # 更新文件数据库
locate librte_*.so # 查找 DPDK 相关的库文件
如果系统中存在以 librte_
开头的 .so
文件,那么可能已经安装了 DPDK。
2.查看已加载的内核模块:DPDK 驱动程序通常作为一个内核模块加载到系统中。您可以使用以下命令查看已加载的内核模块:
lsmod | grep rte
如果输出中包含类似 rte_kni
、rte_ethdev
等的模块,则表示系统中已加载了 DPDK 相关的内核模块。
3.查看已安装的软件包:如果您是通过软件包管理器安装 DPDK 的话(如使用 yum 或 dnf 安装),您可以使用以下命令查看已安装的软件包信息:
rpm -qa | grep dpdk
如果输出中包含与 DPDK 相关的软件包,则说明系统中已经安装了 DPDK。
3.确认网卡信息(DPDK版本号要与硬件信息适配)
要查看 Linux 系统中网卡的型号,您可以使用以下命令之一:
-
使用
lspci
命令:lspci
命令用于显示当前系统的 PCI 设备信息,包括网卡。您可以通过以下命令来查看网卡的型号:lspci | grep -i net
这个命令会列出系统中所有网络适配器的信息,包括型号、制造商等。
-
使用
ip
命令:ip
命令是一个强大的网络配置工具,也可以用来查看网络接口的信息。您可以执行以下命令来获取网卡的型号:ip addr
这个命令将列出系统中所有网络接口的详细信息,包括设备名称和描述。
-
使用
ifconfig
命令:虽然ifconfig
在一些新的 Linux 发行版中已经被弃用,但仍然可以用来查看网络接口信息。您可以执行以下命令来查看网卡的型号:ifconfig
这个命令将列出系统中所有网络接口的信息,包括设备名称和描述。
4.确认cpu信息(DPDK版本号要与硬件信息适配)
-
使用
cat /proc/cpuinfo
命令:这个命令会输出系统中所有 CPU 的详细信息。您可以执行以下命令来获取 CPU 的型号:cat /proc/cpuinfo | grep 'model name' | uniq
这个命令将列出系统中第一个 CPU 的型号。
-
使用
lscpu
命令:lscpu
命令用于显示系统的 CPU 架构信息,包括型号、核心数等。您可以执行以下命令来获取 CPU 的型号:lscpu | grep 'Model name'
这个命令将列出系统中第一个 CPU 的型号。
二、配置大页
1.硬件情况
1.1查看内存情况
[root@bitway /]# free -h
total used free shared buff/cache available
Mem: 30Gi 5.1Gi 23Gi 25Mi 2.2Gi 25Gi
Swap: 15Gi 0B 15Gi
其中:
total
:表示系统总共的内存大小。used
:表示当前正在使用的内存大小。free
:表示当前空闲的内存大小。shared
:表示被多个进程共享的内存大小。buff/cache
:表示被缓存的内存大小。available
:表示当前可用的内存大小。
在安装DPDK并设置大页时,推荐分配给大页的内存大小取决于您系统的需求和使用情况。一般来说,建议将大页内存设置为物理内存总量的一部分,以确保有足够的内存供DPDK使用。
以下是一些常见的推荐设置:
- 对于具有较小内存的系统(如4GB至8GB内存),可以考虑将大页内存设置为总内存的1/4或1/2。
- 对于具有大量内存的系统(如16GB至32GB或更多内存),可以将大页内存设置为总内存的1/8或1/16。
请注意,大页内存的分配可能需要根据您的具体应用程序和系统要求进行微调。建议在设置之前仔细评估您的系统需求,并在实际测试中进行验证。
2.配置大页内存
Hugepages是DPDK用于提升性能的重要手段。 通过使用Hugepages,可以降低内存页数,减少TLB页表数量,增加TLB hit率。
2.1修改Kernel cmdline(推荐)
通过修改kernel command line可以在kernel初始化时传入Hugepages相关参数并进行配置。
具体的操作步骤如下:
- 修改grub文件
修改/etc/default/grub
文件,在GRUB_CMDLINE_LINUX
中加入如下配置:default_hugepagesz=1G hugepagesz=1G hugepages=4
该配置表示默认的hugepages的大小为1G,设置的hugepages大小为1G,hugepages的页数为4页,即以4个1G页面的形式保留4G的hugepages内存
[root@bitway l3fwd]# cat /etc/default/grub GRUB_TIMEOUT=5 GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)" GRUB_DEFAULT=saved GRUB_DISABLE_SUBMENU=true GRUB_TERMINAL_OUTPUT="console" GRUB_CMDLINE_LINUX="crashkernel=auto resume=UUID=d37b2443-dee6-4145-a2e8-5aa02d7be110 rd.lvm.lv=centos/swap rhgb quiet console=ttyS0,115200 default_hugepagesz=1G hugepagesz=1G hugepages=4" GRUB_DISABLE_RECOVERY="true" GRUB_ENABLE_BLSCFG=true
2.编译grub配置文件
grub2-mkconfig -o /boot/grub2/grub.cfg //例子 [root@bitway usertools]# grub2-mkconfig -o /boot/grub2/grub.cfg Generating grub configuration file ... Adding boot menu entry for EFI firmware configuration done [root@bitway usertools]# reboot
3.重启
通过reboot
命令重启,随后可以通过cat /proc/cmdline
查看kernel的command line是否包含之前的配置。
也可以通过cat /proc/meminfo | grep Huge
命令查看是否设置成功,若设置成功可以看到如下配置:
[root@bitway examples]# cat /proc/cmdline
BOOT_IMAGE=(hd0,gpt4)/vmlinuz-4.18.0-394.el8.x86_64 root=UUID=9a31addd-6921-4ed1-a931-19e64046014d ro crashkernel=auto resume=UUID=d37b2443-dee6-4145-a2e8-5aa02d7be110 rd.lvm.lv=centos/swap rhgb quiet console=ttyS0,115200 default_hugepagesz=1G hugepagesz=1G hugepages=4
[root@bitway examples]# cat /proc/meminfo | grep Huge
AnonHugePages: 12288 kB
ShmemHugePages: 0 kB
FileHugePages: 0 kB
HugePages_Total: 4
HugePages_Free: 3
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 1048576 kB
Hugetlb: 4194304 kB
2.2修改sysfs节点
对于2 MB页面,还可以选择在系统启动后进行分配。 这是通过修改 /sys/devices/
中的nr_hugepages
节点来实现的。 对于单节点系统,若需要1024个页面,可使用如下命令:
echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
在NUMA机器上,页面的需要明确分配在不同的node上(若只有一个node只需要分配一次)
echo 1024 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
echo 1024 > /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages
这种配置方式的优点是配置简单,无需编译、重启,但是无法配置1GB这样的大hugepages。
3.大页内存挂载
大页内存除了指定动态库,一般要挂载到特定目录使用,命令如下:
[root@localhost ~]# mkdir -p /mnt/huge
[root@localhost ~]# mount -t hugetlbfs nodev /mnt/huge
将这个挂载点添加到/etc/fstab中,这样可以永久生效,即重启后也仍然可以生效:
vim /etc/fstab
#添加以下内容
#如果是1GB 则nodev /mnt/huge hugetlbfs pagesize=1GB 0 0
#如果不是1GB 则nodev /mnt/huge hugetlbfs defaults 0 0
#重启系统
reboot
可以通过df -a看到挂载成功:
nodev 0 0 0 - /mnt/huge_1GB
三、DPDK编译
1.下载DPDK代码
然后解压缩
tar xJf dpdk-<version>.tar.xz
cd dpdk-<version>
2.编译工具安装
在 DPDK 20.11.10 版本中,并不直接支持使用 make
命令进行编译。DPDK 20.11 版本引入了 Meson 构建系统来替代之前的基于 Makefile 的构建系统。
因此,要在 DPDK 20.11.10 版本中进行编译,您应该使用 Meson 构建系统而不是传统的 make
命令。您可以按照 DPDK 官方文档中提供的指导来使用 Meson 进行构建。
在使用 Meson 进行编译之前,您需要安装 Meson 和 Ninja 构建工具。
[root@bitway dpdk-stable-20.11.10]# meson -Dexamples=all build
-bash: meson: command not found //meson外安装,所以识别不到
[root@bitway dpdk-stable-20.11.10]#
[root@bitway dpdk-stable-20.11.10]# meson --version
-bash: meson: command not found
[root@bitway dpdk-stable-20.11.10]#
[root@bitway dpdk-stable-20.11.10]# meson -version
-bash: meson: command not found
[root@bitway dpdk-stable-20.11.10]# meson -V
-bash: meson: command not found
[root@bitway dpdk-stable-20.11.10]#
[root@bitway dpdk-stable-20.11.10]# ninja --version
-bash: ninja: command not found
[root@bitway dpdk-stable-20.11.10]# ninja --version
-bash: ninja: command not found
[root@bitway dpdk-stable-20.11.10]#
[root@bitway dpdk-stable-20.11.10]# python3 -V
Python 3.6.8
[root@bitway dpdk-stable-20.11.10]#
[root@bitway dpdk-stable-20.11.10]# meson -Dexamples=all build
-bash: meson: command not found
[root@bitway dpdk-stable-20.11.10]#
[root@bitway dpdk-stable-20.11.10]# pip3 install meson ninja
WARNING: Running pip install with root privileges is generally not a good idea. Try `pip3 install --user` instead.
Collecting meson
>: Failed to establish a new connection: [Errno -2] Name or service not known',)': /simple/meson/
>: Failed to establish a new connection: [Errno -2] Name or service not known',)': /simple/meson/
>: Failed to establish a new connection: [Errno -2] Name or service not known',)': /simple/meson/
>: Failed to establish a new connection: [Errno -2] Name or service not known',)': /simple/meson/
>: Failed to establish a new connection: [Errno -2] Name or service not known',)': /simple/meson/
Could not find a version that satisfies the requirement meson (from versions: )
No matching distribution found for meson
//您尝试使用 pip 安装 Meson 和 Ninja,但似乎遇到了连接问题导致安装失败。Meson 并不是一个 //Python 包,因此无法通过 pip 来安装。您需要通过其他途径来安装 Meson 和 Ninja。
[root@bitway dpdk-stable-20.11.10]# epel-release -V
-bash: epel-release: command not found
[root@bitway dpdk-stable-20.11.10]#
[root@bitway dpdk-stable-20.11.10]# rpm -qa | grep epel-release
//检查系统中是否已经安装了 EPEL(Extra Packages for Enterprise Linux)仓库。如果输出中包含了 epel-release,则表示该仓库已经被安装。
epel-release-8-15.el8.noarch
[root@bitway dpdk-stable-20.11.10]#
[root@bitway dpdk-stable-20.11.10]# rpm -qa | grep python3-pip
//检查系统中是否已经安装了 Python 包管理器 pip
python3-pip-wheel-9.0.3-22.el8.noarch
python3-pip-9.0.3-22.el8.noarch
[root@bitway dpdk-stable-20.11.10]#
[root@bitway dpdk-stable-20.11.10]#
[root@bitway dpdk-stable-20.11.10]# sudo yum install emacs-filesystem -y
# 安装meson的依赖包emacs-filesystem
Last metadata expiration check: -8186 days, 19:33:22 ago on Mon 27 Jun 2022 02:24:38 PM CST.
Package emacs-filesystem-1:26.1-7.el8.noarch is already installed.
Dependencies resolved.
Nothing to do.
Complete!
[root@bitway dpdk-stable-20.11.10]#
[root@bitway dpdk-stable-20.11.10]#
[root@bitway dpdk-stable-20.11.10]# sudo yum install vim-filesystem -y
# 安装ninja的依赖包vim-filesystem
Last metadata expiration check: -8186 days, 19:33:33 ago on Mon 27 Jun 2022 02:24:38 PM CST.
Package vim-filesystem-2:8.0.1763-16.el8_5.12.noarch is already installed.
Dependencies resolved.
Nothing to do.
Complete!
[root@bitway dpdk-stable-20.11.10]#
[root@bitway dpdk-stable-20.11.10]#
[root@bitway dpdk-stable-20.11.10]# sudo yum install meson ninja-build
Last metadata expiration check: -8186 days, 19:44:50 ago on Mon 27 Jun 2022 02:24:38 PM CST.
No match for argument: meson
No match for argument: ninja-build
Error: Unable to find a match: meson ninja-build
[root@bitway dpdk-stable-20.11.10]#
[root@bitway dpdk-stable-20.11.10]# sudo yum install epel-release
Last metadata expiration check: -8186 days, 19:51:34 ago on Mon 27 Jun 2022 02:24:38 PM CST.
Package epel-release-8-15.el8.noarch is already installed.
Dependencies resolved.
Nothing to do.
Complete!
[root@bitway dpdk-stable-20.11.10]#
[root@bitway dpdk-stable-20.11.10]# uname -a
Linux bitway 4.18.0-394.el8.x86_64 #1 SMP Tue May 31 16:19:11 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
[root@bitway dpdk-stable-20.11.10]# uname -r
4.18.0-394.el8.x86_64
#在https://cbs.centos.org/koji/buildinfo?buildID=24453 # 下载安装meson的依赖包ninja rpm包
[root@bitway dpdk-stable-20.11.10]# sudo rpm -ivh /tmp/ninja-build-1.10.2-3.2.hs.el8.x86_64.rpm
Verifying... ################################# [100%]
Preparing... ################################# [100%]
Updating / installing...
1:ninja-build-1.10.2-3.2.hs.el8 ################################# [100%]
[root@bitway dpdk-stable-20.11.10]#
[root@bitway dpdk-stable-20.11.10]#
[root@bitway dpdk-stable-20.11.10]# sudo rpm -ivh /tmp/meson-0.61.3-1.1.hs.el8.noarch.rpm
Verifying... ################################# [100%]
Preparing... ################################# [100%]
Updating / installing...
1:meson-0.61.3-1.1.hs.el8 ################################# [100%]
[root@bitway dpdk-stable-20.11.10]#
[root@bitway dpdk-stable-20.11.10]#
meson -Dexamples=all build
cd build
sudo ninja-build install # 此处ninja-build也可以是ninja
[root@bitway build]# sudo ninja-build install
[747/2669] Compiling C object drivers/libtmp_rte_common_qat.a.p/common_qat_qat_qp.c.o
FAILED: drivers/libtmp_rte_common_qat.a.p/common_qat_qat_qp.c.o
t_qat_qp.c.o -c ../drivers/common/qat/qat_qp.c
In file included from ../drivers/common/qat/qat_qp.c:18:
../drivers/crypto/qat/qat_sym.h:14:10: fatal error: openssl/evp.h: No such file or directory
#include <openssl/evp.h>
^~~~~~~~~~~~~~~
compilation terminated.
[751/2669] Compiling C object drivers/libtmp_rte_common_qat.a.p/crypto_qat_qat_sym_pmd.c.o
FAILED: drivers/libtmp_rte_common_qat.a.p/crypto_qat_qat_sym_pmd.c.o
/crypto_qat_qat_sym_pmd.c.o -c ../drivers/crypto/qat/qat_sym_pmd.c
In file included from ../drivers/crypto/qat/qat_sym_pmd.c:16:
../drivers/crypto/qat/qat_sym.h:14:10: fatal error: openssl/evp.h: No such file or directory
#include <openssl/evp.h>
^~~~~~~~~~~~~~~
compilation terminated.
[760/2669] Compiling C object lib/librte_pipeline.a.p/librte_pipeline_rte_table_action.c.o
ninja: build stopped: subcommand failed.
#缺少<openssl/evp.h>
[root@bitway build]# sudo dnf install openssl-devel
CentOS Stream 8 - AppStream 0.0 B/s | 0 B 00:00
Errors during downloading metadata for repository 'appstream':
=x86_64&repo=AppStream&infra=stock [Could not resolve host: mirrorlist.centos.org]
AppStream&infra=stock [Could not resolve host: mirrorlist.centos.org]
//未联网,联网后下载
四、测试运行
build下面的文件是编译后的程序
[root@bitway examples]# ./dpdk-helloworld
EAL: Detected 12 lcore(s)
EAL: Detected 1 NUMA nodes
EAL: Detected static linkage of DPDK
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: No available hugepages reported in hugepages-2048kB
EAL: Probing VFIO support...
EAL: No legacy callbacks, legacy socket not created
hello from core 1
hello from core 2
hello from core 3
hello from core 4
hello from core 5
hello from core 6
hello from core 7
hello from core 8
hello from core 9
hello from core 10
hello from core 11
hello from core 0
[root@bitway examples]#
五、参考资料
在Linux(CentOS)上部署DPDK------脚本方式