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"

相关推荐
lead520lyq3 分钟前
Golang GPRC流式传输案例
服务器·开发语言·golang
饺子大魔王的男人3 分钟前
告别服务器失联!Prometheus+Alertmanager+cpolar 让监控告警不局限于内网
运维·服务器·prometheus
吉普赛的歌4 分钟前
【服务器】为安全考虑,已锁定该用户帐户,原因是登录尝试或密码更。改尝试过多。请稍候片刻再重试,或与系统管理员或技术支持联系。
运维·服务器·安全
m0_737302584 分钟前
腾讯云TDSQL-C+CVM软硬协同,数据库性能三倍跃升
服务器
Fᴏʀ ʏ꯭ᴏ꯭ᴜ꯭.5 分钟前
Keepalived高可用配置指南
服务器·网络·php
掘根7 分钟前
【jsonRpc项目】Registry-Discovery模块
运维·服务器·数据库
图扑可视化8 分钟前
HT 技术实现数字孪生智慧服务器信息安全监控平台
服务器·信息可视化·数字孪生·三维可视化
wdfk_prog12 分钟前
[Linux]学习笔记系列 -- [drivers][dma]dma-buf
linux·笔记·学习
j_xxx404_14 分钟前
Linux:进程优先级与进程切换与调度
linux·运维·服务器
never_go_away19 分钟前
linux Socket限制
linux·运维·服务器