dpdk 功能非常强大,性能和优化都很优秀,缺点就是上手难度比较高。
接下来是 dpdk 的一个快速上手的步骤。完成 dpdk 的编译和运行 dpdk 官方自带的示例程序。
环境
Ubuntu 22.04
DPDK 24.11.2 (LTS)
环境要求
内核版本 >= 4.19(可以使用
uname -r
命令检查正在使用的内核版本)
glibc >= 2.7 (可以使用
ldd --version
命令检查版本)
内核配置:在 Fedora OS 和其他常见发行版(如 Ubuntu 或 Red Hat Enterprise Linux)中,供应商提供的内核配置可用于运行大多数 DPDK 应用程序。
对于其他内核构建,应为 DPDK 启用的选项包括:
HUGETLBFS
PROC_PAGE_MONITOR 支持
如果需要 HPET 支持,还应启用 HPET 和 HPET_MMAP 配置选项。有关更多详细信息,请参阅高精度事件计时器 (HPET) 功能部分。
安装依赖
通用开发工具:
apt install build-essential
pip:
sudo apt install python3-pip
Meson (version 0.57+) and ninja:
pip3 install meson ninja
pyelftools (version 0.22+) :
pip3 install pyelftools
用于处理 NUMA(非统一内存访问)的库:
sudo apt install libnuma-dev
dpdk 下载
从 dpdk 官网下载 dpdk的压缩包,我这里选择的是 DPDK 24.11.2 (LTS)。
dpdk 编译
解压 dpdk 压缩包
tar -xvf dpdk-24.11.2.tar.xz
进行编译
进入 dpdk 目录,执行命令
meson configure -Dexamples=all
进入
build
目录执行
ninja
ninja install
配置大页内存
1. 检查内核是否支持 HugePages
运行以下命令确认内核是否启用了 HugePages 支持:
grep -i huge /boot/config-$(uname -r)
如果输出包含类似以下内容,则表示内核支持 HugePages:
CONFIG_HUGETLBFS=y
CONFIG_HUGETLB_PAGE=y
2. 查看系统支持的Hugepage类型
DPDK通常使用2MB
或1GB
的大页。先确认系统支持的类型:
grep -i huge /proc/meminfo
AnonHugePages: 12288 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB # 表示支持2MB大页
3. 配置Hugepage数量
方法一:临时配置(重启失效)
对于2MB
大页,设置2048个(约4GB):
echo 2048 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
对于1GB
大页(推荐大内存系统):
echo 4 > /sys/kernel/mm/hugepages/hugepages-1048576kB/nr_hugepages
方法二:永久配置(推荐)
编辑/etc/default/grub
,添加或修改GRUB_CMDLINE_LINUX
参数:
GRUB_CMDLINE_LINUX="default_hugepagesz=1G hugepagesz=1G hugepages=4" # 4GB 1G大页
# 或使用2MB:hugepagesz=2M hugepages=2048
更新GRUB并重启:
sudo update-grub
sudo reboot
4. 挂载Hugepage文件系统
创建挂载点并挂载:
sudo mkdir -p /mnt/huge
sudo mount -t hugetlbfs nodev /mnt/huge
若需开机自动挂载,编辑/etc/fstab
添加一行:
nodev /mnt/huge hugetlbfs defaults 0 0
5. 验证Hugepage设置
检查分配情况:
grep -i huge /proc/meminfo
查看挂载点:
df -h | grep huge
输出示例:
nodev 4.0G 0 4.0G 0% /mnt/huge
开启 vifo 支持(网卡接管)
1. 修改grub配置,开启vfio支持
检查GRUB配置:
#内核需要配置支持Intel® VT-x、VT-d,内核通过如下命令查看:
cat /proc/cmdline | grep iommu=pt
cat /proc/cmdline | grep intel_iommu=on
没发现则需要添加:
vim /etc/default/grub
#在下面行中添加:iommu=pt intel_iommu=on
GRUB_CMDLINE_LINUX=
#现在变成了:
GRUB_CMDLINE_LINUX="crashkernel=auto resume=/dev/mapper/cl-swap rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet iommu=pt intel_iommu=on transparent_hugepage=never default_hugepagesz=2M hugepagesz=2M hugepages=1024 "
# 更新配置和重启
sudo update-grub
reboot
验证下:
[root@localhost ~]# cat /proc/cmdline | grep intel_iommu=on
BOOT_IMAGE=(hd0,msdos1)/vmlinuz-4.18.0-240.el8.x86_64 root=/dev/mapper/cl-root ro crashkernel=auto resume=/dev/mapper/cl-swap rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet iommu=pt intel_iommu=on transparent_hugepage=never default_hugepagesz=2M hugepagesz=2M hugepages=1024
[root@localhost ~]# cat /proc/cmdline | grep iommu=pt
BOOT_IMAGE=(hd0,msdos1)/vmlinuz-4.18.0-240.el8.x86_64 root=/dev/mapper/cl-root ro crashkernel=auto resume=/dev/mapper/cl-swap rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet iommu=pt intel_iommu=on transparent_hugepage=never default_hugepagesz=2M hugepagesz=2M hugepages=1024
2. 加载网卡驱动
modprobe vfio
modprobe vfio-pci
注意虚拟机环境需要 noniommu_mode,配置 enable_unsafe_noiommu_mode 选项
#允许在没有IOMMU的情况下使用VFIO。这种模式适用于与基于UIO的驱动程序相同的所有意图和目的,并具有所有相同的优点与限制。
echo 1 > /sys/module/vfio/parameters/enable_unsafe_noiommu_mode
3. 绑定网卡
到DPDK目录下/home/dpdk-stable-20.11.3/usertools
,使用脚本./dpdk-devbind.py
绑定网卡
查看网卡状态
绑定网卡
ifconfig ens192 down
ifconfig ens224 down
./dpdk-devbind.py -b vfio-pci 0000:0b:00.0
./dpdk-devbind.py -b vfio-pci 0000:13:00.0
运行示例程序
刚才在编译 dpdk 时设置了参数-Dexamples=all
,它的作用是编译所有的示例程序,所以现在示例程序都已经编译完成,可以直接到build/example/
目录下运行示例程序。
如果编译时候没有选择参数-Dexamples
,可以进入示例程序目录执行make
命令单独编译,也可以重新编译 dpdk。
dpdk根目录下执行,清理 dpdk 旧编译:
meson setup --wipe
运行
进入build/example/
目录
./dpdk-helloworld -l 1 -n 1
EAL参数
-c
指定使用的内核数量,输入格式为16进制。-l
指定使用那些内核,如果不指定默认从0开始。-n
指定内存通道数。-q
指定一个内核带几个网口。-p
指定使用几个网口,也采用16进制。-T
指定数据打印间隔时间,格式是秒,默认是10秒-s
以掩码的方式指定服务核心
wl
05 / 07用上了!谢!
From Nginx Proxy Manager 登录出错 Bad gateway