Redesigning LSMs for Nonvolatile Memory with NoveLSM(ATC 2018)

(一)研究目标

NoveLSM,一个持久的基于lsm的键值存储系统,旨在利用非易失性内存,为应用程序提供低延迟和高吞吐量。

(二)研究背景

基于LSM的持久键值存储,如BigTable、LevelDB、HBase、Cassandra和RocksDB,在现代系统中发挥着至关重要的作用,应用范围从web索引、电子商务、社交网络到移动应用。LSMs通过提供内存中的数据访问、缓冲和批处理对磁盘的写入以及强制顺序磁盘访问来实现高吞吐量。这些技术提高了LSM的I/O吞吐量,但同时也带来了与日志记录和压缩成本相关的额外存储和软件级开销。虽然在将更新写入内存之前将它们记录到磁盘对于从应用程序或电源故障中恢复是必要的,但需要进行压缩来限制LSM的DRAM缓冲区大小,并且重要的是将内存中的非持久缓冲区提交给存储。日志记录和压缩都在关键路径上增加了软件开销,并增加了LSM的读写延迟。近来的研究集中在SSD上重设计LSM以提升吞吐量。

在存储堆栈中添加字节寻址、持久和快速非易失性内存(NVM)技术(如PCM)可以改善延迟、提高吞吐量和减少故障恢复成本。与ssd相比,nvm有望拥有接近dram的读延迟、50-100倍的写入速度和5倍的带宽。这些设备技术的改进将性能瓶颈从硬件转移到软件栈,因此减少和消除设备访问关键路径上的软件开销至关重要。当将nvm与当前的存储技术(如闪存和硬盘)进行比较时,nvm表现出以下特性,这些特性在当前的LSM设计中是没有被利用的:(1)对持久存储的随机访问可以提供高性能;(2)就地更新成本低;(3)低延迟和高带宽的结合带来了改进应用程序级并行的新机会。

重新设计LSM来适应NVM有三个原因:(1)NVM在未来几年有望与大容量SSD共存,类似于SSD与磁盘共存。因此为异构存储重新设计LSM可以利用NVM的优点而不丢失SSD和硬盘的优化。(2)重新设计LSMs为成千上万的应用程序提供了向后兼容性。(3)考虑到比dram高5 -10倍的写延迟,nvm保持批处理、顺序写的优点也很重要。

对NVM的LSM技术进行重新设计需要关注三个关键问题:(1)现有的LSM在内存中维护不同的数据结构和持久存储形式,因此在存储和内存之间移动数据会产生大量的序列化和反序列化成本,从而限制了低延迟NVM的优势;(2)LSM只允许更改内存中的数据结构,并使持久存储中的数据不可变。但是内存缓冲区的容量有限,必须经常压缩,这增加了停顿时间。在内存中缓冲数据可能会导致系统故障后数据丢失,因此必须记录更新,这会增加延迟并导致I/O读写放大;(3)将NVM添加到LSM层次结构中会增加存储层次结构的层级,从而增加读访问延迟。

(三)研究概述

NoveLSM通过三个关键创新实现了性能提升。
(1)NoveLSM引入了一个持久的基于nvm的memtable,显著降低了困扰标准LSM设计的序列化和反序列化成本。
(2)NoveLSM使持久的NVM memtables可变,从而允许直接更新;这大大减少了由于压缩造成的应用程序停顿。此外,对NVM memtable的直接更新是就地提交的,避免了对日志更新的需要;因此,故障后的恢复只涉及到映射回持久的NVM memtable,这使得它比LevelDB快了三个数量级。
(3)NoveLSM引入了乐观并行读,可以同时访问存在于NVM或SSD中的多个级别的LSM,从而减少了读请求的延迟,提高了系统的吞吐量。

动机

选择扩展LevelDB来开发NoveLSM的原因是LevelDB的简单性以及它在商业部署中的广泛应用。RocksDB对LevelDB的优化是对NoveLSM设计原则的补充。

现有的lsm在插入和读取操作方面都存在很高的软件开销,并且无法利用NVM的字节寻址能力、低延迟和高存储带宽。插入操作主要受到高压缩和日志更新开销的影响,而读操作则受到顺序搜索和反序列化开销的影响。减少这些软件开销对于充分利用nvm的硬件优势至关重要。

(四)关键技术

4.1 NoveLSM设计原则

NoveLSM利用nvm的字节可寻址性、持久性和大容量来减少序列化和反序列化开销、高压缩成本和日志开销。此外,NoveLSM利用NVM的低延迟和高带宽来并行化搜索操作,减少响应时间。

