当前位置:   article > 正文

Unified Holistic Memory Management Supporting Multiple Big Data Processing Frameworks over...——论文泛读

Unified Holistic Memory Management Supporting Multiple Big Data Processing Frameworks over...——论文泛读

TOCS 2022 Paper 论文阅读笔记整理

问题

为了处理真实世界的数据集,现代数据并行系统通常需要大量的内存,机器数量少时内存不足,机器数量多时CPU资源利用率不足,导致价格昂贵又低效。新兴的非易失性存储器(NVM)技术与DRAM相比具有高容量,与SSD相比具有低能耗。因此NVM适用于大数据处理中DRAM和耐用存储之间的选择。NVM有两种代表性用法。第一种利用其持久性功能,确保持久性数据结构的崩溃一致性,并在发生故障时恢复执行。第二种是作为传统DRAM设备的补充,即构建混合存储器架构,同时利用DRAM的访问速度,和NVM的大容量、低功耗和低成本。

挑战

但直接使用NVM会因其显著增加的访问延迟和减少的带宽而导致巨大的性能损失,例如,NVM读取的延迟比DRAM大2-4倍,NVM的带宽约为DRAM的1/8–1/3。因此需要解决,如何在DRAM和NVM之间执行智能数据分配和迁移,以便最大限度地提高整体能源效率,同时最大限度地减少性能开销,存在两个挑战。

  • 使用垃圾回收(GC)。一种常见方法是修改操作系统或硬件,以监控物理内存页的访问频率,将热数据移动到DRAM中。但在托管语言中,垃圾回收会不断更改内存中的数据布局,破坏了数据和物理内存地址之间的绑定。大多数大数据系统都是用Java和Scala等托管语言编写的,托管语言是在诸如JVM的托管运行时之上执行的,JVM采用了复杂的内存管理技术。由于传统的垃圾回收器不知道混合内存,在操作系统级别分配和迁移热/冷页面很容易导致不同级别的内存管理之间的干扰。

  • 应用程序级内存子系统。现代大数据系统都包含复杂的内存子系统,这些子系统在应用程序级别执行各种内存管理任务。例如,Apache Spark[6]使用独立分布式数据集(RDD)作为其数据抽象。RDD是一种分布式数据结构,在不同的服务器之间进行分区,可以是许多存储级别中的一个(例如,内存、磁盘、非物质化等)。Spark允许开发人员指定RDD应该分配到哪里,例如在托管堆或本地内存中,本机分配的对象不受GC约束,从而提高了效率。但数据处理任务(如shuffle、join、map或reduce)是在托管堆上执行的,除非先将基于本机内存的RDD移动到堆中,否则无法直接处理它。因此,在哪里分配RDD取决于何时以及如何处理它。例如,频繁访问的RDD应该被放置在DRAM中,而基于本地存储器的RDD将不会被频繁使用,可以放置在NVM中。有效地使用混合存储器需要在这些正交数据放置策略(即堆、本地存储器或磁盘)与NVM或DRAM之间进行适当的协调。

本文方法

本文分析了两个具有代表性的大数据系统,用于数据处理的Spark和用于数据存储的QuickCached,发现有机会在JVM中共享通用的内存管理策略。

  • Spark有两个独特的特性。(1)执行批量对象创建,数据对象表现出强大的划时代行为和清晰的访问模式。例如,每个RDD具有完全相同的访问/生存模式的对象。(2)数据访问和生存期模式通常在用户程序中是静态可观察的。例如,RDD的访问模式可以从程序中创建和使用它们的方式推断出来。

  • QuickCached有一个独特的特性。使用一个巨大的哈希表来存储键值对,在处理查询请求时,会创建大量的临时对象,这些对象会在很短的时间内被频繁访问。因此,频繁访问的数据的寿命很短,而寿命长的数据很少被访问。

基于观察,可以为大数据应用程序开发一个简单的静态分析,以推断每个粗粒度数据集合的访问模式,以执行有效的分配和迁移。

本文提出了Panthera,一种语义感知、全自动的内存管理技术,用于混合内存上的大数据处理。通过轻量级静态程序分析和动态数据使用监控,来推断粗粒度的数据的访问模式,通过垃圾回收在运行时进行有效的数据放置和迁移,几乎不产生运行时开销。针对Spark/QuickCached分别进行优化。

  • 分别为Spark和QuickCached开发了两个静态分析器。Spark分析器分析Spark程序,基于变量的位置及其在程序中的使用方式来推断RDD变量的内存标签(即NVM或DRAM)。QuickCached分析器分析QuickCached源代码,识别巨大的全局哈希表,并推断其对应的内存标签。

  • 开发了语义感知和物理内存感知的生成GC。将静态分析工具推断出的内存标记传递给运行时系统,使用这些标记来做出分配/迁移决策。Panthera的堆有两个空间,分别代表年轻和老。将年轻放在DRAM中,将老分为小部分在DRAM和大部分在NVM。这种设计也是基于观察的结果:

    • 大多数对象是在年轻中分配的,且在初始化过程中经常被访问,将其放在DRAM中可以快速访问。

    • Spark中,也有存储临时中间结果的短暂RDD。这些RDD到期后在年轻中迅速回收,导致频繁访问。因此设计将年轻放在DRAM中。

    • QuickCached中,创建许多临时对象来处理特定的请求。这些对象是在年轻中分配的,应该放在DRAM中,以实现快速访问。

    • Spark中的长寿命对象可分为两类:(1)在数据转换期间频繁访问的长寿命RDD,放在DRAM中,因为频繁访问;(2)为容错而缓存的长寿命RDD,放在NVM中,因为很少访问。

    • QuickCached只有一个长寿命对象,用于存储键值数据。只有一小部分经常被访问,这些请求将在运行时被识别,开销可以忽略不计。因此应该放在NVM中,除了已识别的频繁访问部分。

  • 基于观察结果,修改了次要GC和主要GC,根据数据对象的RDD类型和静态分析推断的语义信息,将数据对象分配和迁移到合适的空间中。运行时系统还监视RDD对象调用的转换,以执行RDD访问模式的运行时(重新)评估,根据评估结果使用主GC将RDD从一个空间迁移到另一个空间。

使用Spark应用程序对Panthera进行了广泛的评估,不同堆大小和DRAM比率的结果表明,Panthera有效地利用了混合内存。Panthera增强的JVM将内存能源减少了22%–34%,QuickCached的执行时间开销为1%–9%;Spark的平均执行时间开销不到1%,内存能量减少32%–53%,而其他方法将只读RDD对象移动到NVM则会产生41%的时间开销。

总结

针对混合存储器上运行的大数据处理系统,包括用于数据处理的Spark和用于数据存储的QuickCached,如何优化混合存储器的使用。本文基于对Spark和QuickCached的分析,发现数据有可静态观察的访问模式,如频繁访问、很少访问。因此提出Panthera,根据语义感知在混合内存上进行内存管理。(1)对Spark和QuickCached分别设计静态分析器,根据源码分析其变量的访问模式。(2)根据静态分析的标记,运行时在DRAM和NVM间进行内存分配和迁移。(3)运行时进行动态访问模式评估,根据评估结果动态迁移。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/742387
推荐阅读
相关标签
  

闽ICP备14008679号