DPDK系列之十九DPDK内存管理介绍

一、DPDK中的内存介绍

一般来说,做为软件平台或者框架,要么直接应用OS(或者一些公认的标准库)的内存管理,简单方便,但可能不太尽如人意;要么就得自己搞一套内存管理系统。而自己搞内存管理系统一般又有两类,一种是在原来OS内存管理系统的前提下,再抽象一层,为自己的框架所用,另外一种就比较狠了,直接修改底层(OS或者标准库)的内存管理系统。
正常情况下,绝大数应用的开发都是第一大类,没人愿意搞内存管理。底层的框架或者一些大的平台软件愿意自己处理一下内存管理,但多数是再抽象一层。但是到了OS或者虚拟机,基本都会自己得写内存管理的手段和方法。在操作系统原理中,对内存管理的算法都有学习过,网上也有很多相关书籍这里不再展开。
上面说这么多,目的是为引入下面的话。DPDK,做为一个开发套件,一定会自己对内存管理进行处理。但是它与上面的都有不同,一是它确实是对现有内存管理的一种抽象,但它又节省了传统的内存处理的一些流程(使用了DIDO),特别是在虚拟设备中;另外,它对大页和NUMA的内存处理也进行了优化。最后其对IO的IOMMU重新抽象后直接供上层应用,只不过IOMMU不同于MMU为CPU所用而为被设备使用。
同样,对内存管理涉及到的Cache,对齐技术以及DMA这些已有的技术也不做重点分析,只在用到时带一下,如果有需要的翻阅一下相关的书籍或者网上查找一下资料。
DPDK的老版本(17)和新版本(18)之间,内存的管理有着很大的不同,老版本的内存映射是静态的,而新版本的是动态的,同时其也支持外部内存。老版本IOVA中,VA的地址是连续的,但新版本是不保证的或者说二者已经不再有严格的关联。同时,对内存的大小和模式的控制更灵活,也为此增加一些新的标志。在不使用新特性(新标志等)的情况下,新版本的DPDK是可以老的版本上跑的,或者说老的DPDK可以无感的升级到新的DPDK中来。

二、DPDK的内存管理

在DPDK中,内存可以看做三种情况,即IO内存,物理内存和虚拟内存。重点当然是虚拟内存,虚拟内存中比较容易理解的就是DMA和Cache,而在Cache中就有内存对齐的要求。DPDK从整体上来看,虚拟内存可以划分为内存池和大页内存管理;而IO可以为分IOVA,IO内存(物理或VA)。
DPDK中的内存管理主要有两个大的特点,第一,支持大页,目的是为了更好的增加TLB的命中率,提高内存的使用效率。另外,其可以提供对NUMA中的内存固定处理,提高内存的使用效率和安全性。这样就可以防止线程对不同NUMA节点内存的访问。最后,DPDK可以DMA技术和大页技术来固定物理内存,从而允许硬件自己启动DMA来执行数据的IO访问,降低CPU和DPDK框架本身的开销。
DPDK中的IOVA主要分为两种模式,即PA和VA模式,前者指物理地址后者指虚拟的地址。DPDK利用自己对内存模式的了解可以根据实际情况,对内存进行优化。特别是使用IOMMU,可以使DPDK更安全,效率更好。
在DPDK中,内存的管理(分配等)没有使用常见的系统内存分析API而是自己管理内存。DPDK自己分配大页并利用堆来给用户程序提供内存的应用操作,这样就可以在原有的基础上,重点处理与DPDK相关的内存区域控制、大页内存管理、NUMA内存的管理以及对IOVA和DMA的访问控制等。
DPDK中的内存分配是安全的,这和基础库和OS有所加强(基础库一般情况下是线程安全的)。同时,其强制进行内存的对齐。DPDK通过共享内存来进行不同进程中的数据资源(这个好像在底层很流行,像安卓等也是如此),这对于DPDK这种大数据量跨进程交互的框架来说异常重要。
更为关键的是,DPDK对抽象的内存池进行了有针对性的优化,它可以让用户指定是否为线程安全和批量操作。不过这个线程池仍然没有摆脱普通线程池的问题,只能是固定大小的内存对象。结果肯定是速度快,内存碎片少。
另外需要说明的,在NUMA节点间处理内存分配可以平均分配也可以偏向分配,但总的内存不要超过实际的物理内存数量。

三、应用

DPDK说得粗浅不准确一些,其实就是一个高效的数据转发框架或者高效网络框架(肯定是不准确,人家叫“数据平面开发套件”,也可以用在数据存储上)。说的再不准确一下,可以理解为一种网络开发模式。这样,就会有一个非常形象化的情况认知,然后再认真学习就可以明白了为啥不准确。
比较典型的有数据包的输入和输出、加密、事件调度和进程数据管理等等。DPDK中的内存管理应用无处不在,毕竟跟数据相关的,离开内存基本就啥也别干了。
简单介绍一下DIDO(Data Direct I/O)技术,这是由Intel公司提出的,主要目的就是为了让网络接口数据的吞吐性更高。传统的网络通信,数据从网卡通过总线传输到内存,然后CPU再读取其到Cache,处理后再写回Cache,再写回内存,然后回到网卡(网卡读取),再由总线送到网卡内部并通过接口发送出去。这个过程中,CPU和内存会参与进来,网卡也会多次读写内存。但学过计算机原理的都知道,CPU和内存及IO的数据处理是不在一个量级上的,这样,就一定会浪费很多资源。这里,其实就是通过LLC Cache来直接略过内存,直接让网卡和CPU通信。

四、总结

从这篇开始分析DPDK的内存,一如前面分析虚拟化一般,从原理到技术再到源码,从表及里,一层层的剥开分析。其实内存管理的原理绝大部分都是一样的,不会有什么跳出的新方法。但是如何综合运用的方式就灵活了很多,产生的结果也大不相同。在不同的内存使用情况下,就会有着很好的效果。

你可能感兴趣的:(网络开发,网络,缓存)