原则1:利用字节寻址能力来降低序列化和反序列化的成本。
nvm提供字节寻址持久性;因此,内存中的结构可以按原样存储在NVM中,而不需要在检索时将它们序列化为磁盘兼容的格式或反序列化为内存格式。为了利用这一点,**NoveLSM通过设计一个持久跳表提供了一个持久的NVM memtable。**在压缩过程中,DRAM memtable数据可以直接移动到NVM memtable,而不需要序列化或反序列化。

原则2:启用持久化状态的可变性,利用NVM的大容量来降低压缩成本。
传统上,由于存储访问延迟高,软件设计将存储中的数据视为不可变的;因此,要更新存储中的数据,必须先将数据读入内存缓冲区,然后再进行更改并将其写回(主要是批量)。但是,NVM的字节寻址能力提供了直接更新存储上的数据的机会,而不需要将它们读到内存缓冲区或批量写入。**为了利用持久状态的可变性,NoveLSM设计了一个大型可变持久memtable,应用程序可以直接向其添加或更新新的键值对。**持久memtable允许NoveLSM在小型DRAM和大型NVM memtable之间交替使用,而不会因为完成后台压缩而暂停。因此,压缩成本显著降低。

原则3:通过in-place的耐久性减少logging的开销和恢复的成本。
当前的LSM设计必须首先将更新写入日志,计算校验和并添加它们,然后将它们插入到memtable中。大多数LSMs通过不提交日志更新来妥协崩溃一致性以提高性能。此外,应用程序故障或系统崩溃后的恢复成本很高;在将每个日志条目添加到memtable之前,必须对其进行反序列化。相反,NoveLSM通过立即向持久memtable提交in-place更新来避免日志记录。恢复速度很快,只需要映射整个NVM memtable而不需要反序列化。

原则4:利用NVM的低延迟和高带宽来并行化数据读取操作。
LSM将数据存储在一个层次结构中,内存中的最高级别包含新的更新,较低的sstable级别包含较旧的更新。随着数据库中键值对数量的增加,存储级别(即sstable)的数量也会增加。添加NVM memtable会进一步增加LSM的级别。LSMs必须从上到下进行顺序搜索,这可能会增加大量的搜索成本。NoveLSM利用了NVMs的低延迟和高带宽,通过在内存和存储级别上并行搜索,而不影响读取操作的正确性。

4.2 寻址(反)序列化成本

为了减少LSMs中序列化和反序列化的开销,我们首先引入一个不可变的持久memtable。在压缩过程中,DRAM memtable中的每个键-值对(通过memcpy())移动到NVM memtable中,而不进行序列化。NVM memtable跳表节点(存储键-值对)通过它们在内存映射区域中的相对偏移量链接,而不是虚拟地址指针,并在适当的位置提交;因此,持久的NVM跳表可以在系统故障后安全恢复和重建。

Immutable NVM skip list-based memtable

4.3 降低压缩成本

虽然不可变的NVM设计可以降低序列化成本和读取延迟,但它有几个限制。首先,NVM memtable只是DRAM memtable的一个副本。因此,压缩频率取决于DRAM memtable填充的速度。对于具有高插入速率的应用程序,压缩成本主导性能。

Mutability for persistent memtable.

为了解决压缩阻塞的问题,NoveLSM使NVM memtable可变,从而允许直接更新NVM memtable;当内存memtable被填满时,应用程序线程可以交替使用NVM memtable,而不会因为内存memtable的压缩而停止。

可变NVM设计的工作原理可以总结如下:
在初始化过程中,NoveLSM创建一个易失性DRAM memtable和一个可变的持久NVM memtable。当前的LSM实现使用更小的memtable大小来减少DRAM消耗并避免故障后的数据丢失。相比之下,NoveLSM使用一个较大的NVM memtable,这是因为NVM可以扩展到比DRAM大4倍的规模,并且还可以保持持久性。
插入一个键值对时,首先,DRAM memtable被激活,键值对及其校验和被写入日志,然后插入DRAM memtable。当DRAM memtable被填满时,它就变成不可变的,并通知后台压缩线程将数据移动到SSTable。NoveLSM不再为完成压缩而暂停,而是使NVM memtable激活(可变),并直接将键添加到可变的NVM memtable中。
NVM memtable的大容量为后台压缩DRAM和NVM不可变memtable提供了足够的时间,而不会停止前台操作,因此,NoveLSM的可变memtable设计显著降低了压缩成本,从而降低了插入/更新的延迟。对于读操作,首先搜索当前活动的memtable,然后搜索不可变的memtable和sstable来获取键的最近值。

4.4 减少logging开销

NoveLSM通过原地持久化更新来消除对添加到可变NVM memtable中的插入的日志记录。因此,NoveLSM减少了每个键值对的写操作次数,也减少了恢复时间。

