【网络】DPDK的基本原理|DPDK和RDMA的区别

目录

DPDK和RDMA的区别

DPDK

RDMA

总结

DPDK的基本原理

RDMA的基本原理


作者bandaoyu,本文随时更新,原地址:https://blog.csdn.net/bandaoyu/article/details/112588762

DPDK和RDMA的区别结论


相同点:

1)两者均为kernel bypass技术,可以减少中断次数,消除内核态到用户态的内存拷贝;

相异点:

2)DPDK是将协议栈上移到用户态,而RDMA是将协议栈下沉到网卡硬件,DPDK仍然会消耗CPU资源;

3)DPDK的并发度取决于CPU核数,而RDMA的收包速率完全取决于网卡的硬件转发能力

4)DPDK在低负荷场景下会造成CPU的无谓空转,RDMA不存在此问题

5)DPDK用户可获得协议栈的控制权,可自主定制协议栈;RDMA则无法定制协议栈

DPDK是Intel主导,提供了基于用户态的数据链路层的功能,可以在上面构建出基于用户态的网络栈。

解决dpdk空转问题的方法:
dpdk有混合模式,poll长时间没有接收到报文情况下,可以切换到中断模式,等到报文中断到来后又切换回pll模式,往复进行减少CPU资源消耗。


DPDK和RDMA的区别详细

(作者:异客z,链接:https://www.jianshu.com/p/09b4b756b833来源:简书)

DPDK

DPDK网络层:

硬件中断->放弃中断流程;

用户层通过设备映射取包->进入用户层协议栈->逻辑层->业务层;


核心技术:

1)将协议栈上移到用户态,利用UIO技术直接将设备数据映射拷贝到用户态

2)利用大页技术,降低TLB cache miss,提高TLB访问命中率

3)通过CPU亲和性,绑定网卡和线程到固定的core,减少cpu任务切换

4)通过无锁队列,减少资源的竞争


优势:

1)减少中断次数;

2)减少内存拷贝次数

3)绕过linux的协议栈,用户获得协议栈的控制权,能够定制化协议栈以降低复杂度;


劣势:

1)内核栈转移至用户层增加了开发成本

2)低负荷服务器不实用,会造成cpu空转(dpdk有混合模式,poll长时间没有接收到报文情况下,可以切换到中断模式减少CPU资源消耗。)


RDMA

网卡硬件收发包并进行协议栈封装/解析,然后将数据存放到指定内存地址,而不需要CPU干预。


核心技术:

协议栈硬件offload


优势:

1)协议栈offload,解放cpu

2)减少了中断和内存拷贝,降低时延

3)高带宽


劣势:

1)特定网卡才支持,成本开销相对较大;

2)RDMA提供了完全不同于传统网络编程的API,一般需要对现有APP进行改造,引入额外开发成本


总结

相同点:

1)两者均为kernel bypass技术,可以减少中断次数,消除内核态到用户态的内存拷贝;

相异点:

2)DPDK是将协议栈上移到用户态,而RDMA是将协议栈下沉到网卡硬件,DPDK仍然会消耗CPU资源;

3)DPDK的并发度取决于CPU核数,而RDMA的收包速率完全取决于网卡的硬件转发能力

4)DPDK在低负荷场景下会造成CPU的无谓空转,RDMA不存在此问题

5)DPDK用户可获得协议栈的控制权,可自主定制协议栈;RDMA则无法定制协议栈

DPDK是Intel主导,提供了基于用户态的数据链路层的功能,可以在上面构建出基于用户态的网络栈。

DPDK的基本原理

原文:DPDK的基本原理_80后IT老飞侠-CSDN博客_dpdk

网络设备(路由器、交换机、网关等)瞬间进行大量的报文收发,往往有专门的NP(Network Process)处理器(如FPGA或ASIC),高效转发报文,只有需要对报文进行深度处理的时候才需要CPU干涉。

但在很多基础设施以CPU为运算核心,往往不具备专用的NP处理器,操作系统也以通用Linux为主,网络数据包的收发处理路径如下图所示:

在虚拟化环境中,路径则会更长

以CPU为核心的系统,包处理任务存在内核态与用户态的切换,以及多次的内存拷贝,系统消耗变大存在很大的性能瓶颈。为了提升在通用服务器(COTS)的数据包处理效能,Intel推出了服务于IA(Intel Architecture)系统的DPDK技术。

DPDK是Data Plane Development Kit的缩写。运行在操作系统的User Space,利用自身提供的数据面库进行收发包处理,绕过了Linux内核态协议栈,以提升报文处理效率。

DPDK是一组lib库和工具包的集合。最简单的架构描述如下图所示:

