DPDK系列之二十二DPDK内存管理发展分析

一、内存管理

内存管理肯定是不断的发展的,DPDK也也是如此。内存的管理,多看一些相关书籍资料的话,基本上就是效率和速度。什么意思呢?内存使用的充分,少浪费甚至不浪费,这就效率;内存分配回收速度快,这就是速度。在前面分析DPDK中为什么使用大内存,就是为了速度。而内存池从某种程度上看既可以提高效率也可以提高速度。
包括一些内存中的数据结构、管理方式和对缓存的处理。特别是内存管理从静态化转到动态化,进一步提高了性能,增加了内存使用的效率。这都是DPDK在不断的实际应用中进行迭代开发而来的。

二、DPDK版本17和18的不同

在DPDK17及其之前(小于DPDK18.11),可以认为其内存管理的整体方式基本不变,而在这后升级到DPDK18则发生了比较大的变化,下面主要看一下不同:
1、对大页内存的管理方式
DPDK17中使用了一个特殊的hugetlbfs文件系统,为大页内存提供挂载点。通过对其的配置来提供对不同大小页面的访问。但在DPDK18中引入了一种单个文件段的方式(–single-file-segments),这样就可以创建更少的文件来防止在云端使用时的数量快速增长的情况。同时,在DPDK18中还引入了内存模式(–in-memory),虽然在DPDK17中允许使用–huge-unlink来删除创建的文件,但是仍然无法和DPDK18中的内存模式。毕竟删除也是创建了,而后者干脆直接就在内存中搞。它更适应于云的场景下。
2、内存映射的状态
DPDK18开始,内存可以在运行时动态的增减,也就是说消除了内存的静态映射。DPDK17中如果运行在没有EAL的环境中,则会把所有的大页内存留下自己备用,而DPDK18则只保留必须的内存,而在后续根据实际情况动态增加。
3、内存使用
DPDK17中对内存保留相关需要使用参数–m和–socket-mem来设置,但在DPDK18这些则被划成可选的,当然也可以使用–socket-limit来限定单个NUMA节点的内存使用。高版本的更灵活,可更方便控制内存。
4、IOVA的地址连续性
在DPDK18中,不保证VA的连续是IOVA连续的。也就是说,你是你,我是我。你连续你的,我连续我的,但在应用上不受影响,这样就更加灵活。而DPDK17则需要在初始化时就必须按顺序保留大量的IOVA的连续内存。当然可以使用参数–legacy-mem来保证使用旧的内存模式。
5、内存布局的不同
DPDK17初始化即确定了内存布局,但在DPDK18中则不是,其可以在运行是动态修改,所以其相关应用也对内存处理进行了更改。
6、外部内存
DPDK18支持外部内存,而DPDK17不支持。
7、其它
对在非使用大页内存时有所不同,比如DPDK19后可以在vhost-user后端中不需要大页内存。DPDK18增加了前面提到的内存模式等等。
其它的一些小的细节的改动比如packed_ring等,这都会在后续的代码分析中提示出来。

三、总结

至少在现阶段,内存管理是所有程序都脱离不开的,所以GC是当前一个研究的热门。很多语言Go,Java,Python等都有自己的GC。其实GC就是一种更强大的内存管理,如果有机会接触就会发现,DPDK中的内存管理在它们面前是小弟弟,不过话又说回来,应用的场景不同,DPDK肯定会是有自己独到的一面,最主要的当然是大内存。
学习别人的框架,在初期当然是通盘吃透。但这样做太沉重,到了后期,重点是学习别人的特质,而不永远通盘全吃。正所谓:“独观其大略”。

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