Logging.
在当前的LSM实现中,每个键值对及其32位CRC校验和首先被附加到持久日志,然后插入到DRAM memtable,最后压缩到SSTable,导致高写放大。此外,如LevelDB和RocksDB只追加而不提交(fsync())数据到日志,因此,为了获得更好的性能,它们牺牲了耐用性。
相反,对于NoveLSM来说,当插入到NVM的可变持久memtable中时,所有的更新都在原位写入和提交,而不需要单独的日志;因此,NoveLSM可以减少写放大。只有对NVM memtable的更新才会避免日志写入,而对DRAM memtable的所有插入都会被记录。我们的评估表明,使用具有直接可变性的大型NVM memtable可以将日志记录减少到总体写操作的一小部分,从而显著降低日志记录成本和恢复时间。此外,由于所有的NVM更新都是就地提交的,因此与现有实现相比,NoveLSM可以提供更强的持久性保证。图5。d显示了NVM memtable insert的伪代码。首先,启动一个新的事务,并为键值对分配持久内存。键-值对的复制是通过使用内存存储屏障(memory store barrier)和缓存行刷新(cache line flush)对目的地址进行排序,然后使用内存存储屏障[24,38,41]来实现的。作为额外的优化,对NVM(8字节)的小更新是用原子存储指令提交的,不需要barrier。最后,对于覆盖,旧节点被标记为惰性垃圾收集。

Recovery
从一个持久的NVM memtable中恢复需要首先映射NVM memtable,并标识跳表的根指针。因此,NVM memtable根指针偏移量和20字节的跳表相关元数据被存储在一个单独的文件中。对于易失性DRAM和持久化NVM中的memtable,当持久化NVM memtable中版本为Vi的键在DRAM memtable中被覆盖为Vi+1可能会发生故障。当DRAM memtable中版本Vi的键(尚未压缩到存储)在NVM中被覆盖为Vi+1也可能发生故障。为了保持正确性,NoveLSM必须总是从key已提交的最大版本中恢复。为了实现版本正确,NoveLSM执行以下步骤:
(1)每次分配一个新的DRAM memtable时,都会创建一个新的日志文件,并记录对DRAM memtable的所有更新并使其持久;
(2)当NVM memtable(内存映射文件上的持久跳表)被激活时,插入不会被记录,NVM memtable被当作日志文件处理;
(3)与其他日志文件类似,NVM日志文件也使用增量版本号命名。在LSM重启或故障恢复过程中,NoveLSM从日志文件的活动版本开始按升序恢复。日志文件logi+1中的key(可以是DRAM日志或NVM memtable)被认为是该key的最新版本。注意,从NVM memtable中恢复数据只涉及到NVM区域(一个文件)的内存映射和查找跳表根指针。因此,即使从一个大型NVM memtable中恢复也非常快,几乎可以忽略将页面映射到页表的成本。

4.5 支持读并行性

NoveLSM利用NVM的低延迟和高带宽,通过跨memtables和sstable并行搜索来减少每个读操作的延迟。在这个过程中,NoveLSM不会损害读取操作的正确性。在当前的LSMs中,读操作从memtable自上而下地进行到sstable。每一层的读错过都会增加读延迟。其他因素(如从SSTable反序列化数据)也会增加读取开销。

Reducing read latency.
为了减少读取延迟,NoveLSM从处理器设计中获得了灵感,并行缓存和TLB查找,以减少缓存失败时的内存访问延迟;NoveLSM在多个级别的LSM上并行搜索:DRAM和NVM可变memtables, DRAM和NVM不可变表,以及sstable。我们的设计管理一个工作线程池,用于搜索memtable或SSTable。重要的是,NoveLSM只使用一个工作线程在可变DRAM和NVM memtable之间进行搜索,因为与NVM memtable相比,DRAM memtable的大小相对较小。

Guaranteeing version correctness for reads
一个key的多个版本可以存在于不同的LSM层,较新的版本(Vi+1)在LSM顶层(DRAM或NVM可变memtable),较旧的版本(Vi,Vi−1,…)在较低的不可变memtable和sstable中。在传统设计中,搜索操作顺序地从顶部memtable移动到下方sstable,因此总是返回键的最新版本。在NoveLSM中,搜索操作是跨不同级别并行的,搜索较低级别的线程可以返回较旧版本的键,这会影响读操作的正确性。为了保证版本的正确性,NoveLSM总是将访问最高级别LSM的线程返回的键值视为正确的版本。为了满足这个约束,让访问Li的工作线程Ti等待其他访问更高级别L0到Li−1的工作线程完成搜索,只有当更高级别不包含该键时,才返回Ti获取的值。此外,暂停较高级别的线程以等待较低级别的线程完成可能会破坏并行读取操作的好处。为了克服这个问题,在NoveLSM中,一旦一个线程成功地定位了一个键,所有低级线程都会立即挂起。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值