上图蓝色部分是DPDK的主要组件(更全面更权威的DPDK架构可以参考Intel官网),简单解释一下:

  • PMD:Pool Mode Driver,轮询模式驱动,通过非中断,以及数据帧进出应用缓冲区内存的零拷贝机制,提高发送/接受数据帧的效率
  • 流分类:Flow Classification,为N元组匹配和LPM(最长前缀匹配)提供优化的查找算法
  • 环队列:Ring Queue,针对单个或多个数据包生产者、单个数据包消费者的出入队列提供无锁机制,有效减少系统开销
  • MBUF缓冲区管理:分配内存创建缓冲区,并通过建立MBUF对象,封装实际数据帧,供应用程序使用
  • EAL:Environment Abstract Layer,环境抽象(适配)层,PMD初始化、CPU内核和DPDK线程配置/绑定、设置HugePage大页内存等系统初始化

这么说可能还有一点点抽象,再总结一下DPDK的核心思想:

  1. 用户态模式的PMD驱动,去除中断,避免内核态和用户态内存拷贝,减少系统开销,从而提升I/O吞吐能力
  2. 用户态有一个好处,一旦程序崩溃,不至于导致内核完蛋,带来更高的健壮性
  3. HugePage,通过更大的内存页(如1G内存页),减少TLB(Translation Lookaside Buffer,即快表) Miss,Miss对报文转发性能影响很大
  4. 多核设备上创建多线程,每个线程绑定到独立的物理核,减少线程调度的开销。同时每个线程对应着独立免锁队列,同样为了降低系统开销
  5. 向量指令集,提升CPU流水线效率,降低内存等待开销

下图简单描述了DPDK的多队列和多线程机制:

DPDK将网卡接收队列分配给某个CPU核,该队列收到的报文都交给该核上的DPDK线程处理。存在两种方式将数据包发送到接收队列之上:

  • RSS(Receive Side Scaling,接收方扩展)机制:根据关键字,比如根据UDP的四元组<srcIP><dstIP><srcPort><dstPort>进行哈希
  • Flow Director机制:可设定根据数据包某些信息进行精确匹配,分配到指定的队列与CPU核

当网络数据包(帧)被网卡接收后,DPDK网卡驱动将其存储在一个高效缓冲区中,并在MBUF缓存中创建MBUF对象与实际网络包相连,对网络包的分析和处理都会基于该MBUF,必要的时候才会访问缓冲区中的实际网络包

以上就是DPDK的基础知识,关于如何在应用程序中使用DPDK,以及系统应该如何针对报文收发的成熟优化方式,后面一边学习与实践,一边记录。

RDMA的基本原理

https://blog.csdn.net/bandaoyu/article/details/111520209

### 使用DPDK实现RDMA #### 方法概述 为了通过DPDK实现RDMA功能,开发者通常会利用基于Verbs接口的库来完成这一过程。该方法允许应用程序绕过操作系统内核直接访问网络硬件资源,从而显著提高通信效率降低延迟。然而,在性能提升的同时也面临着挑战——即单位成本上的优化空间较大,尤其是在提供更高级别的抽象支持工具方面仍有待加强[^1]。 对于具体的开发流程而言,当创建好目标环境后,进入`x86_64-native-linuxapp-gcc`目录即可获取到所有必要的DPDK库文件及其头文件;而位于`build/app`下的`test`与`testpmd`应用则可用于初步验证环境设置是否成功[^2]。 值得注意的是,在实际操作过程中还需要特别关注对SPDK(Storage Performance Development Kit)的支持,因为这有助于进一步增强系统的灵活性并简化复杂度较高的存储协议栈管理任务。此外,考虑到FPGA加速模块的应用场景日益广泛,确保其能够无缝集成至现有体系结构之中同样至关重要[^5]。 #### 示例代码展示 下面给出一段简单的Python伪代码片段作为概念证明: ```python import pyverbs.device as d from dpdk import rte_eth_dev, configure_rdma_connection def setup_dpdk_rdma(): # 初始化设备对象 device = d.Context(name='mlx5_core') # 获取端口信息 port_id = 0 # 配置RDMA连接参数 rdma_params = { 'device': device, 'port_num': port_id, 'qp_type': 'RC', # 可靠连接模式 } try: # 启动RDMA通道 connection = configure_rdma_connection(**rdma_params) print(f"Successfully established RDMA over DPDK using {connection}") except Exception as e: print(e) if __name__ == "__main__": setup_dpdk_rdma() ``` 此段代码仅作为一个基础框架供参考学习之用,并未涉及任何真实业务逻辑的具体实现细节。实际项目中可能需要根据特定需求调整相应部分以满足不同应用场景的要求。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值