【DPDK】一步一个坑:从下载到 Helloworld
目录
1 Download
2 构建与安装
3 准备运行环境
3.1 设置 Hugepage
3.2 加载 kernel driver
3.3 绑定 network ports
4 helloworld
环境:Ubuntu 18.04 虚拟机 + VMware
1 Download
http://core.dpdk.org/download/

我下载的是 DPDK 20.11.0 (LTS) 版本,完成之后先解压:
tar xJf dpdk-20.11.tar.xz
2 构建与安装
目前最新版本的 DPDK (20.11) 不再支持以 make 的方式构建,而是改用 meson 与 ninja 这两个工具,所以我们要做的第一件事是安装这两个工具。
对于 Ubuntu 系统的用户来说,apt-get 支持的 meson 最高版本为 0.45,会在构建时报出版本不足的错误:
meson.build:4:0: ERROR: Meson version is 0.45.1 but project requires >= 0.47.1.
由于 meson 和 ninja 都是采用 python 开发的工具包,因此可以通过 pip3 来安装更高版本的包。
sudo apt-get install python3sudo apt-get install python3-pipsudo pip3 install mesonsudo pip3 install ninja
接下来就可以进行 DPDK 的构建与全局安装:
// 进入解压后的 DPDK 文件夹
cd dpdk-20.11// 使用选项 -Dexamples 指定编译所有样例程序
sudo meson -Dexamples=all buildcd buildsudo ninja install
构建完成后,我们可以在 dpdk-20.11/build/examples 路径下找到可运行的 helloworld 程序。

PS:build 的时候 skip 了一堆无法安装的依赖,如果有大佬知道原因的话请告诉我!

3 准备运行环境
根据文档 Running Sample Applications 这一章的提示,在运行 DPDK 样例程序前,首先要确保完成了以下三个操作:
- 设置Hugepage
- 加载 kernel driver
- 绑定 network port 到 kernel driver
3.1 设置 Hugepage
详细参考资料:Kernel Document
第一步:分配 hugepage
方法一:内核启动时分配
这种方法相对于运行时设置的好处是,不会因为内存已经被占用或者内存碎片化的问题导致 hugepage 分配不成功。
sudo nano /etc/default/grub// 在 GRUB_CMDLINE_LINUX_DEFAULT 中增加对 hugepage 的 size 和个数的设置
transparent_hugepage=never default_hugepagesz=2M hugepagesz=2M hugepages=1024
- 这边 default_hugepagesz 和 hugepagesz 要设置为 CPU 架构所支持的大小:
x86:4K,2M,1G
ia64:4K,64K,256K,1M,4M,16M,256M
ppc64:4K,16M
- hugepages 指的是 hugepage 的个数,根据内存大小量力而为,一不小心设太大了会导致虚拟机无法开机。。。

接着更新 GRUB 配置,然后重启系统。
// 重新生成 grub.cfg
sudo grub-mkconfig -o /boot/grub/grub.cfg// 更新 grub 配置
sudo update-grubreboot
方法二:运行时分配
// 如果不是 root 用户,需要借助 sudo tee
// hugepages-2048kB 指的是 2M 的hugepage
echo 1024 | sudo tee /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages// 直接用文本编辑器也可以
sudo nano /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
第二步:查看当前存在的 hugepage 信息
cat /proc/meminfo

每一个条目所表示的含义如下:

第三步:建立挂载点
如果不需要辅助进程(secondary process),DPDK 可以以 “in memory” 模式运行,无需进一步的配置。
如果存在辅助进程,则需要创建挂载点。Linux系统会提供一个默认挂载点 /dev/hugepages,该挂载点使用 kernel parameter 所设置的默认 hugepage size。
如果要使用其他大小的 hugepage,则需要手动配置挂载点:
mkdir /mnt/huge
mount -t hugetlbfs pagesize=1GB /mnt/huge// 如果想要挂载点永久有效,要将下面的命令写入 /etc/fstab 文件
nodev /mnt/huge hugetlbfs pagesize=1GB 0 0
3.2 加载 kernel driver
参考资料:DPDK中使用VFIO的配置
DPDK 一共有VFIO,VFIO no-IOMMU,UIO,Bifurcated Driver 这四种 kernel driver。其中,VFIO 具有良好的健壮性与安全性,也是最常用的(?)一种驱动。使用VFIO需要先使系统支持VT-x (Virtualization Technology) / VT-d 与 IOMMU。
第一步:BIOS 支持
我在开机时的那个 BIOS 界面找了半天没找到,最后发现可以直接在 VMware 里设置(要在虚拟机关机时进行),虚拟化引擎这里全勾上。

输入以下命令不是空白或者 IOMMU Not Found 就是配置成功了。
dmesg | grep -e DMAR -e IOMMU

第二步:内核支持
这一步和配置 hugepage 时一样,还是修改 /etc/default/grub 这个文件
在 GRUB_CMDLINE_LINUX_DEFAULT 里添加 iommu=pt intel_iommu=on
验证配置成功:
cat /proc/cmdline | grep iommu=ptcat /proc/cmdline | grep intel_iommu=on

第三步:加载 kernel driver
sudo modprobe vfio-pci// 我也不知道为啥要修改权限
sudo /usr/bin/chmod a+x /dev/vfio
sudo /usr/bin/chmod 0666 /dev/vfio/*
3.3 绑定 network ports
// 进入 dpdk-20.11/usertools,可以找到 dpdk-devbind.py
// 这边的 ens33 是我要绑定的网卡名称,可以先通过 ifconfig 确认
sudo dpdk-devbind.py --bind=vfio-pci ens33
sudo dpdk-devbind.py --status
第一次执行绑定命令的时候我遇到了这个错误:Warning: routing table indicates that interface 0000:02:01.0 is active. Not modifying
看上去是因为网卡正在使用,所以不能修改,所以先关闭这个网卡,然后再重试绑定命令就成功了。
绑定完成后,我试图用 ifconfig up 重新打开网卡,但是显示找不到网卡,ifconfig -a 也没有,然后重启了一下竟然就一切恢复正常了……
注意!!如果想用 dpdk 来通信,不要打开网卡!
sudo ifconfig ens33 down

4 helloworld
执行位置:dpdk-20.11/build/examples
./dpdk-helloworld -l 0-3 -n 4
遇到了一个 bug,和 Stackoverflow 上的这个问题 what does “EAL: No available hugepages reported in hugepages-1048576kB” mean in dpdk? 一模一样。

简单归纳了一下 Vipin Varghese 的回答,这里有两个问题:
1)EAL: No available hugepages reported in hugepages-1048576kB
1048576kB 就是1G,这行 log 应该只是一个警告,因为我们根本没设置过 1G 的 hugepage,找不到是预料之中的。
2)EAL: Couldn't get fd on hugepage file
EAL: error allocating rte services array
EAL: FATAL: rte_service_init() failed
这是由于没有权限使用 mmap 导致的,在命令行前加上 sudo 就可以了。
最后出现 hello from core x 就是成功了!!

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
