SMR学习之 《WORT: Write Optimal Radix Tree for Persistent Memory Storage Systems》

文章出处: (FAST ’17)

摘要:近年来人们对持久内存(PM)的兴趣引起了对PM中有效的索引结构的发展。最近的这些发展都集中在b树的变异上。在本文中,我们证明了基数树,这是另一种不太流行的索引结构,可以作为一个有效的PM索引结构更合适。这是因为基数树结构由插入键的前缀决定,而且不需要树再平衡操作和节点粒度更新。但是,基数树不能在PM中使用。作为另一项贡献,我们提出了三种基数树的变体,即WORT(写最优基数树)、WOART(写最优自适应基数树)和ART+CoW。其中,前两个是PM的最佳选择,因为它们每次更新只使用一个8字节的故障原子写来保证结构的一致性,并且不需要日志或CoW的任何副本。广泛的性能研究表明,我们提出的基数树变体对于PM(如NVTree、wB+ tree和FPTree)以及Memcached内的实现,都比最近提出的B-tree变体具有更好的性能。

1、介绍

以前对持久内存索引结构(PM)的研究主要集中在b树变体上。在本文中,我们主张基数树比b树变体更适合于PM索引。我们提出的基数树变体索引结构是最适合PM的,因为一致性总是由一个8字节的故障原子写入来保证,而不需要任何额外的副本用于日志或CoW。

相变存储器、自旋转矩MRAM和3D Xpoint等新兴的持久性存储技术有望从根本上改变各种存储系统的面貌[4,5,7,9,10,14]。在传统的基于块的存储设备中,故障原子性单元(故障原子性单元是保证在任何系统故障时保持一致状态的更新单元)是磁盘块大小。但是,由于可以通过内存总线而不是通过PCI接口访问可字节寻址且非易失性的持久性内存,因此持久性内存的故障原子性单元通常为8字节或不大于高速缓存线[5,6,12,13,15,19]。

然而,更小的故障原子性单元似乎是一把双刃剑,因为尽管这允许减少写入持久存储的数据,但它可能导致执行一致性的高开销。这是因为在现代处理器中,内存写操作常常在高速缓存线粒度中被任意重新排序,为了强制执行内存写操作的顺序,我们需要使用内存栅栏和高速缓存线刷新指令[21]。这些指令被指出是性能下降的主要原因[3,9,15,20]。此外,如果要写的数据大于故障原子写单元,则必须使用昂贵的机制(如日志记录或写时复制(CoW))来保持一致性

近年来,提出了几种基于b树的持久索引结构,如NVTree[20]、wB+Tree[3]和FPTree[15]。这些结构的重点是通过使用只追加更新策略来减少对昂贵的内存栅栏和高速缓存线刷新指令的调用次数。这种策略已被证明可以显著减少日志记录等方案所需的副本,从而提高性能。但是,这种策略不允许这些结构保留b树的一个关键特性,即在节点中对键进行排序。此外,这种策略在处理节点溢出方面是不够的,因为节点分裂涉及多个节点更改,因此需要进行日志记录

虽然基于b树的结构在内存索引结构中很流行,但是还有另一种结构,也就是基数树,那就少了。本文的第一个贡献是展示了基数树在PM存储中的适用性和局限性。也就是说,由于基数树结构是由插入键的前缀决定的,所以基数树不需要键的比较。此外,树的重新平衡操作和节点粒度单元中的更新也是不必要的。相反,插入或删除一个键会导致一个8字节的更新操作,这对于PM来说是完美的。然而,已知原始基数树不能很好地利用内存和缓存空间。为了克服这个限制,基数树采用了路径压缩优化,它将多个树节点组合在一起,形成一个唯一的搜索路径到一个节点。虽然路径压缩显著提高了基数树的性能,但它涉及到节点拆分和合并操作,这对PM是有害的。

基数树的局限性引出了本文的第二个贡献。也就是说,我们为PM提供了三种基树变体。这些结构的第一,我们称之为写最佳基数树点(WORTPM,或者只是麦芽汁),我们开发一个failure-atomic等基数树路径压缩方案失败,它可以保证原子性与相同的内存保存现有路径压缩方案。对于WORT中的节点分割和合并操作,我们添加了内存屏障和持久操作,以便将执行故障原子性时的写操作、内存屏障和缓存行刷新指令的数量降到最低。WORT是PM的最佳选择,正如我们提出的第二种变体一样,因为每次更新只需要一个8字节的故障原子写入,以确保结构的一致性,而不需要任何副本

posted on 2019-04-14 18:55  Jiweilearn  阅读(251)  评论(0)    收藏  举报

导航