DPDK基础入门(一):认识和理解DPDK

news2024/11/20 19:32:20

Linux的网络瓶颈

以Linux为例,传统网络设备驱动包处理的动作可以概括如下:

  • 数据包到达网卡设备。
  • 网卡设备依据配置进行DMA操作。
  • 网卡发送中断,唤醒处理器。
  • 驱动软件填充读写缓冲区数据结构。
  • 数据报文达到内核协议栈,进行高层处理。
  • 如果最终应用在用户态,数据从内核搬移到用户态。
  • 如果最终应用在内核态,在内核继续进行。

随着网络接口带宽从千兆向万兆迈进,原先每个报文就会触发一个中断,中断带来的开销变得突出,大量数据到来会触发频繁的中断开销,导致系统无法承受,因此有人在Linux内核中引入了NAPI机制(New API)。

在Linux系统中,网络数据包进入计算机后,通常需要经过协议处理(如TCP/IP协议栈)。即使在某些场景下不需要进行协议处理,数据包仍然需要从内核缓冲区复制到用户缓冲区。

将数据包从内核缓冲区复制到用户缓冲区涉及到系统调用和数据拷贝操作。这些操作会消耗CPU资源和时间,影响用户态应用程序从网络设备直接获取数据包的能力。

同时,对于某些网络功能节点(如数据转发节点),并不一定需要完整的TCP/IP协议栈。

Linux中有著名的高性能网络I/O框架Netmap,其减少了内核到用户空间的包复制。

NAPI机制

NAPI机制是一种 “中断 + 轮训” 收包机制。

NAPI 允许网络适配器在短时间内接收多个数据包,并将它们放入一个环形缓冲区中,然后产生一次中断通知CPU。这样可以减少中断的频率,提高系统的处理效率。

当网络适配器进入 NAPI 模式时,它将暂时停止产生中断,直到有足够多的数据包积累在缓冲区中,或者经过一段时间后再产生中断。这样可以减少处理每个数据包所需的中断处理次数。

当CPU处理接收到的数据包时,它会进入软中断上下文,在这个上下文中,CPU可以高效地处理多个网络数据包,从而进一步减少了从用户空间到内核空间的切换开销。

Netmap

Netmap 使用一个共享的环形缓冲区(即数据包池),在内核空间和用户空间之间共享。网络设备的数据包可以直接在内核空间的数据包池中进行处理,而无需立即复制到用户空间。

当用户空间需要处理数据包时,它可以通过映射共享的数据包池来直接访问数据包,而无需进行额外的数据复制操作。这种零拷贝技术显著降低了处理每个数据包时的CPU和内存开销。

Netmap 允许用户空间应用程序通过轮询方式高效地获取和处理数据包,而不是依赖于传统的中断驱动方式。这种方式在高速网络环境中可以显著提高数据包的处理效率和吞吐量。

Netmap没广泛使用。其原因有几个:

  1. Netmap需要驱动的支持,即需要网卡厂商认可这个方案。

  2. Netmap仍然依赖中断通知机制,没完全解决瓶颈。

  3. Netmap更像是几个系统调用,实现用户态直接收发包,功能太过原始,没形成依赖的网络开发框架,社区不完善。

DPDK的基本原理

在这里插入图片描述

左边是原来的方式数据从 网卡 -> 驱动 -> 协议栈 -> Socket接口 -> 业务

右边是DPDK的方式,基于UIO(Userspace I/O)旁路数据。数据从 网卡 -> DPDK轮询模式-> DPDK基础库 -> 业务

用户态的好处是易用开发和维护,灵活性好。并且Crash也不影响内核运行,鲁棒性强。

DPDK支持的CPU体系架构:x86、ARM、PowerPC(PPC)

UIO机制

为了让驱动运行在用户态,Linux提供UIO机制。使用UIO可以通过read感知中断,通过mmap实现和网卡的通讯。

