超全的DPDK入门指南
Linux开发架构之路 2024-07-22

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开发工程师

适合人群:




声明: 本文转载自其它媒体或授权刊载,目的在于信息传递,并不代表本站赞同其观点和对其真实性负责,如有新闻稿件和图片作品的内容、版权以及其它问题的,请联系我们及时删除。(联系我们,邮箱:evan.li@aspencore.com )
0
评论
  • 【7.24 深圳】2025国际AI+IoT生态发展大会/2025全球 MCU及嵌入式技术论坛


  • 相关技术文库
  • RF
  • 射频
  • 通信
  • 无线
下载排行榜
更多
评测报告
更多
广告