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-essentialpip:
sudo apt install python3-pipMeson (version 0.57+) and ninja:
pip3 install meson ninjapyelftools (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=y2. 查看系统支持的Hugepage类型
DPDK通常使用2MB或1GB的大页。先确认系统支持的类型:
grep -i huge /proc/meminfoAnonHugePages: 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 reboot4. 挂载Hugepage文件系统
创建挂载点并挂载:
sudo mkdir -p /mnt/huge
sudo mount -t hugetlbfs nodev /mnt/huge若需开机自动挂载,编辑/etc/fstab添加一行:
nodev /mnt/huge hugetlbfs defaults 0 05. 验证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=10242. 加载网卡驱动
modprobe vfio
modprobe vfio-pci注意虚拟机环境需要 noniommu_mode,配置 enable_unsafe_noiommu_mode 选项
#允许在没有IOMMU的情况下使用VFIO。这种模式适用于与基于UIO的驱动程序相同的所有意图和目的,并具有所有相同的优点与限制。
echo 1 > /sys/module/vfio/parameters/enable_unsafe_noiommu_mode3. 绑定网卡
到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以掩码的方式指定服务核心
默认评论
Halo系统提供的评论