英语原文共 13 页,剩余内容已隐藏,支付完成后下载完整资料
Distributed Logless Atomic Durability with Persistent Memory
分布式无日志原子持久性的持久性内存
摘要
数据中心运营商已经开始部署持久内存persistent memory(PM),利用其快速访问和持久性的组合来显著提高性能。PM感知软件的一个关键挑战是在实现原子耐久性的同时保持高性能。后者通常需要使用日志记录,这会在额外的CPU周期、写通信量和排序需求方面减少相当大的开销。在本文中,我们利用内存层次结构中固有的数据多版本控制,在不记录日志的情况下实现原子持久性。我们的设计,LAD,依赖于已经存在于现代cpu中在内存控制器(MCs)上的电阻缓冲空间(MCs),在所有事务的更新都原子化地提交给PM之前,推测性地暂存所有事务的更新。LAD在硬件上采用了片上分布式提交协议来管理每个事务在多个MCs上累积的分布式推测状态。我们证明,LAD是一种实用的设计,它依靠适度的硬件修改来提供原子级持久事务,同时提供高达80%的理想性能,即PM不经意软件的性能。
1 介绍
持久性存储器(PM)正在向数据中心进军:电池支持的DRAM已经用于生产[21],基于非易失性存储器技术的新兴产品,如in-tel的3D XPoint[12],正在进一步推广PM的部署。可提供字节可寻址内存和快速内存访问的PM取代基于磁盘的缓慢I/O,从而提高数据密集型应用程序的性能。要有效地使用PM,需要专门为崩溃一致性设计软件。对于事务的编程来说,崩溃一致性要求事务可原子性持久化。原子持久性保证在电源故障时,事务的所有更新或没有更新都是持久的。软件面临的一个关键挑战是如何在不显著损害通过用PM替代传统存储所获得的性能提升的情况下实现原子持久性。原子持久性的主流方法是使用日志,大多数实例依赖于基于软件的预写日志记录[15,28,42]和一些通过硬件加速日志记录的研究[20,31,37]。虽然它的优点和缺点因具体的实现而异,但日志通常会引入可编程性障碍和显著的性能开销—CPU周期过多、PM写入和排序限制,特别是对于小型事务。
在本文中,我们利用内存层次结构中固有的多个版本的数据来避免日志记录。PM总是保存事务开始前有效的数据值。在事务运行时,它的所有更新都可以收集在内存层次结构中较高的推测性暂存区域中,并在事务完成后立即原子地提交给PM。这个高层次的想法工作的一个关键要求是,暂存区域也应该是持久的,以保证在电源故障的情况下事务更新的原子传播到PM。我们认为,内存控制器(MCs)的请求队列是实现这种暂存区的最佳候选。不仅因为这些队列的容量很小,所以对电池支持的需求不大,而且最新的服务器CPU上已经提供了电池支持的MCs[36,39]。
我们引入了LAD(Logless Atomic Durability),这是一种硬件机制,它将事务的熟悉接口公开给软件,并保证所有事务的更新都在不使用日志记录的情况下以原子方式支持PM。当事务运行时,LAD缓冲持久MC队列中的所有更新,并在事务结束时原子地将它们提交给PM。LAD依赖于避免日志记录的一般概念,即在原子化提交到PM之前使用内存层次结构中的持久暂存区域来收集数据,这一概念在Kiln[46]之前已经介绍过。与Kiln不同,LAD(i)在没有LLC修改的情况下将持久性需求限制在MCs上,并且(ii)支持不具有集中点的可伸缩内存层次结构,如统一LLC。随着现代服务器cpu的内存层次结构是分布式的(如NUCA LLC和多个MCs),我们解决了管理的关键挑战也是分布式的推测状态,因为单个事务的更新可以接触到驻留在不同内存位置的数据。LAD em-部署在硬件中实现的两阶段提交协议的变体,以处理分布式推测状态并做出原子提交决策。
先前关于原子隔离的工作涉及管理类似的分布式推测状态。然而,所提出的技术并不直接适用于原子耐久性的情况,因为在这两种情况下,失效和恢复的概念在性质上是不同的。在较高的层次上,由于功率损失,原子耐久性环境中的故障是突然发生的,因此在任何给定的时间实例中,恢复所需的所有状态都必须是持久和一致的。
我们的主要贡献是为原子耐久性设计一个硬件机制,该机制包含L1D缓存和MCs的所有硬件扩展,而不需要任何片上缓存都是可扩展的。LAD避免了日志创建的软件开销,在一般情况下,它完全避免了任何形式的日志记录。与技术趋势一致,LAD唯一依赖的非易失性片上组件是MCs,而MCs在最近的服务器CPU中已经有了电池支持。此外,我们还详细介绍了一种用于原子决策的分布式硬件管理协议的实现,该协议在系统崩溃和电源故障时具有健壮性。
论文的其余部分安排如下。在sect;2中,我们讨论了先前的工作,并认为电池支持的MCs的最新技术趋势为高性能原子耐久性带来了新的设计机会。我们分别在sect;3和sect;4中描述了LAD的设计和实现。我们继续我们的方法(sect;5)和评估(sect;6),并在sect;7中得出结论。
2背景及相关工作
PM是一个广义的术语,描述字节可寻址的持久性存储器,包括非易失性存储器技术(如Intel的3D XPoint[12])和电池支持的DRAM[21]。PM正在获得巨大的进展,因为它承诺为数据密集型应用程序带来显著的性能提升,它提供了持久性属性,传统上只有在对内存有限的存储设备进行I/O操作时才能实现[21,24]。
为了从PM的持久性属性中获益,软件必须遵循特定于PM的契约才能保持崩溃一致,即保证PM的内容允许应用程序在系统崩溃后恢复到有效的操作状态。设计崩溃一致性软件的复杂性的一个关键来源是,数据更新到达PM的顺序不同于CPU观察到的内存顺序(即CPU的内存模型),并且对软件完全透明。出于性能原因,cpu在内存之上具有一个深缓存层次结构,即使在部署PM的系统中,这种结构通常也是不稳定的。与PM中的数据不同,易失性缓存层次结构的所有内容在系统崩溃时丢失。使用写回缓存,数据只在收回时写入PM;因此,更新到达PM的顺序可能与程序顺序大不相同。因此,除非在软件中特别注意处理此问题,否则当系统在崩溃后重新启动时,PM中无序的数据更新会导致应用程序状态损坏。
为了让软件控制更新传播到PM的顺序,现代服务器cpu使用特殊的刷新指令扩展其ISA,这些指令显式地将目标缓存块写回PM。一旦缓存块被持久化,内存控制器(MC)就会确认刷新完成。例如,英特尔的处理器就为此采用了clwb指令[14]。为了消除从关键路径写入PM的高延迟,英特尔最近使支持PM的MCs持久化[36,39]。此增强功能允许刷新的缓存块在到达片上MC时获得持久性状态,并且MC将立即确认clwb消息。
2.1 原子持久性
PM-aware软件使用ISA扩展,如clwb,强制数据更新的选择性传播到PM,从而控制持久更新的顺序。然而,单靠对排序的控制还不够灵活,软件需要更高层次的编程抽象,例如事务的抽象:一个指令块,其效果要么原子化,要么根本没有。在现有的一系列事务语义中,ACID[6,11]是一个流行的实例,它一起提供了多个所需的属性。
在本文中,我们关注ACID属性的一个子集,即原子持久性,这是保证在系统崩溃时,要么所有事务的更新都被持久化,要么全部被集体丢弃。由于提供原子耐久性的现有机制要么严重影响性能,要么需要大量的硬件修改,我们引入了一种实用的替代方案,以保持PM的高性能。我们提出的解决方案只是为了提高原子的耐久性。LAD可以与并发控制机制相结合以获得完整的ACID事务;实际上,我们在本文中详细介绍的实现很容易与传统的锁定机制相结合。
以前追求高性能原子耐久性的工作大致可以分为两类:日志记录和硬件版本控制。我们简要介绍了这两个类别的建议,重点介绍了硬件版本控制减轻的所有日志记录形式的固有开销。然后,在第2.2节中,我们强调了我们提出的窑炉无日志原子耐久性设计的显著差异[46],这是利用硬件版本控制的最相关的先前提案。
2.1.1日志。预写日志记录[28]以日志的形式创建数据的显式重复版本,这些日志在任何就地更新之前都是持久的。在崩溃的情况下,这些日志用于将数据恢复到一致状态。常见的日志记录机制包括撤销和重做日志记录,分别记录原始数据和更新。日志记录是迄今为止最流行的原子持久性机制,它可以在软件或硬件中实现。
软件日志使用flush指令(如clwb)在任何就地数据更新持久化之前将日志写入PM[5、6、13、15、17、22、25、30、42、43]。相反,Kamino TX[27]维护数据集的副本作为撤销日志,从而从关键路径删除日志。事务直接应用就地更新,副本在后台异步更新。
硬件日志技术引入了硬件支持来提高日志记录的性能。在某些情况下,日志是由CPU生成的,特殊的硬件支持在日志创建后加速了日志管理(即,将日志写回PM并保持日志和就地更新之间的正确顺序)[6、8、18、23、26、38]。在其他建议中,日志记录完全卸载到专用硬件上[7、19、20、31、37]。
所有形式的日志记录都会产生与日志创建和管理相关的开销。对于软件日志记录,CPU在每个事务中执行可能大量的额外指令。在进行任何就地更新之前,还需要序列化日志并使其持久化。在不记录的情况下,动态事务的更新地址事先不知道,会导致多个显式排序的记录操作,从而损害CPU的吞吐量[25,43]。在重做日志记录中,相对于日志的创建,就地更新会延迟,因此所有读取都需要首先检查日志,以确保始终访问最新的数据值[25、34、43]。
在任何情况下,向PM写入日志都会增加带宽需求。伐木成本与其效用不相称。由于很少发生崩溃,日志很少用于恢复;在常见情况下,日志在创建后很快就会被删除。最后但并非最不重要的一点是,日志记录可能还需要对应用程序代码进行非常重要的更改,从而减少可编程性负担,特别是在没有使用高级库原语的情况下实现时[15,42]。
2.1.2硬件版本。日志记录显式地创建事务更新数据的第二个版本,以便在崩溃时启用回滚。Kiln[46]利用多级内存层次结构中固有的数据多版本控制来避免日志记录及其相关的开销。图1a示出了具有PM的传统系统,假设没有电池支持的内存控制器,其中所有芯片组件都是易失性的。在这种配置中,通过日志记录来实现原子持久性需要对片外存储器进行序列化日志写入,从而导致高延迟操作。为了解决这一难题,Kiln通过使用持久内存技术(STT-RAM)替换默认的基于SRAM的最后一级缓存,使持久域更接近CPU,并利用这一快速访问的持久最后一级缓存完全删除日志记录。当一个事务运行时,它的更新被累积在持久性最后一级缓存中,标记为推测性(图1b)。一旦交易结束,只要清除它们的投机标记,它的更新就会立即提交给持久性内存。在崩溃后重新启动时,持久性最后一级缓存将丢弃在推测状态下找到的缓存块。
总的来说,Kiln解决了日志记录的缺点,但提出了两个在现代服务器cpu中通常不适用的假设:LLC是持久的和集中的。接下来,我们将详细阐述这些限制性假设以及LAD如何处理这些假设。
2.2分布式的可持久推测性内存控制器
在可快速访问的权限域中推测性地缓冲更新是实现原子持久性的有效方法,它可以解决日志记录的性能和可编程性开销。受现代服务器cpu中MCs的持久性的启发,我们研究持久MC队列是否可以模拟地用作原子持久事务的推测性更新的暂存区域,如图1c所示。
我们提出的设计,LAD,解决了管理分布式推测状态的挑战,以驱动原子性地将事务提交给PM的决策,这一需求从根本上源于服务器中存在多个MCs。MCs甚至可以分布在单套接字系统中。例如,英特尔基于mesh的cpu将MC s放在两个物理上不相交的片上位置(IMC tiles)[1],而每个AMD EPYC插槽是一个多芯片包,压缩四个芯片,每个芯片都有自己的northbridge/MC[2]。这种MC分布显著影响了原子提交协议的设计。即使来自CPU核心的消息可能在不同的时间到达MCs,所有MCs都必须一致地做出决定以保持原子性。崩溃可能导致这些消息的部分传递。因此,处理原子的持久性从根本上要求将涉及的片上资源(即CPU核心和所有MCs)作为一个分布式系统来处理。
管理分布式状态的复杂性并不是使用MCs作为暂存区域的产物。考虑到分布式LLC(NUCA)在服务器cpu中的普遍存在[3],根据Kiln的建议,在LLC中放置暂存区也会导致分布式规范状态。即使未来的服务器采用持久的NUCA llc,利用它们实现原子持久性仍然需要分布式提交协议。
最后,LAD表明持久LLC对于高性能原子耐久性是不必要的。将持久域限制在MCs上就足够了,MCs是一种在现代服务器cpu中随时可用的特性。换言之,将持久域扩展到MCs之外(例如,扩展到LLC)是一个很大程度上不必要的修改,并且收益递减
2.3其他上下文中的分布式状态
先前关于持久性障碍的工作,从LLC到PM的命令更新刷新,确定了LLC被分发时需要协商一致[18]。作者开发了一个分布式一致性协议来同步跨LLC片的刷新顺序。相反,LAD的协议是为了实现原子性而开发的,原子性是比排序更有力的保证。
LAD提出的原子机制的基本概念
持久性还与广泛的硬件事务性内存工作具有高度的相似性。虽然事务性内存实现有很大的不同,但它们都涉及到在隔离上下文中管理特定状态以实现原子性。我们发现LAD和管理分布式推测状态以在硬件中做出原子决策的机制之间有更大的相关性,而这些机制不一定是在事务性内存的上下文中构造的。例如,类似于著名的两阶段提交协议[41]的分布式协议的片上硬件实现已经部署,以使用基于更新的一致性来实现顺序一致性[45]或原子地提交内存操作块来提高共享内存多处理的性能[4、32、33]。尽管这些方案和LAD的实现方面有所不同,但它们都有一个共同的高层次目标,即在多个代理之间达成共识,以作出原子决策,并且如我们将在(sect;3.2)中描述的,在稳定状态下的协议操作遵循类似的阶段。先前的方案和LAD的关键区别在于,这种机制是用来实现原子的持久性而不是孤立性。这种质量上的差异带来了新的设计限制和挑战,例如识别最合适的片上组件来管理推测性原子持
剩余内容已隐藏,支付完成后下载完整资料
资料编号:[240082],资料为PDF文档或Word文档,PDF文档可免费转换为Word
以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。