UIO(Userspace I/O)是运行在用户空间的I/O技术。Linux系统中一般的驱动设备都是运行在内核空间,而在用户空间用应用程序调用即可,而UIO则是将驱动的很少一部分运行在内核空间,而在用户空间实现驱动的绝大多数功能

在这里插入图片描述

核心优化 PMD

DPDK的UIO驱动屏蔽了硬件发出中断,然后在用户态采用主动轮询的方式,这种模式被称为PMD(Poll Mode Driver)。

UIO旁路了内核,主动轮询去掉硬中断,DPDK从而可以在用户态做收发包处理。带来Zero Copy、无系统调用的好处,同步处理减少上下文切换带来的Cache Miss。

相对于linux系统传统中断方式,Intel DPDK避免了中断处理、上下文切换、系统调用、数据复制带来的性能上的消耗,大大提升了数据包的处理性能。

运行在PMD的Core会处于用户态CPU100%的状态,网络空闲时CPU长期空转,会带来能耗问题。所以,DPDK推出Interrupt DPDK模式。

在这里插入图片描述

Interrupt DPDK模式可以使用中断模式驱动程序,并且可以和其他进程共享同个CPU Core,但是DPDK进程会有更高调度优先级。

大页内存

Linux操作系统通过查找TLB来实现快速的虚拟地址到物理地址的转化。由于TLB是一块高速缓冲cache,容量比较小,容易发生没有命中。当没有命中的时候,会触发一个中断,然后会访问内存来刷新页表,这样会造成比较大的时延,降低性能。Linux操作系统的页大小只有4K,所以当应用程序占用的内存比较大的时候,会需要较多的页表,开销比较大,而且容易造成未命中。

相比于linux系统的4KB页,Intel DPDK缓冲区管理库提供了Hugepage大页内存,大小有2MB和1GB页面两种,可以得到明显性能的提升,,这样就减少了虚拟页地址到物理页地址的转换时间,也减少了TLB-Miss。

CPU亲和性

随着CPU的核心的数目的增长,Linux的核心间的调度和共享内存争用会严重影响性能。利用Intel DPDK的CPU affinity可以将各个线程绑定到不同的cpu,可以省去来回反复调度带来的性能上的消耗。

在一个多核处理器的机器上,每个CPU核心本身都存在自己的缓存,缓冲区里存放着线程使用的信息。如果线程没有绑定CPU核,那么线程可能被Linux系统调度到其他的CPU上,这样的话,CPU的cache命中率就降低了。

利用CPU的affinity技术,一旦线程绑定到某个CPU后,线程就会一直在指定的CPU上运行,操作系统不会将其调度到其他的CPU上,节省了调度的性能消耗,从而提升了程序执行的效率。

软件调优

比如说有以下几种代码实践:

  • 结构的cache line对齐
  • 数据在多核间访问避免跨cache line共享
  • 适时地预取数据
  • 多元数据批量操作
  • 使用CPU指令直接操作
  • 分支预测,预先做指令读取

DPDK 核心组件

环境抽象层(EAL):为DPDK其他组件和应用程序提供一个屏蔽具体平台特性的统一接口,环境抽象层提供的功能主要有:DPDK加载和启动;支持多核和多线程执行类型;CPU核亲和性处理;原子操作和锁操作接口;时钟参考;PCI总线访问接口;跟踪和调试接口;CPU特性采集接口;中断和告警接口等。

堆内存管理组件(Malloc lib):堆内存管理组件为应用程序提供从大页内存分配对内存的接口。当需要分配大量内存小块时,使用这些接口可以减少TLB缺页。

环缓冲区管理组件(Ring lib):环缓冲区管理组件为应用程序和其他组件提供一个无锁的多生产者多消费者FIFO队列API:Ring。Ring是借鉴了Linux内核kfifo无锁队列,可以无锁出入对,支持多消费/生产者同时出入队。

内存池管理组件(Mem pool lib):为应用程序和其他组件提供分配内存池的接口,内存池是一个由固定大小的多个内存块组成的内存容器,可用于存储相同对象实体,如报文缓存块等。内存池由内存池的名称来唯一标识,它由一个环缓冲区和一组核本地缓存队列组成,每个核从自己的缓存队列分配内存块,当本地缓存队列减少到一定程度时,从内存缓冲区中申请内存块来补充本地队列。

