热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

VLDB2020DPTree:DifferentialIndexingforPersistentMemory

一、前言由于新硬件的出现,传统的应用迁移到新架构上需要做一些相应的设计调整,才能发挥新硬

一、前言

由于新硬件的出现,传统的应用迁移到新架构上需要做一些相应的设计调整,才能发挥新硬件的性能。持久性内存(PM)作为内存型介质,其高密度、可字节寻址以及低延迟等优良特性,有望取代DRAM,是近年来研究的热点,包括OSDI,SOSP,ISCA,SIGMOD,VLDB等顶会上,有相当比例的文章与它相关。随着Intel AEP的量产,针对其的优化的文章也越来越多。本文是来自浙江大学和阿里巴巴的工作,今天找论文时看到,简单记录下。

二、目前存在的问题:

  • PM具有较高的写延迟。

  • 掉电非易失以及原子写粒度的问题,导致数据部分写。而且CPU乱序写会导致cacheline刷新顺序不同,因此不能识别出数据属于那个cacheline。

  • mfence和cflush能保证cacheline的刷新顺序,但是这种同步方式带来的极大的写开销,而写问题是PM的瓶颈所在。

  • 传统的索引机制主要是针对磁盘和DRAM的架构设计的,没有考虑到PM的特性。

相关工作:

目前存在大量的解决方案,比如CDDS-Tree, wB+-Tree , NVTree , FPTree 和 FASTFAIR 等,然而这些索引机制都引起大量mfence和cflush维护数据一致性,带来了很大的性问题。

解决方案:

为了减少昂贵的写开销,本文提出了一种针对PM的索引结构,DPTree,如图1所示。DPTree是一个两层的索引结构:第一层是buffer tree,保存在DRAM中(写优化);第二层是Base Tree,保存在PM中,它只读的(读优化)。(类似于LSM架构)

图1 DPTree的架构

写流程:

  1. 写请求首先写到DRAM中的buffer Tree中,减轻对PM的写压力。

  2. 当buffer Tree中的数据量超过给定阈值时(阈值是buffer cache/base tree),将buffer Tree中数据merge到Base Tree中,然后持久化到PM中。由于进行了merge操作(批量更新),因此只需要少量的mfence操作。

DPTree的详细设计

  1. Buffer Tree

本文采用了链表的结构存储日志,如图2所示,每个page被分割成8byte大小,其中63bit存储数据,1bit是有效位标志符。

图2. Buffer Tree的结构

日志链表的头部是PLog,PLog由fist,curp和poff三个指针组成,其中first表示指向第一个page,curp表示指向目前活动的page,poff指向目前活动的page的offset。Cacheling Log Page Allocator是分配器,包含两个freelist,其中一个有效位是0,另外一个freelist的有效位是1.当buffer tree初始化时,会根据bool值选择freelist。并且当freelist的大小超过请求大小时,对其进行内存分配,等使用完后不会直接释放,转换成其他的freelist,供之后的请求使用,类似内存池。另外, Csize(alloctor的可用容量)能够动态的调整。

2. Base Tree

图2 Base Tree的叶子节点结构

在DPTree中,base tree中的数据只读的,并且通过merge操作更新(类似与LSM Tree中的sstable)。在base tree中,inner node保存在DRAM中,leaf node保存在PM中,并采用了部分写日志的机制。

如图2所示,meta由bitmap。next,maxkey等组成,其中bitmap表示对应的key/value slot是否有效,这里面用2位来表示(由于这里delete操作时追加tomstone的机制,所以entry有三种状态),next指向下一个叶子节点,max_key表示该节点中的最大值,order存储按序排列的key/value的offset,fingerprint存储key的hash值(这部分设计基本是借鉴了NV-Tree,wB-Tree,FP-Tree的设计方案)。另外,DPTree采用了部分持久化的机制,不同于NV-Tree等,这里count, order和 fingerprints不需要持久化。作者认为系统crash是稀有发生的事情,即使crash了,也可以通过数据重建恢复。

最后

只是粗略的看了下总体设计,本文还有很多设计上的实现细节,等有空再看下。

[1] Xinjing Zhou et al. DPTree: Differential Indexing for Persistent Memory.VLDB




推荐阅读
  • 本文详细介绍了git常用命令及其操作方法,包括查看、添加、提交、删除、找回等操作,以及如何重置修改文件、抛弃工作区修改、将工作文件提交到本地暂存区、从版本库中删除文件等。同时还介绍了如何从暂存区恢复到工作文件、恢复最近一次提交过的状态,以及如何合并多个操作等。 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 本文讨论了微软的STL容器类是否线程安全。根据MSDN的回答,STL容器类包括vector、deque、list、queue、stack、priority_queue、valarray、map、hash_map、multimap、hash_multimap、set、hash_set、multiset、hash_multiset、basic_string和bitset。对于单个对象来说,多个线程同时读取是安全的。但如果一个线程正在写入一个对象,那么所有的读写操作都需要进行同步。 ... [详细]
  • 本文介绍了在Android开发中使用软引用和弱引用的应用。如果一个对象只具有软引用,那么只有在内存不够的情况下才会被回收,可以用来实现内存敏感的高速缓存;而如果一个对象只具有弱引用,不管内存是否足够,都会被垃圾回收器回收。软引用和弱引用还可以与引用队列联合使用,当被引用的对象被回收时,会将引用加入到关联的引用队列中。软引用和弱引用的根本区别在于生命周期的长短,弱引用的对象可能随时被回收,而软引用的对象只有在内存不够时才会被回收。 ... [详细]
  • 初始化初始化本地空版本库,仓库,英文名repositorymkdirtest&&cdtestgitinit克隆项目到本地gitclone远程同 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 本文介绍了如何找到并终止在8080端口上运行的进程的方法,通过使用终端命令lsof -i :8080可以获取在该端口上运行的所有进程的输出,并使用kill命令终止指定进程的运行。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • 本文介绍了pack布局管理器在Perl/Tk中的使用方法及注意事项。通过调用pack()方法,可以控制部件在显示窗口中的位置和大小。同时,本文还提到了在使用pack布局管理器时,应注意将部件分组以便在水平和垂直方向上进行堆放。此外,还介绍了使用Frame部件或Toplevel部件来组织部件在窗口内的方法。最后,本文强调了在使用pack布局管理器时,应避免在中间切换到grid布局管理器,以免造成混乱。 ... [详细]
  • LVS实现负载均衡的原理LVS负载均衡负载均衡集群是LoadBalance集群。是一种将网络上的访问流量分布于各个节点,以降低服务器压力,更好的向客户端 ... [详细]
  • #define_CRT_SECURE_NO_WARNINGS#includelist.h#includevoidSListInit(PNode*pHead ... [详细]
author-avatar
wenxuanlee
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有