View on GitHub

MasterKnowledgeBase

为 mx 找到的各种知识归档

Broom: sweeping out Garbage Collector from Big Data Systems

简要总结

​ Broom 是发表在 HotOS’15 上篇幅较为短小的一篇文章,全文只有 5 页。

​ 大数据处理系统使用基于high-level language,例如 Java,C# 等,的自动内存管理方案管理任务执行所需的内存,而大量对象的产生以及更大size的堆空间(heap)都为GC带来了巨大压力。本文的核心思想是使用region-based memory management管理大数据处理任务产生的内存,如此一来,对象被分配在一系列region中(region中的对象统一被回收),其被回收时也无需遍历整个heap。

背景介绍

​ JVM和 .NET CLR为大数处理任务带来了巨大的好处——强类型语言、自动内存管理方案以及高阶函数等,然而这些优点需要一定的代价,长时间的GC暂停降低了大数据处理任务的吞吐量,同时提高了其时延。考虑到大数据处理系统在使用内存时有以下两个特点(作者观察到的现象):

​ 考虑到同一个batch中的对象之间存在较少的隐式关联,而在大数据处理系统中用户通常只向system-defined operators提供相应的代码片段,因此,对system-defined operators做出修改可以做到对用户透明。于是,作者考虑在不要求用户添加额外注解的情况下,实现region-based memory management——Broom(基于Naiad)。

解题思路

​ 既然是region-based memory management,则应该考虑如何分配内存、回收内存以及处理跨region的引用。

分配与回收内存

​ 对于使用communicating actor(使用消息进行通信或数据传输,事件驱动)的大数据处理系统而言,作者阐述了三种region:

​ 作者修改了诸如Aggregate等actor的代码,并将代码中分配内存的部分全部重定向到相应的region中,三种region中内存的释放策略有所不同,temporary region的生命周期最短,在一个actor中随时都可以释放;而actor-scoped region的生命周期与actor的生命周期相同;transfer region的生命周期文中没有详细说明,但通过本文提供的例子可大致判断只有当transfer region中的数据被处理完毕,不再被需要时即可释放其占用的内存,这与特定的actor相关。

跨region的引用处理

​ 限制位于不同region中对象之间的指针指向关系来实现memory safety,但具体还没实现,详细操作见论文 p4,此处不再赘述。

启发与思考

​ 这篇文章的思路和我们的研究工作很像,其关键点也在于不需要用户的额外开销即可优化大数据处理系统的内存使用。本文的实现思路是region-based memory management,选择的大数据处理系统是Naiad,优化手段也和Naiad中的各种Actor密切相关。文章的future work希望通过静态分析等手段减少 system developer(不是上层用户,是底层系统工作者)的工作量,但查阅了相关资料后并没有看到其具体实现。总体来说,该工作与我们的研究有大量相似点(都想实现对用户透明,都专注于大数据处理系统的内存模式分析),但我们的工作不局限于region-based memory management,也可能会引入诸如MEMTUNE的优化手段;其次,我们专注于Spark中的iterative/shuffle-intensive application,并对其进行优化,而作者只是针对特定几个应用进行了优化,并不算一个完整的工作。本文的启发如下:

^1^ 例如,我们针对的是Spark,Spark与Naiad在内存模式上肯定存在不同之处(有很多相同之处);此外,尽管背景大体相同,但如果看问题的角度不同,最后要解决的问题和其解决方案肯定有所不同(这些文章都想优化大数据处理系统的内存使用,而且大多数paper都阐述了GC的劣势并想再此之上做文章,但他们针对不同的角度给出了不同的问题理解以及不同的解决方案)