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"

相关推荐
tntxia12 小时前
linux curl命令详解_curl详解
linux
扛枪的书生15 小时前
Linux 网络管理器用法速查
linux
顺风尿一寸18 小时前
Java Socket 内核之旅:从 SocketChannel.read() 到 tcp_recvmsg 与 epoll 的完整调用链路
linux
XIAOHEZIcode1 天前
Ubuntu 终端美化全栈指南:Bash 到 Kitty 踩坑实录
linux·ubuntu·命令行
唐青枫1 天前
别再只会用 cron:Linux systemd Timer 定时任务实战详解
linux
AlfredZhao3 天前
生产环境里,为什么不建议把普通端口直接暴露到公网?
linux·https·443·80
戴为沐4 天前
Linux内存扩容指南
linux
zylyehuo4 天前
Linux 彻底且安全地删除文件
linux
用户805533698035 天前
主线 U-Boot 上 RK3506:和闭源 rkbin 拔河的三个隐性契约
linux·嵌入式
用户034095297915 天前
linux fcitx 5 雾凇拼音 设置在中文输入法下仍然输入英文标点
linux