Dpdk介绍

Dpdk绕过了Linux内核态协议栈,以提升报文处理效率。直接截获网卡的原始数据,让用户自行处理,解析协议等等。

网卡是将数字信号与模拟信号进行转换的设备。

可用作:防火墙、测试工具、CDN(对网络要求比较高的场景都可以使用)

特点:

1. 用户态驱动(PMD:Poll Mode Driver)

传统网卡驱动运行在内核态,DPDK使用轮询模式驱动(PMD) 替代中断模式:

应用程序直接调用PMD API,主动轮询网卡接收队列(Rx Queue),而非等待网卡中断通知;

避免了"中断风暴"(大量数据包到来时的频繁中断处理开销),同时消除了内核态到用户态的上下文切换。

2. 大页内存(HugePages)

默认Linux内存页大小为4KB,DPDK要求使用2MB/1GB的大页内存

减少TLB( Translation Lookaside Buffer,地址转换缓存)的缺失率,加速虚拟地址到物理地址的转换,提高吞吐量;

降低内存管理开销,提升内存访问效率。

3. 零拷贝(Zero-Copy)

传统流程中数据包需从"网卡DMA缓冲区→内核缓冲区→用户缓冲区"三次拷贝,DPDK通过以下方式实现零拷贝:

网卡直接通过DMA将数据写入用户态预先分配的大页内存缓冲区

应用程序直接从该缓冲区读取数据,无需中间拷贝。

4. CPU亲和性(CPU Affinity)

将DPDK线程绑定到特定的CPU核心(Core Affinity):

避免线程在不同核心间迁移导致的缓存失效(Cache Miss);

充分利用多核CPU的并行处理能力,实现"每个核心处理一个队列"的高效模型。

5. 无锁队列与环形缓冲区(Ring Buffer)

DPDK提供多生产者-多消费者(MPMC)的无锁环形队列,用于线程间或组件间的数据传递:

基于原子操作实现同步,避免锁竞争的开销;

高效支持高并发场景下的数据包流转。

DPDK适用于对网络性能、延迟、吞吐量要求极高的场景。(云计算,高性能计算,网络安全等)

DPDK可以只处理特点的协议,然后将其他的协议再写回协议栈,继续使用内核的协议栈进行解析。

UDPDPDK最擅长的协议之一

UDP是无连接、轻量的传输层协议,无需三次握手、重传机制,天生适合低延迟场景。DPDK可直接在用户态解析UDP头部,快速提取数据(如游戏、直播、金融行情的UDP数据包)。

TCP :虽然TCP比UDP复杂(需处理连接、重传、拥塞控制),但DPDK也支持TCP的用户态实现(如librte_net_tcp库),用于高性能TCP代理、负载均衡等场景。

DPDK的接收发送队列怎么理解?好像有8个接口

DPDK中,队列是网卡与应用程序之间传递数据包的"缓冲区通道"

接收队列(Rx Queue):网卡将收到的数据包存入队列,应用程序从队列中读取并处理;

发送队列(Tx Queue):应用程序将待发送的数据包放入队列,网卡从队列中取出并发送到网络。

每个队列对应一组内存缓冲区(通常是DPDK预分配的大页内存),数据包在队列中以"指针"形式存在(避免拷贝),实现高效流转。

每一个物理接口有8个队列,有的会支持16、32队列。

多队列优势:

  1. 多核并行处理。
  2. 低延迟
  3. 高可靠。

大小端的处理是什么情况?

大小端是"多字节数据的存储顺序"问题,网络协议用大端,x86主机用小端;DPDK必须处理大小端转换,否则会解析错误网络数据包;DDK提供rte_byteorder.h中的函数,使用时只需调用对应函数即可。

基于DPDK实现eth、ip、udp、tcp协议;基于DPDK实现dns server都可以写在简历中。

环境配置

cd ~/share/dpdk/dpdk-stable-19.08.2

sudo su

exportRTE_SDK=/home/king/share/dpdk/dpdk-stable-19.08.2/

export RTE_TARGET=x86_64-native-linux-gcc

ifconfig eth0

ifconfig eth0 down

./usertools/dpdk-setup.sh

依次输入:43、44 、45、46(512)、47(512)、49(eth0 地址)、60

环境准备就绪,eth0已经被dpdk接管,使用命令ifconfig -a也看不到eth0

重启后cd ~/share/dpdk/dpdk-stable-19.08.2

ifconfig

再次配置一下,只需要43 44 49即可

然后返回代码目录

更改Makefile里的参数SRCS-y := ustack_01_re.c

make

sudo ./build/ustack

Windows配置

Windows shell:

arp -a

netsh i i show in

netsh -c i i add neighbors 19 172.xx.xx.xx 00-0c-xx-xx-xx-xx

netsh -c i i add neighbors 19 10.xx.xx.xx 00-0c-xx-xx-xx-xx

172.xx.xx.xx(eth0的IP地址) 00-0c-xx-xx-xx-xx(eth0的Mask地址)

报错" Cannot use IOVA as 'PA' since physical addresses are not available"

Debug:

没有权限,执行文件前加sudo

卡在这一个多小时,如果直接将上面句话百度,就可以解决。但我问了Ai,给出"./build/ustack -l 0-7 --iova-mode=va",然后报错 巨页 设置有问题,改巨页的问题改了一个多小时,还恢复了快照!!!

虚拟机配置

使用DPDK时, 一定要支持多队列网卡,所修改的 zerovoice.vmx中的vmxnet3 就是为了支持多队列网卡。

添加:

ethernet0.virtualDev = "vmxnet3"

ethernet0.wakeOnPcktRcv = "TRUE"

拟机配置

使用DPDK时, 一定要支持多队列网卡,所修改的 zerovoice.vmx中的vmxnet3 就是为了支持多队列网卡。

添加:

ethernet0.virtualDev = "vmxnet3"

ethernet0.wakeOnPcktRcv = "TRUE"

相关推荐
哈基咪怎么可能是AI6 小时前
为什么我就想要「线性历史 + Signed Commits」GitHub 却把我当猴耍 🤬🎙️
linux·github
十日十行1 天前
Linux和window共享文件夹
linux
Sinclair1 天前
简单几步,安卓手机秒变服务器,安装 CMS 程序
android·服务器
木心月转码ing1 天前
WSL+Cpp开发环境配置
linux
Rockbean2 天前
用40行代码搭建自己的无服务器OCR
服务器·python·deepseek
茶杯梦轩2 天前
CompletableFuture 在 项目实战 中 创建异步任务 的核心优势及使用场景
服务器·后端·面试
崔小汤呀2 天前
最全的docker安装笔记,包含CentOS和Ubuntu
linux·后端
何中应2 天前
vi编辑器使用
linux·后端·操作系统
何中应2 天前
Linux进程无法被kill
linux·后端·操作系统
何中应2 天前
rm-rf /命令操作介绍
linux·后端·操作系统