研究目的
减少NVM(3DXPoint Memory)写,持久化数据的开销。
研究背景
现有的部分B+树研究使用的是仿真NVM环境,这样的方式下的设计与真实的NVM硬件的一些特性是不能做到良好匹配的,已有的基于NVM的B+树优化的数据结构在节点分裂时仍然需要采用log,放大了NVM地写。此外,之前地实验很少涉及到对硬件的特性分析与验证,论文基于3DXPoint Memory进行了实验分析,并针对其特性进行了数据结构设计。
研究概述
1、利用3DXPoint Memory在缓存行上数据的移动几乎不影响NVM的写性能,持久化刷新操作是以缓存行为单位进行刷新,因此尽可能的使得每次刷新的缓存行中的脏数据越多越好,从而减少持久化引起的刷新指令引起的开销。论文将叶子节点划分为4个缓存行大小,当lin0的存满后,下一次将要跨到下一缓存行时,就将lin0的数据移到最近的空的缓存行(依次lin1、lin2、lin3),因此,使得下一次插入时只需要刷新lin0,而不需要刷新lin1和lin0(插入节点后需要修改存在lin0中的头部信息),本来需要进行两次缓存行刷新变为了只需要一次。
2、将节点的大小设置为256字节的倍数,如此有利于充分利用3DXPoint Memory的带宽
3、节点中添加alt字段,节点尾部添加两个指针,使用在节点的分裂过程中,以此来使得节点在分裂时不再需要log。
关键技术
根据对3DXPoint Memory硬件的性能分析,得出了3DXPoint Memory一些明显的特征:
特性一、在cache line上的修改不会影响写性能
特性二、3DXPoint Memory内部数据访问的粒度是256字节
特性三、3DXPoint Memory随着一个程序负载集大小的增加而性能降低
发现当3DXPoint Memory程序数据访问的大小达到其总内存的1/8或更多则性能会比较稳定。
根据以上的3DXPoint Memory的特性,设计了如下的LB+-tree:
1、节点大小为256字节的倍数
header是由16字节组成,每个line是64字节,lock字段用于并发控制,alt字段用于指示节点尾部哪一个指针在被使用。
2、减少缓存行的刷新
尽可能刷新包含头部信息的缓存行,减少持久化所需要的开销(调用刷新指令的次数),因为刷新line0只需要调用一次指令,而刷新其它line则需要调用两次刷新指令(因为头部信息在line0,所以除去刷新line0,刷新其它line都需要同时刷新line0和其所在line)
3、无日志方式的节点分裂
4、并发控制
采用HTM+lock来进行并发控制,当节点在进行删除或是插入操作时,将会把lock字段置1,使得其它操作无法访问当前节点,直到lock被置为0.
5、Multi-256B Nodes
一个节点由多个块组成,每一个快的大小都是256字节,每一个块都和第一个块一样,具有header,即分布式头部,将元数据分散到每一个块中,以达到满足设计的通过移动缓存行数据达到减少刷新指令数量。除第一个块由尾指针外,2~m块尾部是一个可选择的header,alt变为表示其是否使用。
6、节点融合
当节点由于删除导致节点小于M/2时,本文并不会进行节点融合,而是直接保持此状态。也就是节点并不需要融合操作。
实验环境
3DXPoint Memory
研究总结
作者虽然清晰的讲解了单个256字节节点的设计,但是在Multi-256B Nodes的具体设计是模糊的,而该点也可以说是很重要的一点。
改论文的结构设计和想法是极其巧妙的,但是由于其单独针对的是3DXPoint Memory,可能在其它的NVM上会有一些的不适应。