DPDK(Data Plane Development Kit)是一个框架,用于快速报文处理。
在linux内核提供的报文处理模型中,接收报文的处理路径为:首先由网卡硬件接收,产生硬中断,触发网卡驱动程序注册的中断函数处理,之后产生软中断,触发协议栈注册的中断处理函数,之后则交给协议栈处理,如果报文最终目的是本机应用层,则需要从内核拷贝至用户程序;发送报文的处理路径为:应用层封装后逐层调用协议栈的报文封装函数,并添加到网卡的发送队列中,最终由网卡发送出去。
在这一内核模型中,最常遇到的瓶颈是中断,中断的开销使得报文处理所需的时钟周期大幅提升,这意味着,流量大的情况下cpu将很快被占满。除此之外,I/O效率、内存访问效率,也是性能限制因素。此外,在报文输入/输出的情况下,报文需要从内核拷贝到用户态,或者是由用户态拷贝到内核,也是性能瓶颈之一。
为了解决上述问题,涌现了许多的解决方案。比如硬件转发,硬件转发的本质就是在网卡上实现报文的转发功能,cpu不用于转发计算,因此cpu就不会成为转发性能瓶颈,并且硬件的处理效率远高于软件,它的缺点也很明显,硬件不容易编程。基于软件的解决方案也有不少,比较著名的如tc、xdp、dpdk,tc、xdp主要用于流量控制,它们类似于netfilter框架中的钩子,可以在比较靠前的位置处理报文,在面对DDoS攻击的情况下,二者可以通过丢包的方式避免报文进入内核,因此提高了DDoS防御能力,此外XDP可以通过选择性地让报文跳过部分内核处理,因此提高报文的处理效率。总的来说,二者的做法都是跳过内核协议栈的处理,因此提高报文处理效率,但是可以执行的操作都比较受限,并且无法改变网卡的I/0方式(中断/轮询)。XDP提供的功能更多一些,但要编写一个符合内核规范的XDP程序可不太容易,开发的进度比较容易受限。
DPDK所作的事情更多一些,它可以使用轮询取代中断,这样的好处是在高数据量的时候报文处理更加高效,坏处是CPU每时每刻都被占用 100% ,除报文处理外的其他工作可能会受影响。不过,现代计算机大多都是多核结构,即使路由器、交换机等嵌入式设备也是如此,因此,某一个核一直被使用也不是多么不能接受的事情了。此外,DPDK实际可以在应用程序中随时启用/禁用网卡的中断,因此可以在流量较小时使用中断的方式处理报文。
此外,通过用户态驱动程序,DPDK可以直接将网卡的I/O地址映射到用户态,使得用户态程序可以直接读取网卡中的数据包而无需经过内核-用户态拷贝过程。
并且,在内存方面,DPDK可以通过分配大页内存,减少快表MISS的可能性,并支持NUMA架构下内存的读取优化。在CPU方面,DPDK可以将报文处理限制在特定核心,以减少线程调度的消耗。最后,DPDK对缓存也进行了优化。
DPDK所作的一切事情,都是通过库的方式提供的,可以说,DPDK本质上就是一堆库。比较重要的库有:rte_eal、libc、rte_debug、rte_malloc、rte_timer、rte_mempool、rte_ring、rte_mbuf等。它们的功能及引用关系如下图:(此图为DPDK官方文档copy过来)
其中,rte_eal是对硬件的抽象,包括网卡、cpu、内存等,rte_mbuf、rte_mempool、rte_ring是首先接收/发送队列所必须的库,所提供的无锁环形队列也是报文处理性能提升点之一。其他的库则如名字所示,提供一些基础功能。
使用DPDK构建自己的数据平面,必须依赖于DPDK提供的这些库,当然,对于不同的DPDK程序,所需要的库也是不同的。
简单学习DPDK,就是了解这些库的用法,并用它们构建一个DPDK程序以满足需求。更深入地学习,则要深入了解这些库的具体实现,理解性能优化点,提高纠错排错的能力。
想要学习或者正在学习dpdk的朋友,这里可以先领取一份dpdk的学习资料(入坑不亏)
DPDK的学习路线
这里给大家推荐零声教育的dpdk/spdk 技术专家成长体系课程,通过32个项目案例, 2W+行手写代码,全面解析4个dpdk技术方向。
1. DPDK网络
1.1 dpdk基础知识
-
多队列网卡,vmxnet/e1000
-
igb_ uio与vfio模块
-
kni模块
-
hugepage的理解
-
零拷贝
-
dpdk与netmap区别
-
dpdk的工作环境
1.2 网络协议栈
-
dpdk- -arp
-
netsh静态arp表设置
-
dpdk- icmp
-
dpdk- -udp
-
udp协议格式分析
-
udp协议sendto,recvfrom实 现
-
dpdk-ip
-
dpdk- tcp
-
tcp协议栈bind, listen, accept实 现
-
tcp协议权recv,send, close的实 现
-
tcp三次握手实现
-
tcp四次挥手实现
-
tcp acknum与seqnum的确认机制实现
-
tcp的并发连接设计
-
epoll并发的实现
-
tcp协议栈与epoll之间的回调实现
1.3 DPDK组件项目
-
dpdk-acl
-
dpdk- kni
-
-/dev/kni 的原理分析
-
kni_ dev的流程
-
kni的tx缓冲区,rx缓冲区
-
kni的用户空间与内核空间映射
-
mbuf如何转化为kernel的sk_ buff
-
dpdk- t imer
-
bpftrace的使用
-
dpdk-bpf源码流程
1.4 DPDK经典项目
-
dpdk-dns
-
dpdk-gateway
-
dpdk- ddos熵计算源码
-
dos-attach检测精确度调试
-
ddos attach测试工具hping3
-
布谷鸟hash原理与使用
2. 存储
2.1 高效磁盘io读写spdk(C)
-
存储框架spdk, 为技术栈打开一扇存储的大门
-
spdk运行环境与vhost
-
NVMe与PCI的关系
-
手把手实现spdk_ server
-
nvme与pcie以及手写nvme读写操作
-
bdev与blob之间的关系
-
实现blob异步读写
-
blobstore的读写操作实现与rpc的关系
-
fio性能测试性能对比libaio, io_ uring, psync
-
fio plugin工作流程
-
fio plugin开发
2.2 SPDK文件系统实现
-
文件系统功能拆解
-
spdk_env_init与spdk_app_init的差别
-
spdk_thread_poll实现rpc回调
-
fs_operations结构体定义
-
file_operations结构体定义
-
dir _operations结构体定又
-
syscall的hook实现
-
io内存管理
-
基数树对文件系统内存管理
-
spdk_blob的open, read, write, close
-
测试用例与调试入口函数
2.3 SPDK KV存储的实现
-
KV存储拆解Set, Get, Mod, Del
-
app/.a库/.so库 对于kv存储的选择
-
bdev与blob对于kv存储的选择
-
kv service启动blob资源操作
-
kv service关闭blob资源回收
-
kv service接口 set, get, modify, delete
-
kv遍历与查找实现
-
page存储chunk的管理
-
pagechunk的get与put
-
page单查找与多页查找
-
btree, artree, hashmap, radixtree. rbtree之间的选择
-
slab的实现
-
slab分配slot与释放slot
-
为kv加上conf文件
-
测试用例与性能测试
3. 安全与网关开发
3.1 可扩展的矢量数据包处理框架vpp (c/c++)
-
vpp 命令详解
-
mac/ip转发plugin
-
load_ balance plugin
-
flowtable plugin
-
vpp源码
-
多网卡数据接收与转发
-
解决plugin编译加载
-
vpp启动load so的流程
-
vpp的结构体vlib_main
-
vpp的结构体vnet_main
-
vector的操作实现
-
vpp vcl库与LD_PRELOAD
-
vc|原理讲解
-
vcl tcpserver 实现原理
-
vcl tcpclient实现原理
-
vcl与iperf3的客户端与服务器
-
vcl与nginx的wrk性能测试
-
vcl与haproxy的性能测试
-
vpp 1801版本与vpp 2206版本之间的差异
-
vpp httpserver 的实现源码
-
vpp plugin quic源码分析
-
vpp plugin hs_app的源码实现分析
-
vpp plugin rdma的实现分析
-
vpp plugin loadbalance 实现分析
-
vpp plugin nat的源码分析
-
vpp host-stack tcp协议实现
-
vpp plugin的测试用例实现
3.2 golang的网络开发框架nff -go (golang)
-
nff-go实现的技术原理
-
nff-go/low. h实现分析
-
nff-go数据接收的实现
-
nff-go数据发送的实现
-
ipsec协议解析与strongswan的ipsec
-
nff-go的缺陷与不足
4. 虚拟化与云原生
4.1 DPDK的虚拟交换机框架OvS
-
ovs编译安装,ovs核心组件内容
-
ovs-vswitchd的工作原理
-
ovs-vswitchd与dpdk的关系
-
ovs-vsctl的网桥,网口操作
-
qemu-systemr -x86_64构建多子网
-
ovs与qemu数据流分发
-
ovs搭建docker跨主机道信
-
ovsdb-server与ovsdb协议
-
json-rpc为控制面提供开发
-
ovs-tcpdump/ovs- l3ping
-
OvS 4种数据路径
-
VXLAN数据协议
-
ovs流量统计
4.2 高性能4层负载均衡器 DPVS
-
dpvs的技术组件与功能边界
-
lvs+keepalived配置高可用server
-
dpvs与lvs+keepalived的关系
-
dpvs.conf的配置文件
-
dpvs的FNat/NAT/SNAT模式
-
dpvs的DR模式
-
dpvs的tun模式
-
通过quagga配置ospf
-
dpvs的tc流控操作与源码实现
-
dpvs代码架构分析
-
dpvs测试用例ipset, tc, mempool
5. 测试工具
5.1 perf3
-
Vpp vcl的perf3接口hook
-
perf3测网络带宽
-
tcp吞吐量测试
-
udp丢包与延迟测试
-
json测试结莱输出
5.2 TRex
-
TRex的运行原理
-
TRex与dpdk
-
构建TRex测试系统
-
t-rex-64-debug-gdb调试
-
bg-sim-64模拟单元测试
-
YAML文件编写
-
流编排与自动化框架
-
报文变量设置
5.3 dpdk- pktgen
-
pktgen命令讲解
-
default. cfg配置文件分析
-
120M bits/s的转发速率
5.4 fio
-
ioengine的实现
-
ioengine_ops的分 析
-
iodepth的分析
-
spdk_nvme的fio分析
-
spdk_bdev的fio分析
-
spdk_blob的ioengine实现
-
psync, io_uring, libaio性能对比
6. 性能测试
6.1 性能指标
-
吞吐量bps
-
拆链/建链pps
-
并发
-
最大时延
-
最小时延
-
平均时延
-
负载
-
包速fps
-
丢包率
6.2 测试方法
-
测试用例
-
Vpp sandbox
-
perf3灌包
-
rfc2544
以上就是dpdk/spdk 技术专家成长体系课程的所有内容,想要学习dpdk/spdk的小伙伴扫描下方二维码领取大额优惠
学习后可从事研发岗位:
-
高级网络开发工程师
-
DPDK开发工程师
-
产品研发工程师
-
云基础开发工程师
-
高性能优化工程师
-
SDN开发工程师
-
NFV开发工程师
适合人群: