DPDK系列之四DPDK整体框架分析说明

news2024/11/17 11:53:35

一、网络发展和DPDK

在上篇分析过网络应用对DPDK出现的影响。而具体体现在技术上,从最简单来看就是从C10K到c100K甚至更多。而相应的计算的发展也从挖掘单CPU的性能发展到了瓶颈,同样,对于网络设备也遇到了类似的问题。而目前解决问题的方法硬件上就是多核多CPU(分布式中多台电脑也可以理解成宏观上的多CPU),而在软件上就是云的虚拟化。
而在原来的网络IO处理路径中,本身就已经较长,再经过虚拟化(含NFV)后,导致整体上的一些辅助工作大消耗了时间,而且过长的路径也会导致更多的意外发生,另外即使在正常的情况下,过长路径也会造成缓存命中失效的可能性大大增加。而学过计算机的人都知道二八原理,缓存命中失效会使得耗费的时间更长。
DPDK针对上面的这些问题,主要解决了IO控制(硬中断和CPU消耗等)、不再通过内核路径(拷贝、上下文切换、锁、过滤、Cache等)。这样,一方面大大提高了IO的处理速度,又解决了路径长所引起的内核瓶颈及相关的意外因素。所以从某种程度上可以理解DPDK是在网卡到用户态绕过了内核直接桥接过去,达成了一个旁路。这其实和实际生活中,如果电路必须过某个复杂的电缆柜,但又不知道内部的情况,直接飞线过去有相通之处(当然,飞线是不好的)。不过在Linux社区上,提供了旁路机制,不过这玩意儿没弄好,所以现在其实就是半死活。至于DPDK和它们的关系和影响,就不得而知了。
传统的网络编程数据流是从:网卡->驱动->协议栈->Socket->应用。
而DPDK则是:网卡->DPDK->DPDK基础库->应用

在这里插入图片描述

有过工程管理管理经验的都知道,路径越长,不可控的风险越大。简单就是王道,这才是王道。

二、技术分析

DPDK的处理网络通信的技术特点主要有:
1、轮询
传统的内核处理一般有两种情况,中断和轮询两种方式。中断的耗时对海量数据传输来说太长了。而使用轮询则可以大幅降低中断引起的上下文开销。
2、用户态驱动
前面提到过,路径越长,需要数据传递的路径越长,就不可避免的产生内存复制和系统调用。而直接到用户态,就避免是大量不必要的数据复制。
3、CPU的亲和性设计
现代计算机几乎很难遇到单核单CPU的机器了,所以如果设置CPU的亲和性,保证Cache的命中率就是一个很好的设计。
4、降低访存开销
TLB(Translation Lookaside Buffer),转译后备缓冲区。DPDK利用大页内存减少TLB的丢失命中并利用内存多通道交错访问提高内存带宽利用率
5、软件优化
这个就比较好理解了,缓冲的行对齐(多线程中的伪共享),数据预读以及批量处理等。

在DPDK中,最显著的部分就是上层的用户态库,它主要分成以下几个部分:
1、核心库(core Libraries)
环境抽象层(EAL)在Linux基础上进行初始化,其中有巨页分配、缓冲区和队列分配、无锁操作、CPU亲和性绑定等。它就是绕过内核的关键,直接通过UIO或VFIO技术将PCI设备地址映射到用户空间。同时,为了更好的处理数据,它还创建了适应环境的内存池、缓冲区管理、内存复制、定时器和环境缓冲等。

2、平台库( platform)
这些个主要是包括KNI、能耗管理 和IVSHMEM接口。KNI主要是用进行内核态和用户态间的协议栈处理。能耗管理主要处理休眠状态和CPU频率等;IVSHMEM则提供了虚拟机内存共享管理机制,包括映射世面为IVSHMEME设备池并传递给QEMU。
3、轮询驱动库
虽然DPDK支持混杂中断驱动,但一般还是用轮询为主。它支持物理和虚拟网卡,随着各大硬件厂商的跟进,目前基本整个行业生态都支持了。
4、QoS库
这个用来做一些辅助服务的,比如一些ACL(通配符匹配),精确匹配什么的,还有一些报文转发如限速(METER)和调度(SCHED)等等。

DPDK高性能实现的代码基础:
1、通过HugePage降低TLB miss
这个其实比较好理解,小的缓冲容易溢出,就容易Miss,大的就次数少很多。而在Linux中把默认的4K提到2M及以上,数量级会下降很多,命中率会提高很多。
2、SNA(Shared-nothing Architecture)
其实就是在并行计算中的分治法,减少全局共享。同时,对NUMA体系下不跨Node远程使用内存。
3、SIMD(Single Instruction Multiple Data)
这个学过计算机体系结构的应该很清楚。DPDK中也尽量利用了这个优势,通过批处理和向量编程来增加单位时间内的数据包处理。
4、使用更先进的库接口
这个其实很简单,就是把普适性的库,有针对的进行完善和修改。包括对一些硬件有针对性的处理。
5、优化编译执行
这个就是比较常见的了,比如分支预测(内核和c++新标准),Cache预取,内存对齐(包括前面提到的伪共享和跨Cache Line),常量优化以及直接调用Cpu指令等等。

这里简单分析一下NUMA,Non Uniform Memory Access,非统一内存访问,它和UMA,Uniform Memory Access,一致性内存访问相对应。其实说的通俗一些就是本地管理和分布式管理的区别。但为了解决分布式管理出现的缓慢和无法访问所有存储器的情况就针对性的提出了NUMA,把存储分为本地存储和远端存储。它的优势在于既兼顾上SMP模式下的系统拷贝和易于管理又继承了分布式(MPP)模式的可扩充性。
另外还一个重要的问题,DPDK毕竟不是一个官方统一的基础库,而一个和硬件、OS版本及相关参数配置有关的一个基础框架。所以在实际部署时也要考虑到这些因素,特别是硬件的支持。一般来说,重点需要处理CPU核心的隔离和中断的转移屏蔽。即使无法完全处理好中断也要尽量减少中断的次数。

三、UIO机制

Linux提供了UIO(https://lwn.net/Articles/232575/)机制即user-space drivers,它可以通过mmap实现和网卡的通信。

在这里插入图片描述

在linux/uio_driver.h有如下的数据结构体定义:

struct uio_info {
char			*name;
char			*version;
struct uio_mem		mem[MAX_UIO_MAPS];
long			irq;
unsigned long		irq_flags;
void			*priv;
irqreturn_t (*handler)(int irq, struct uio_info *dev_info);
int (*mmap)(struct uio_info *info, struct vm_area_struct *vma);
int (*open)(struct uio_info *info, struct inode *inode);
int (*release)(struct uio_info *info, struct inode *inode);
/* Internal stuff omitted * /
};

写过内核驱动的再结合着文档就比较容易写出一个用户态的驱动。具体的方法可以参看相关的技术资料,此处不再赘述。

四、总结

上面把DPDK的相关技术进行了整体的分析,这样就可以从整体上对DPDK的技术栈进行一个认知。从这篇之后,将从两个角度来分析DPDK,一个是应用的角度,如何使用,从分析例程的角度来探究DPDK运行的技术;另外一个角度是从源码的角度,由浅入深的分析相关的源码和上层的应用情况进行结合分析。
作始也简。

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

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

相关文章

MySQL到Elasticsearch实时同步构建数据检索服务的选型与思考[转载]

前言 本文具体探讨 MySQL 数据实时同步到 Elasticsearch (以下简称 ES ) 技术方案和思考,同时使用一定篇幅介绍一些前置知识,从理论到实践,让读者更好的理解这块内容和相关问题。包括: 为什么我们要将数据从 MySQL 实时同步到 ES …

Day899.Join语句优化 -MySQL实战

Join语句优化 Hi,我是阿昌,今天学习记录的是关于Join语句优化的内容。 join 语句的两种算法,分别是 Index Nested-Loop Join(NLJ) 和 Block Nested-Loop Join(BNL)。 发现在使用 NLJ 算法的时候,其实效果还是不错的&#xff0c…

【手把手一起学习】(五) Altium Designer 20 STM32核心板Demo----PCB封装库添加元件

1 PCB封装库添加元件 元件的PCB封装非常重要,关系到实际电子元件能否焊接到制作的电路板上。PCB封装的引脚顺序,引脚间距,焊盘大小,焊盘形状等都需要与元件实物严格对应,因此绘制PCB封装库时,需要参考元件…

在Windows上编译Nginx

《在Windows上编译Nginx》视频教程官方编译说明 Building nginx on the Win32 platform with Visual C 环境准备 1. Microsoft Visual Studio(Microsoft Visual C 编译器),下载地址:https://visualstudio.microsoft.com/zh-hans/。 2. Git(备用)&…

OSS存储使用之centOS系统ossfs挂载

以CentOS7系统为例 下载CentOS系统支持的ossfs工具的版本,以下载CentOS 7.0 (x64)版本为例,可以通过wget命令进行安装包的下载 wget http://gosspublic.alicdn.com/ossfs/ossfs_1.80.6_centos7.0_x86_64.rpm 也可以通过yum命令来进行安装包的下载 sud…

【网络原理9】HTTP响应篇

在前两篇文章当中,已经分别介绍了HTTP是什么,以及常见的请求头当中的属性。【网络原理7】认识HTTP_革凡成圣211的博客-CSDN博客HTTP抓包,Fiddler的使用https://blog.csdn.net/weixin_56738054/article/details/129148515?spm1001.2014.3001.…

excel格式调整:表格应用中格式刷技法汇总

格式刷很简单,点一下,就可以把格式复制到其他单元格、图形、文字上。但是格式刷的用法又不仅仅这么一点,它还可以实现快速隔行填色、隔行隐藏,实现“无损”合并单元格等。在excel中,位于开始菜单中左侧的格式刷&#x…

澜沧古茶再冲刺港交所上市:多项核心指标下滑,杜春峄为董事长

近日,普洱澜沧古茶股份有限公司(下称“澜沧古茶”)向港交所主板提交上市申请,中信建投国际、招商证券国际为其联席保荐人。据贝多财经了解,这已经是澜沧古茶第二次在港交所递表,此前曾于2022年5月30日在港交…

不同方案特性对比

特性对比项 2.4G 蓝牙 868M WIFI 通信速率 低 低 低 高 距离(实用可靠) 20米 10米 30米 15米 确定性 高 低 高 高 可靠性(距离内) 高 低 高 高 刷新一个标签时间(通常) 0.5-1s …

西北工业大学大学物理(I)下2019-2020选填考题解析

单选题12个,24分。1量子数考查前三个量子数由薛定谔方程决定,最后一个关于自旋的由狄拉克方程决定由这些量子数可以给出原子的壳层结构。考试其实考的不深,记住这个表就够了。2 书上18、19章量子物理的著名实验:光电效应&#xff…

如何安装和使用oecp工具?

运行环境:python3>3.7.9、sqlite>v3.7.17 下载安装与部署的要求: install abidiff (centos): yum install -y epel-release; yum install -y libabigail install createrepo: yum install -y createrepo install binutils: yum install -…

【Redis】初探Redis

【Redis】初探Redis 前言 很早之前写的文章,最近考虑到面试可能涉及到Redis,所以拿出来再看一遍 Redis概述 Redis是啥? Redis是Remote Dicitionary Server的缩写,翻译过来就叫做远程字典服务 是开源的、使用C完成的、支持网路…

推荐算法——NCF知识总结代码实现

NCF知识总结代码实现1. NeuralCF 模型的结构1.1 回顾CF和MF1.2 NCF 模型结构1.3 NeuralCF 模型的扩展---双塔模型2. NCF代码实现2.1 tensorflow2.2 pytorchNeuralCF:如何用深度学习改造协同过滤? 随着技术的发展,协同过滤相比深度学习模型的…

学习资料|常用的一些CMD运行命令,整理的比较齐全

CMD命令CMD命令:开始->运行->键入cmd或command(在命令行里可以看到系统版本、文件系统版本)appwiz.cpl:程序和功能calc:启动计算器certmgr.msc:证书管理实用程序charmap&#…

持续集成Jenkins (五)Jenkins API的使用(更新中)

前言目前,我们将要上线DevOps系统,面对未来可能需要对系统的二次开发和处于对系统的深入理解,我需要对Jenkins API有个比较熟悉的了解。在DevOps中,jenkins总是作为其中的一环集成到里面,它提供了几种语言的API,可以很…

如何在Wordpress中使用wp_nav_menu()在<li>及a标记中添加Class

我正在使用wp_nav_menu($args),我想将my_own_classCSS类名添加到<li>元素中以获得以下结果:<li classmy_own_class><a href>Link</a>怎么做&#xff1f;wp_nav_menu()在<li>标记中添加Class方法一&#xff1a;只需使用其他参数并为nav_menu_css_…

熟悉GC常用算法,熟悉常见垃圾收集器,具有实际JVM调优实战经验

程序的栈和堆 栈先进后出&#xff0c;且里面的数据自动释放&#xff0c; 堆内的空间则需要手动释放 java python go 只管创建&#xff0c;不用像c,c需要手动释放空间&#xff0c; 因为他们都会开一个进程GC&#xff08;Garbage Collector&#xff09;&#xff0c;由垃圾回收…

从早吃到晚,才是我对旅行目的地最大的尊重

点击文末“阅读原文”即可收听本期节目剪辑、音频 / 卷圈 编辑 / SandLiu 卷圈 监制 / 姝琦 文案 / 粒粒 封面 / midjourney 产品统筹 / bobo 场地支持 / 声湃轩北京录音间摊牌吧&#xff0c;承认吧&#xff0c;有些地方&#xff0c;你就是冲着吃东西才去的&#xff0c;旅…

【python】main方法教程

嗨害大家好鸭&#xff01; 我是小熊猫~ 首先 if name "main": 可以看成是python程序的入口&#xff0c; 就像java中的main&#xff08;&#xff09;方法&#xff0c; 但不完全正确。 事实上python程序是从上而下逐行运行的&#xff0c; 在.py文件中&#xff0c; 除…

CSS数据类型以及符号

css数据类型定义的是css属性中具有代表性的值&#xff0c;在规范的语法格式中&#xff0c;使用关键字外加一对 <和>表示&#xff0c;例如数值类型<number>、色值类型<color>等。 举个例子&#xff1a;background-image这个css属性语法结构如下&#xff1a; …