网络报文缓存块管理组件(Mbuf lib):提供应用程序创建和释放用于存储报文信息的缓存块的接口,这些MBUF存储在内存池中。提供两种类型的MBUF,一种用于存储一般信息,一种用于存储报文信息。

定时器组件(Timer lib):提供一些异步周期执行的接口(也可以只执行一次),可以指定某个函数在规定的时间异步的执行,就像LIBC中的timer定时器,但是这里的定时器需要应用程序在主循环中周期调用rte_timer_manage来使定时器得到执行。定时器组件的时间参考来自EAL层提供的时间接口。

DPDK的运行形式

大部分DPDK的代码是以lib的形式运行在用户应用的进程上下文,为了达到更高的性能。应用通常都会多进程或者多线程的形式运行在不同的lcore上

在这里插入图片描述
多进程的场景下,为了保证关键信息(比如内存资源)的一致性, 不同进程会把公共的数据mmap同一个文件,这样任何一个进程对数据的修改都可以影响到其他进程。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1978841.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux中信号的发送及信号的自定义捕捉方法

预备知识: 信号产生时进程早已知道该信号如何处理。 信号产生时进程可能并不能立即处理信号而是等到合适的时候处理。 信号其他相关常见概念 实际执行信号的处理动作称为信号递达(Delivery) 信号从产生到递达之间的状态,称为信号未决(Pending)。 进程可以选择阻…

C语言第14篇

