【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 就是成功了!!

 

 


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

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部