PM数据结构优化之五:PACTree

相关信息

PACTree:A High Performance Persistent Range Index Using PAC Guidelines

publisher:SOSP’21

author:Wook-Hee Kim R. Madhava Krishnan Xinwei Fu Sanidhya Kashyap† Changwoo Min
Virginia Tech †EPFL

研究目的

DRAM仿真的NVM与真实的NVM在实际中仍然是存在极大的区别的,NVM是更复杂的。此外,在对大量现有的持久化内存索引结构进行分析实验后,仍然发现由极大的优化空间。

研究背景

存储系统核心组件之一便是内存索引结构,常有的有:B+树,hash等。真实NVM与DRAM仿真NVM是由巨大的不同的,如所有之前的索引设计都忘了非一致性内存访问的影响(non-uniform memory access (NUMA)),因此,作者提出了一系列的设计准则来设计一个具有高性能的索引结构。

研究概述

PACTree是一个混合索引结构,内部节点采用trie索引,叶子节点采用B+树的结构,研究分析得到了涉及NVM硬件、软件栈、并发控制、索引算法设计方面的15条设计准则。

在硬件层方面

1、NVM带宽是有限的;2、NVM展示出了读写延迟和带宽的不对称;3、连续的读会是更优的;4、NVM数据持久化的花费时超出我们想象的更昂贵;5、缓存一致性协议阻碍了NUMA的伸缩性(目录一致性协议是导致NUMA带宽溶解的根本原因)

在软件层方面

1、持久化内存分配的开销是极大的;2、持久化内存分配应该是 NUMA-aware;

在索引算法方面

1、浏览操作应该最小化消耗NVM带宽;2、读操作应该最小化NVM写;3、写操作应该最小化NVM内存分配;4、写操作应该最小化NVM持久化操作;5、扫描操作应该尽可能采用连续的读;

在并发控制方面

1、最大化并发访问的伸缩性和带宽利用;2、最小化结构修改导致的阻塞;3、索引数据的大小不应该是影响操作的进度

关键技术

PACTree设计在内部节点上使用前缀树索引结构(trie index) ,在叶子节点层采用B+树索引,并采用双链表,主要结构设计如下:

 

1、packed

叶子节点设计如下,对节点的部分元数据采用持久化,如下图蓝色部分不持久化。

 在索引结构的搜索层:使用前缀树索引,一个内部节点只需要保持部分的关键字,因此只会消耗更少的NVM带宽,在遍历过程中的比较也只需要进行部分关键字比较。

在索引结构的数据层:使用类似B+树叶子节点结构,但是采用的是双链表,并使用fingerprint加快查找, permutation array 用来记录键值对位置进行范围查询。

2、asynchronous concurrency

首先采用一个乐观锁来进行并发控制和多线程访问控制;其次,采用一个SMO log来记录叶子节点的分裂和融合操作,并持久化该日志,然后再利用一个后台线程进行扫描log,并将log的内容更新写到搜索层中,实现异步地将结构修改更新到搜索层。

采用无日志方式的崩溃一致性,通过bitmap+slot list+permutation array等元数据信息来保证崩溃一致性以及恢复,然后对于节点部分元数据采用不持久化。

内存管理上采用从 NUMA-local NVM heap 分配持久化内存以减少开销。

具体实现

在搜索层上

线性持久化与恢复

使用一个乐观的版本锁(8字节),由4字节的generation ID和4字节的version number组成,一个读者是无法访问节点直到节点持久化更新写完成后释放锁;通过阻塞读来保证线性持久化,通过generation ID在正确恢复时重置每个节点的锁,而且generation ID每次结构重建都会自动增加,在generation ID自动增加后原来的锁状态将变得无效

无日志的崩溃一致性

乐观锁保证了索引结构的排他写访问,因此只需要简单地保证持久化指令的顺序是按照程序执行顺序相同便可。在单缓存行的情况下,持久化顺序是等于程序执行顺序的;在多缓存行的情况下,先持久化存储数据,再持久化元数据,通过clwb/sfence确保持久化顺序与程序执行顺序相同。

浏览操作

由于采用了log异步更新SMOs到搜索层,因此会导致搜索层和数据层不一致,在搜索时便需要通过先查询到该节点的毗邻节点,通过毗邻节点来借助数据层的双向链表进行搜索。在搜索到节点后会比较搜索到达前后的version number 是否一致,否则重试。

扫描操作

扫描操作与浏览操作相似,扫描操作会检查permutation array是否与version相同,则会首先重建permutation array(记录节点内键值对顺序)。

插入/删除/更新/数据节点的崩溃一致性

插入操作,查找空的插槽,查找到便插入,然后再更新bitmap。删除操作,采用appended-only;数据节点崩溃一致性,使用8字节的原子写,节点的写操作都最后才更新bitmap,如果bitmap更新持久化成功则新修改数据有效,否则无效。

实验环境

基于NVM设计索引机构

研究总结

1、叶子节点采用双链表的方式,会导致空间利用率相对低

2、采用异步更新树结构的变化,这导致需要log来记录变化,引发了log开销

3、SMOs是主要的引起并发性能、伸缩性的瓶颈,也是导致较长阻塞时间的性能。

相关贮备

1、NUMA。非均衡存储器访问

探讨基于Linux的NUMA系统 - 知乎

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值