《Future Generation Computer Systems》:Graal
Doss: Direct Object Snapshotting and Sharing for Cloud-Native Applications
编辑推荐:
云原生应用通过直接对象快照和共享机制Doss减少内存开销与启动时间,支持多实例共享预初始化数据,在微服务和大模型场景下内存减少44%、响应提升51%。
Ivan Ristovi? | Vojin Jovanovi? | Peter Hofer | Milena Vujo?evi? Jani?i?
贝尔格莱德大学数学系,贝尔格莱德,塞尔维亚
摘要
现代云计算提供商采用按使用量计费的模式,其中计算能力和内存是最重要且成本最高的资源。由于资源成本的原因,云原生应用程序应能够快速启动,并在多个应用程序实例中最小化启动时间和内存占用。然而,现代工作负载通常包含大量数据,这往往需要初始化操作,从而导致应用程序实例之间重复的CPU工作。现有的云原生解决方案会在应用程序构建时预初始化代码和数据,以实现执行过程中的共享。但这些解决方案没有考虑到在应用程序执行过程中才可用的数据。
我们提出了Doss,一种用于云原生应用程序的直接对象快照和共享机制。Doss直接从正在运行的语言运行时堆中快照对象图的状态。这使得Doss能够在内存映射的情况下实现恒定的反序列化开销。Doss可以在兼容的语言运行时实例之间共享已预热的数据快照,从而减少系统的内存开销并避免冷启动。我们在GraalVM中实现了GraalDoss。GraalDoss在多个应用程序实例之间保持恒定的数据缓存内存开销,消除了昂贵的数据初始化过程。在微服务应用程序中,GraalDoss将8个微服务实例的总内存占用减少了44%,并将首次响应时间提高了51%。在自然语言处理应用程序中,GraalDoss将总执行时间提高了几个数量级。
引言
面向服务的架构的基本组成部分是可重用的软件组件,称为服务,它们在独立的虚拟化沙箱中运行并相互通信以执行复杂任务[1]、[2]、[3]、[4]。服务可以自动部署和扩展,提供出色的弹性和可扩展性[5]、[6]、[7],最终通过云计算平台提供给用户[8]、[9]、[10]、[11]、[12]、[13]、[14]。在无服务器架构中,通常会有许多相同服务的独立实例,其中应用程序由函数组成——这些轻量级且执行速度快的代码片段被隔离在单独的虚拟化堆栈中[15]、[16]、[17]。无服务器架构适用于各种工作负载,包括数据处理和大数据分析[18]、[19]、[20]、线性代数算法[21]、[22]、机器学习和自然语言处理(NLP)[23]、[24]、[25]、媒体处理[26]、[27]以及微服务Web应用程序[29]。主要的云计算提供商继续将无服务器技术整合到他们的云计算平台中[30],截至2023年,超过70%的AWS[8]客户、60%的Google Cloud[11]客户和49%的Microsoft Azure[10]客户都在使用无服务器解决方案。
由于数据重复和额外的数据处理,服务沙箱的需求降低了整体效率,尤其是在内存占用和启动时间方面[16]、[31]。图1.1(左)展示了这种效应,多个语言运行时进程加载并操作相同的应用程序数据(如配置、缓存或数据集),从而在某些工作负载中成为性能瓶颈[32]、[33]、[34]。此外,在大数据分析或机器学习[24]、[35]、[36]等流行的云计算工作负载中,服务通常需要使用重量级框架[37]、[38]、[39]、[40]、[41]来加载和处理数据,进一步降低了平台的效率。共享预处理的数据是可取的,并且可以显著提高效率,如图1.1(右)所示。
服务提供商在云原生部署中使用快照技术[42]来应对数据初始化开销并提高效率[43]、[44]。原生编译解决方案在编译过程中预初始化应用程序的部分[45]、[46],作为可共享的堆快照[47]、[48]。这些解决方案以较长的编译时间为代价换取更高的效率。然而,这些技术只能预初始化编译过程中可用的数据,要求构建机器能够访问数据存储[49]。这使得原生编译不适合预初始化仅在应用程序执行过程中才可用的数据。此外,高可用性应用程序通常需要实时更新,这涉及到某种形式的应用程序数据热加载[8]。在原生应用程序中,这些对象在编译时被嵌入到堆快照中,因此在应用程序执行期间无法卸载或重新加载,从而需要新的构建来部署更新。由于原生编译的优势远大于其局限性,流行的Java微服务框架[50]、[51]、[52]推荐使用GraalVM[43]进行原生编译。我们认为,原生编译解决方案可以通过添加运行时快照功能来进一步优化数据初始化速度并促进数据共享。
我们提出了
Doss,一种用于云原生Java应用程序的快照和共享机制,能够管理和在应用程序实例之间共享数据快照。
Doss直接使用正在运行的语言运行时的对象布局来持久化对象,无需转换,消除了大部分反序列化开销,并确保数据中的信息不会被重复或丢失。
Doss通过创建和恢复已初始化的运行时应用程序数据快照来改善应用程序的启动和执行时间。数据快照可以在多个语言运行时实例之间共享,利用内存映射来减少系统的整体内存占用。由于
Doss在不进行转换的情况下持久化对象,它还充当了一个具有延迟加载功能且反序列化开销最小的快速序列化库。我们的贡献包括:
快照堆——一个集成到原生应用程序运行时的辅助可共享堆,其部分可以在不同语言运行时实例之间共享。快照堆包含来自语言运行时堆的对象的直接快照。
直接对象快照和共享(Doss)一种高效地在应用程序实例之间持久化和共享对象快照的机制,减少了整体内存占用并避免了冷启动。
一套开源基准测试[53],这些基准测试在微观层面通过与传统序列化技术比较其效率,在宏观层面通过测量其对云原生Java应用程序的影响来评估序列化库的性能。
GraalDoss——作为GraalVM的一部分在Java中实现的Doss。我们使用GraalDoss作为Micronaut[50]的缓存后端,以减少多个应用程序实例的总内存占用。例如,对于两个实例,我们获得了20%的改进;对于八个实例,我们获得了44%的改进。此外,我们将首次响应时间提高了51%。我们在NLP应用程序中使用GraalDoss来快照NLP管道的结果,将总执行时间从几十秒缩短到几百微秒。
论文概述
第2节提供了相关背景信息,第3节概述了相关工作。第4节解释了Doss的关键特性——架构概述、垃圾收集器集成和用例。第5.3节描述了原型实现和实验结果,第6节讨论并总结了所获得的结果。第7节总结了本文并指出了进一步工作的方向。
节选
背景
云计算是通过互联网按需向最终用户提供服务的模式。服务提供商维护存储数据并提供计算资源的物理服务器。资源的提供取决于服务旨在为最终用户提供的内容(第2.1节)。
云计算提供商使用诸如原生编译(第2.2节)和检查点/恢复(第2.3节)等技术来生成称为原生镜像 [45]、[46]、[47]的可执行文件以及可重用的系统
相关工作
c/r可以应用于虚拟化堆栈(第3.1节)、包括语言运行时的单个进程(第3.2节),或通过对象序列化和反序列化(s/d)来处理单个对象(第3.3节)。
直接对象快照和共享
直接对象快照和共享(Doss)是一种与正在运行的语言运行时集成的机制,增强了堆对象快照和共享功能。Doss执行直接对象快照,即不进行任何转换地捕获对象状态。捕获的状态,即快照,包括从快照根对象开始的整个对象图。Doss引入了一个快照堆(第4.1节),用作快照操作的介质
实现和评估
我们展示了我们的Doss实现(第5.1节)、基准测试集(第5.2节)以及对预期用例的GraalDoss评估(第5.3节)。我们关注性能关键的用例,并考虑了操作吞吐量、内存占用和启动时间。快照热加载是GraalDoss设计中提供的一个可用性特性。
讨论
我们讨论了获得的结果(第6.1节),将GraalDoss与相关的c/r和s/d机制进行了比较(第6.2节),并在更广泛的背景下讨论了获得结果的有效性(第6.3节)。我们还讨论了使用GraalDoss可能带来的安全威胁(第6.4节),以及GraalDoss对延迟敏感的工作负载的影响(第6.5节)。
结论和未来工作
在本文中,我们提出了Doss,一种用于云原生Java应用程序的直接对象快照和共享机制。我们介绍了快照堆,这是一个集成到原生应用程序运行时的辅助堆,其部分可以在多个语言运行时实例之间共享。我们描述了Doss的架构设计和操作接口,以及其与运行时垃圾收集器的集成。
我们实现了Graal
CRediT作者贡献声明
Ivan Ristovi?:撰写——审稿与编辑、撰写——原始草稿、可视化、验证、软件、方法论、概念化。Vojin Jovanovi?:撰写——审稿与编辑、监督、方法论、概念化。Peter Hofer:概念化。Milena Vujo?evi? Jani?i?:撰写——审稿与编辑、撰写——原始草稿、可视化、验证、监督、项目管理、方法论、调查。
利益冲突声明
作者声明他们没有已知的竞争性财务利益或个人关系可能会影响本文报告的工作。
Ivan Ristovi?是贝尔格莱德大学数学系计算机科学系的助教。他还在Oracle Labs Serbia担任高级研究员。他的主要研究兴趣在于编译器、编程语言实现和软件验证。