一、简介
1、DPDK 是 Data Plane Development Kit的缩写;简单来说,DPDK应用程序运行在操作系统的User Space,利用自身提供的数据平面库来收发包处理,绕过了 Linux 内核协议栈对数据包处理过程,以提升报文处理效率。
一句话总结:DPDK可以将用户态的数据不经过内核直接转发到网卡,同样网卡数据也不经过内核直接映射到用户态内存实现加速目的。
2、DPDK网络协议处理过程:
DPDK针对Intel网卡实现了基于轮询方式的PMD(Poll Mode Drivers)驱动,这个驱动由API、用户空间运行的驱动程序构成,该驱动使用无中断方式直接操作网卡的接收和发送队列(除了链路状态通知仍必须采用中断方式以外)。PMD从网卡上接收到数据包后,会直接通过DMA方式传输到预分配的内存中,同时更新无锁环形队列中的数据包指针,不断轮询的应用程序很快就能感知收到数据包,并在预分配的内存地址上直接处理数据包。
3、DPDK核心思想:
(1)通过UIO技术将报文拷贝到应用空间处理;
(2)通过大页内存,降低cache miss ,提高命中率,进而cpu访问速度;
(3)通过CPU亲和性,绑定网卡和线程到固定的core,减少cpu任务切换;
(4)通过无锁队列,减少资源竞争。
4、DPDK框架结构(如下:)
二、DPDK安装
1、安装网卡驱动、升级网卡固件
1)Mellanox官网下载对应OS的Mellanox驱动: Linux InfiniBand Drivers
2)安装网卡驱动,执行如下命令:
# cd /root/MLNX_OFED_LINUX-5.5-1.0.3.2-ubuntu20.04-aarch64
# ./mlnxofedinstall
# /etc/init.d/opnibd restart
# reboot
4)升级网卡固件:可从华为官网下载同型号网卡同系统下的固件版本直接安装。
2、DPDK安装:
1)安装DPDK依赖包和构建工具:
apt-get install cmake*
apt-get install *numa*
apt-get install libelf-freebsd-dev
apt-get install libelf-dev
apt-install ninja-build*
apt-get install meson*
2)编译安装DPDK:
tar -xJf dpdk-20.11.1.tar.xz
cd dpdk-stable-20.11.1
meson -Dexamples=all -Dmax_numa_nodes=1 build
ninja -C build
ninja -C build install
3)验证安装是否成功:
pkg-config --variable pc_path pkg-config
pkg-config --modversion libdpdk
4)内存大页配置:
a、检查OS Hugepagesize情况:
# cat /proc/meminfo | grep Huge
b、设置内存大页大小和页面数:
# vim /etc/default/grub //修改ubuntu中得grub参数
GRUB_CMDLINE_LINUX="transparent_hugepage=never default_hugepagesz=32M hugepagesz=32M hugepages=256 "
# update-grub (让grub修改生效)
# reboot
# cat /proc/cmdline (确认grub参数是否生效)
5)运行测试,运行 ./build/examples/dpdk-helloworld ,如下所示:
三、加载驱动
1、VFIO
VFIO是一个可以安全地把设备I/O、中断、DMA等暴露到用户空间(userspace),从而可以在用户空间完成设备驱动的框架。用户空间直接设备访问,虚拟机设备分配可以获得更高的IO性能,依赖于IOMMU、vfio-pci;相比于UIO,VFIO更为强健和安全。
1)挂载vfio-pci驱动
a)查看是否已经挂载vfio-pci驱动:
未查询到,修改grub配置,开启vfio支持,检查GRUB配置:(内核需要配置支持Intel® VT-x、VT-d,内核通过如下命令查看)
没发现则需要添加:
#vim /etc/default/grub
GRUB_CMDLINE_LINUX="transparent_hugepage=never default_hugepagesz=32M hugepagesz=32M hugepages=256 intel_iommu=on iommu=pt"
# update-grub (让grub修改生效)
# reboot
# cat /proc/cmdline (确认grub参数是否生效)
b)加载vfio-pci驱动:
查看网卡驱动是否加载成功:</