1.以下定义语句中,错误的是________. A) int a[]{1,2}; B) char a{"test"}; C) char s[10]{"test"}; D) int a[]{a,b,c}; 2.以下定义语句中,错误的是________. A) int a[]{1,2}; B) char a[]{…

扬声器、麦克风的等效电路及相关技术参数(灵敏度等)

扬声器、麦克风都是日常我们所需的电子小器件,今天小编来具体讲解一下有关两者的等效电路及相关技术参数。 1、扬声器 等效电路 Re表示扬声器音圈的直流电阻 Le表示音圈的电感,对高频信号产生的阻抗 Mm表示动圈的等效质量,主要影响扬声器的低频响应 Rm 表示动圈…

算力共享:forward_to_next_shard,推断之间的链接

目录 forward_to_next_shard 参数 函数逻辑 _process_prompt StandardNode get_current_shard map_partitions_to_shards forward_to_next_shard 这段代码定义了一个名为 forward_to_next_shard 的异步函数,它是设计用于在分布式模型或数据处理系统中的节点(或称为“分…

【秋招笔试】2024-08-03-科大讯飞秋招笔试题(算法岗)-三语言题解(CPP/Python/Java)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 编程一对一辅导 ✨ 本系列打算持续跟新 秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍖 本次题目难度中等偏上,最后一题又是…

dfs深搜

Problem - C - Codeforces 无向图,判断是否是子叶.

Co-Detr

参考:https://www.bilibili.com/video/BV1Sh4y1F7ur/?spm_id_from333.788&vd_source156234c72054035c149dcb072202e6be 之前的detr正样本数量少,匹配不平衡。 主要修改两个地方:encoder和decoder。 1.在encoder之后加入RPN,a…

深入理解接口测试:实用指南与最佳实践(二)API文档解析HTTP协议

​ ​ 您好,我是程序员小羊! 前言 这一阶段是接口测试的学习,我们接下来的讲解都是使用Postman这款工具,当然呢Postman是现在一款非常流行的接口调试工具,它使用简单,而且功能也很强大。不仅测试人员会使用…

Leetcode75-3 拥有最多糖果的孩子

题目很简单,逻辑就是找到最大值 然后做个比较看看每个值加上extra能不能超过或者等于最大值。 两个知识点遗忘 数组length 获取数组的长度的格式: 数组名称。length 这将会得到一个int数字,代表数组的长度。 数组一旦创建,程…

Effective-Java-Chapter2

https://github.com/clxering/Effective-Java-3rd-edition-Chinese-English-bilingual/blob/dev/ 准则一 考虑以静态工厂方法代替构造函数 优点 静态工厂方法与构造函数相比的第一个优点,静态工厂方法有确切名称。 知名见意,静态方法我们可以通过命名…

编程新手到大师:大学生学编程的高效学习路径

​​​​​​​ 目录 ​​​​​​​​​​​​​​ 编程新手到大师:大学生学编程的高效学习路径 编程小白如何成为大神?大学新生的最佳入门攻略 一、确定学习目标 1.1、我接受想贯彻互联网思维的洗礼 1.2、我想提升在专业中的竞争力 1.3、我觉得…

(STM32笔记)九、RCC时钟树与时钟 第三部分

我用的是正点的STM32F103来进行学习,板子和教程是野火的指南者。 之后的这个系列笔记开头未标明的话,用的也是这个板子和教程。 九、RCC时钟树与时钟 九、RCC时钟树与时钟3、使用固件库的函数来配置时钟bsp_rccclkconfig.c思路配置HSE时钟把RCC寄存器复位…

OpenCV Python 图像相加与透明色转换

将两幅图添加起来,构成一幅新的图像,并尝试将一个PNG的透明背景转换为特定的颜色。 生成纯背景 以下代码生成一个纯色背景JPG,颜色为照片底板的蓝(R:60 G:140 B:220)。在用OpenCV创建图像时,颜色按BGR。 …

必须知道的国内linux镜像下载网址,建议收藏

linux镜像下载 一、阿里云开源镜像站下载可用的镜像 二、网易开源镜像下载可用的镜像 三、搜狐开源镜像下载可用的镜像 一、阿里云开源镜像站下载 https://developer.aliyun.com/mirror/ 阿里云开源镜像站是阿里云提供的一个公共服务,旨在为开发者提供快速、稳定…

4. 最长公共前缀

4. 最长公共前缀 题目题目分析 题目 题目分析 首先要对字符串数组进行分析,字符串数组元素的最长公共前缀肯定不会超过最小元素长度,并如存在公共前缀则需遍历整个字符串元素,有点像二维数组,最后加上截取字符串加上判空操作就完…

apache一台服务器如何通过不同端口映射不同网页服务入口

一、背景 由于服务器资源受限(IP资源或硬件资源),有时候希望一台服务器IP能有部署多个网页服务入口。 传统都是80端口映射为默认服务入口,当需要部署多个网页服务入口时,可以启用其他端口,不同端口映射到…

Javascript常见算法详解

在JavaScript(JS)中,常见的算法涵盖了多个领域,从基础的数组操作到更复杂的排序、搜索和数据结构算法。下面是一些在JS中常见的算法示例: 1. 排序算法 Java排序算法-CSDN博客 冒泡排序(Bubble Sort&#x…

【C++从小白到大牛】多态那些事儿(上)

一、多态的概念 1.1概念: 通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。 二、 多态的定义及实现 2.1多态的构成条件 多态是在不同继承关系的类对象,去调用同一函数,产…

flutter开发windows应用程序(.exe)配置环境搭建 以及 visual studio配置flutter windows所需环境

flutter 开发 windows 应用程序(.exe)配置环境搭建 安装 android studio 开发工具 并配置相关所需环境 参考该文章:我还没写完你上百度上搜一下吧我帮你付钱了😂 控制台运行 flutter doctor 命令 查看当前 flutter 开发环境 报…

傅里叶级数的数学描述

目录 概述 1 傅里叶级数 1.1 概念 1.2 表示形式 2 傅里叶变换 2.1 概念 2.2 数学描述 2.3 应用 3 傅里叶级数的数学推论 3.1 三角函数的正交性 3.1.1 正交性介绍 3.1.2 正交性证明 3.1.3 相同函数乘积积分 3.2 理论介绍 3.3 傅里叶级数的表述 概述 傅里叶级数是…