DPDK的原理以及环境搭建

小捏哩 2025-12-01 18:25:51

目录

1. 什么是DPDK?

2. DPDK 想解决什么问题

3. DPDK的原理

4. DPDK的使用场景

5. 确认网卡信息以及添加修改网卡

5.1 确认网卡信息

5.2 添加网卡(两块及以上)

5.3 修改网卡配置信息

6. 配置HugePage大页

7. 下载并且配置DPDK编译环境

7.1 下载DPDK源码

7.2 设置DPDK环境变量

7.3 配置DPDK编译环境

7.4 运行 DPDK 案例

8. 常见错误

8.1 没有设置环境

8.2 绑定网卡失败

9. 总结


前言:

我这里是使用的vmware 结合Ubuntu 20.04 的Server 版本,相信大家在虚拟机配置环境已经没有问题了:当然也可以参考我这篇在virtualbox配置Ubuntu 20.04 的Server 版本的文章使用VirtualBox安装20.04ubuntu(server)虚拟机_virtualbox环境 ubuntu 18.04 server 虚拟机如何访问虚拟光驱-CSDN博客

1. 什么是DPDK?

DPDK(Data Plane Development Kit,数据平面开发套件)是INTEL公司开发的一款高性能的网络驱动组件,旨在为数据面应用程序提供一个简单方便的,完整的,快速的数据包处理解决方案,主要技术有用户态、轮询取代中断、零拷贝、网卡RSS、访存DirectIO等

2. DPDK 想解决什么问题

传统网络包处理有 3 个性能瓶颈:

瓶颈说明
频繁中断网卡接收一个包就触发一次中断,CPU 被频繁打断
用户态与内核态切换网络包需要在内核协议栈和用户态应用之间拷贝
内存页太小大量使用 4KB 页面导致 TLB Miss,降低吞吐

DPDK 就是为解决这些问题而生。

3. DPDK的原理

DPDK(数据平面开发套件)的原理是通过优化网络数据处理流程,提高CPU处理网络数据包的效率。其核心原理包括以下几个方面:

  1. 轮询模式代替中断:传统网络处理中,网卡每收到一个数据包就会发送中断通知CPU,导致CPU频繁被中断打断。DPDK采用轮询模式,让CPU按固定频率主动检查网卡缓冲区,一次性处理多个数据包,大幅减少中断开销。

  2. 用户态驱动:DPDK使用用户态驱动(如PMD,轮询模式驱动)直接与网卡交互,数据包无需经过内核态处理,避免了内核态与用户态之间的切换开销,减少了协议栈处理的延迟

  3. 大页内存DPDK使用2MB或1GB的大页内存代替传统的4KB小页内存,将数据包缓冲区集中存储在大页中,减少了CPU访问内存时的页表切换次数,提高了内存访问效率。

4. DPDK的使用场景

DPDK主要适用于以下场景:

  1. 数据中心高性能应用:如云服务器的虚拟交换机(OVS)、负载均衡器(LB)等需要处理大量网络流量的场景。使用DPDK后,单台服务器的转发能力可以从10G提升到100G,显著降低成本。

  2. 5G核心网:5G网络对延迟要求极高(如自动驾驶需要10ms内响应)。DPDK通过减少中断和内存拷贝,能将网络处理延迟从传统的几十微秒降低到几微秒,满足实时性要求。

  3. 高频交易系统:在股票、期货等高频交易中,网络延迟直接影响交易收益。DPDK配合FPGA或智能网卡,能将交易指令的网络处理时间压缩到微秒级,成为"抢跑神器"。

 

5. 确认网卡信息以及添加修改网卡

首先需要确认我们虚拟机的网卡是否支持多队列,DPDK需要多队列网卡。

5.1 确认网卡信息

使用命令:

cat /proc/interrupts | grep eth0

我的网卡名字是eth0,大家都可能是enss33或者其他的,大家可以进行修改,参考这个博主的修改方式:Linux之手把手教会修改网卡名称_linux修改网卡名称-CSDN博客

5.2 添加网卡(两块及以上)

当然,我们可以绑定一张网卡给DPDK使用,那么我们需要另外一张网卡进行ssh连接方便进行编程使用,因为DPDK 会独占一张网卡(被绑定后系统不能正常使用)。在使用VirtualBox安装20.04ubuntu(server)虚拟机_virtualbox环境 ubuntu 18.04 server 虚拟机如何访问虚拟光驱-CSDN博客里面也有进行ssh相关的介绍。

 

5.3 修改网卡配置信息

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

将其进行以下修改:

6. 配置HugePage大页

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

执行:

sudo /etc/default/grub

default_hugepages=1G hugepagesz=1G hugepages=20

修改之后还需要执行:

sudo update-grub

sudo reboot

 

7. 下载并且配置DPDK编译环境

接下里我们需要下载并且配置DPDK编译环境。

7.1 下载DPDK源码

因为不同版本直接子系统接口会有差异,在这里我们选择dpdk 19.08.2的版本。下载地址:https://core.dpdk.org/download/

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

7.2 设置DPDK环境变量

我们需要设置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使用哪个目录下的编译工具链和库

7.3 配置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编译环境就已经完成。

7.4 运行 DPDK 案例

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

./build/helloworld

表示 DPDK 基础环境正常。

8. 常见错误

因为在配置的过程中也是遇到了很多的错误,希望大家可以避免错误再次发生,以及发生了该如何得到解决:

8.1 没有设置环境

原因:没有设置 RTE_SDK 或 RTE_TARGET

8.2 绑定网卡失败

解决办法:

sudo ifconfig eth0 sown

9. 总结

本篇文章带你从零创建完整的 DPDK 环境:

  1. DPDK 的核心原理(轮询、PMD、HugePage、多队列)

  2. VMware 下多网卡、多队列配置

  3. HugePage 配置与验证

  4. DPDK 下载、编译、绑定网卡

  5. 运行 helloworld 成功验证

  6. 全面总结常见错误与解决方案

到这里,你已经拥有一个可以运行 DPDK 应用的基础环境,接下来即可继续开发利用DPDK实现用户态tcp、ip协议栈请参考我的另一篇博客:DPDK实现用户态tcp、ip协议栈-CSDN社区

欢迎:https://github.com/0voice

...全文
37 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

523

社区成员

发帖
与我相关
我的任务
社区描述
零声学院,目前拥有上千名C/C++开发者,我们致力将我们的学员组织起来,打造一个开发者学习交流技术的社区圈子。
nginx中间件后端 企业社区
社区管理员
  • Linux技术狂
  • Yttsam
  • 零声教育-晚晚
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

请新加入的VIP学员,先将自己参加活动的【所有文章】,同步至社区:

【内容管理】-【同步至社区-【零声开发者社区】

试试用AI创作助手写篇文章吧