523
社区成员
发帖
与我相关
我的任务
分享目录
前言:
我这里是使用的vmware 结合Ubuntu 20.04 的Server 版本,相信大家在虚拟机配置环境已经没有问题了:当然也可以参考我这篇在virtualbox配置Ubuntu 20.04 的Server 版本的文章使用VirtualBox安装20.04ubuntu(server)虚拟机_virtualbox环境 ubuntu 18.04 server 虚拟机如何访问虚拟光驱-CSDN博客。
DPDK(Data Plane Development Kit,数据平面开发套件)是INTEL公司开发的一款高性能的网络驱动组件,旨在为数据面应用程序提供一个简单方便的,完整的,快速的数据包处理解决方案,主要技术有用户态、轮询取代中断、零拷贝、网卡RSS、访存DirectIO等。
传统网络包处理有 3 个性能瓶颈:
| 瓶颈 | 说明 |
|---|---|
| 频繁中断 | 网卡接收一个包就触发一次中断,CPU 被频繁打断 |
| 用户态与内核态切换 | 网络包需要在内核协议栈和用户态应用之间拷贝 |
| 内存页太小 | 大量使用 4KB 页面导致 TLB Miss,降低吞吐 |
DPDK 就是为解决这些问题而生。
DPDK(数据平面开发套件)的原理是通过优化网络数据处理流程,提高CPU处理网络数据包的效率。其核心原理包括以下几个方面:
轮询模式代替中断:传统网络处理中,网卡每收到一个数据包就会发送中断通知CPU,导致CPU频繁被中断打断。DPDK采用轮询模式,让CPU按固定频率主动检查网卡缓冲区,一次性处理多个数据包,大幅减少中断开销。
用户态驱动:DPDK使用用户态驱动(如PMD,轮询模式驱动)直接与网卡交互,数据包无需经过内核态处理,避免了内核态与用户态之间的切换开销,减少了协议栈处理的延迟。
大页内存:DPDK使用2MB或1GB的大页内存代替传统的4KB小页内存,将数据包缓冲区集中存储在大页中,减少了CPU访问内存时的页表切换次数,提高了内存访问效率。
DPDK主要适用于以下场景:
数据中心高性能应用:如云服务器的虚拟交换机(OVS)、负载均衡器(LB)等需要处理大量网络流量的场景。使用DPDK后,单台服务器的转发能力可以从10G提升到100G,显著降低成本。
5G核心网:5G网络对延迟要求极高(如自动驾驶需要10ms内响应)。DPDK通过减少中断和内存拷贝,能将网络处理延迟从传统的几十微秒降低到几微秒,满足实时性要求。
高频交易系统:在股票、期货等高频交易中,网络延迟直接影响交易收益。DPDK配合FPGA或智能网卡,能将交易指令的网络处理时间压缩到微秒级,成为"抢跑神器"。
首先需要确认我们虚拟机的网卡是否支持多队列,DPDK需要多队列网卡。
使用命令:
cat /proc/interrupts | grep eth0

我的网卡名字是eth0,大家都可能是enss33或者其他的,大家可以进行修改,参考这个博主的修改方式:Linux之手把手教会修改网卡名称_linux修改网卡名称-CSDN博客
当然,我们可以绑定一张网卡给DPDK使用,那么我们需要另外一张网卡进行ssh连接方便进行编程使用,因为DPDK 会独占一张网卡(被绑定后系统不能正常使用)。在使用VirtualBox安装20.04ubuntu(server)虚拟机_virtualbox环境 ubuntu 18.04 server 虚拟机如何访问虚拟光驱-CSDN博客里面也有进行ssh相关的介绍。


如果网卡不支持多队列,那么我们需要修改网卡配置信息(一定要关机!!!),我们可以在下载ubuntu的目录下找到vmx的文件:

将其进行以下修改:

DPDK需要使用到大页内存,在高并发海量大数据包的场景下,常规的4KB内存页面无法有效承载的,所有我们需要配置大页为2M或者1G,大大降低同等内存条件下的页表项,进而减少页表查询和缺页中断。根据实际需要进行配置,通常在虚拟机的内存不够的情况下,配置2M已经足够。
执行:
sudo /etc/default/grub

default_hugepages=1G hugepagesz=1G hugepages=20
修改之后还需要执行:
sudo update-grub
sudo reboot
接下里我们需要下载并且配置DPDK编译环境。
因为不同版本直接子系统接口会有差异,在这里我们选择dpdk 19.08.2的版本。下载地址:https://core.dpdk.org/download/

下载接下之后进入 dpdk 19.08.2目录:

我们需要设置DPDK环境变量以保证系统可以正确识别。
export RTE_SDK=/home/xiaonie_server_3/code/2.4-dpdk/dpdk-stable-19.08.2 # 指向DPDK的源代码目录
export RTE_TARGET=x86_64-native-linux-gcc # 指向DPDK的编译输出目录,告诉DPDK使用哪个目录下的编译工具链和库
执行:
./usertools/dpdk-setup.sh
一定要在sudo权限执行!!!


编译之前需要有编译环境,以便于dpdk后续编译能够找到对应的编译工具:
sudo apt-get install gcc
sudo apt-get install build-essential
sudo apt-get install libnuma-dev
sudo apt-get install pkg-config
编译完会多出 x86_64-native-linux-gcc 的文件夹。

选择 43 插入 IGB_UIO 模块, 选择网卡为 vmxnet3 会加载此模块。

选择 44 插入 VFIO 模块,安全硬件虚拟化,确保设备只能访问限定内存区域避免程序错误导致系统崩溃。

选择 45 绑定 KNI 模块内核协议栈桥接,做到DPDK仅从硬件收发数据,将数据交由内核无需重构整个网络栈。

选择 46 ,47配置大页,针对两种不同系统(非NUMA/NUMA),配置巨页页数,将指定大小的巨页都分为512页。


选择 49 绑定 IGB UIO模块(在这里需要将eth0网卡down掉)。


出现以上错误就是因为没有down掉网卡,我们需要执行 :
ifconfig eth0 down
关闭 eth0 网卡后,接着再去执行49,可以看到eth0网卡不再出现*Active*标识符。选择绑定网卡,输入对应的NIC号可得绑定成功。

最后选择60退出。到这里配置DPDK编译环境就已经完成。

当我们配置所有的编译环境,我们可以运行DPDK 的案例,我们进入examples/helloworld下进行make,然后执行:
./build/helloworld

表示 DPDK 基础环境正常。
因为在配置的过程中也是遇到了很多的错误,希望大家可以避免错误再次发生,以及发生了该如何得到解决:
原因:没有设置 RTE_SDK 或 RTE_TARGET


解决办法:
sudo ifconfig eth0 sown
本篇文章带你从零创建完整的 DPDK 环境:
DPDK 的核心原理(轮询、PMD、HugePage、多队列)
VMware 下多网卡、多队列配置
HugePage 配置与验证
DPDK 下载、编译、绑定网卡
运行 helloworld 成功验证
全面总结常见错误与解决方案
到这里,你已经拥有一个可以运行 DPDK 应用的基础环境,接下来即可继续开发利用DPDK实现用户态tcp、ip协议栈:请参考我的另一篇博客:DPDK实现用户态tcp、ip协议栈-CSDN社区。