目 录CONTENT

文章目录

dpdk 入门 - 编译和运行示例程序

16Reverie
2025-06-10 / 0 评论 / 0 点赞 / 45 阅读 / 0 字

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

进行编译

  1. 进入 dpdk 目录,执行命令

meson configure -Dexamples=all
  1. 进入 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通常使用2MB1GB的大页。先确认系统支持的类型:

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参数

  1. -c 指定使用的内核数量,输入格式为16进制。

  2. -l 指定使用那些内核,如果不指定默认从0开始。

  3. -n 指定内存通道数。

  4. -q 指定一个内核带几个网口。

  5. -p 指定使用几个网口,也采用16进制。

  6. -T 指定数据打印间隔时间,格式是秒,默认是10秒

  7. -s 以掩码的方式指定服务核心

参考链接

官网下载:https://core.dpdk.org/download

官方文档:https://doc.dpdk.org/guides/index.html

0

评论区