热门标签 | 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




推荐阅读
  • 揭秘腾讯云CynosDB计算层设计优化背后的不为人知的故事与技术细节
    揭秘腾讯云CynosDB计算层设计优化背后的不为人知的故事与技术细节 ... [详细]
  • 在过去,我曾使用过自建MySQL服务器中的MyISAM和InnoDB存储引擎(也曾尝试过Memory引擎)。今年初,我开始转向阿里云的关系型数据库服务,并深入研究了其高效的压缩存储引擎TokuDB。TokuDB在数据压缩和处理大规模数据集方面表现出色,显著提升了存储效率和查询性能。通过实际应用,我发现TokuDB不仅能够有效减少存储成本,还能显著提高数据处理速度,特别适用于高并发和大数据量的场景。 ... [详细]
  • 零拷贝技术是提高I/O性能的重要手段,常用于Java NIO、Netty、Kafka等框架中。本文将详细解析零拷贝技术的原理及其应用。 ... [详细]
  • 开发日志:高效图片压缩与上传技术解析 ... [详细]
  • 深入解析C语言中结构体的内存对齐机制及其优化方法
    为了提高CPU访问效率,C语言中的结构体成员在内存中遵循特定的对齐规则。本文详细解析了这些对齐机制,并探讨了如何通过合理的布局和编译器选项来优化结构体的内存使用,从而提升程序性能。 ... [详细]
  • Java并发机制详解及其在数据安全性保障中的应用方案 ... [详细]
  • 如何优化MySQL数据库性能以提升查询效率和系统稳定性 ... [详细]
  • Git核心命令全解析:掌握日常开发必备技能
    本文深入解析了 Git 的核心命令,帮助开发者掌握日常开发中的必备技能。从 `git init` 命令开始,介绍了如何将当前目录转变为 Git 可管理的仓库。接着详细讲解了 `git add` 命令的使用方法,包括如何将文件(如 `readme.txt`)添加到暂存区,以便在后续提交时进行版本控制。此外,还探讨了其他关键命令,如 `git commit` 和 `git push`,以确保代码变更能够安全地保存和同步到远程仓库。通过这些命令的综合应用,开发者可以更加高效地管理和协作项目。 ... [详细]
  • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
  • Netty框架中运用Protobuf实现高效通信协议
    在Netty框架中,通过引入Protobuf来实现高效的通信协议。为了使用Protobuf,需要先准备好环境,包括下载并安装Protobuf的代码生成器`protoc`以及相应的源码包。具体资源可从官方下载页面获取,确保版本兼容性以充分发挥其性能优势。此外,配置好开发环境后,可以通过定义`.proto`文件来自动生成Java类,从而简化数据序列化和反序列化的操作,提高通信效率。 ... [详细]
  • 在托管C++中开发应用程序时,遇到了如何声明和操作字符串数组的问题。本文详细探讨了字符串数组在托管C++中的应用与实现方法,包括声明、初始化、遍历和常见操作技巧,为开发者提供了实用的参考和指导。 ... [详细]
  • 本文详细探讨了MySQL并发参数的优化与调整方法,旨在帮助读者深入了解如何通过合理配置这些参数来提升数据库性能。文章不仅介绍了常见的并发参数及其作用,还提供了实际操作中的调整策略和最佳实践,适合希望提高数据库管理技能的技术人员阅读。 ... [详细]
  • 深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案
    深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案 ... [详细]
  • 本文探讨了如何利用Java代码获取当前本地操作系统中正在运行的进程列表及其详细信息。通过引入必要的包和类,开发者可以轻松地实现这一功能,为系统监控和管理提供有力支持。示例代码展示了具体实现方法,适用于需要了解系统进程状态的开发人员。 ... [详细]
  • 本文介绍了如何利用 Delphi 中的 IdTCPServer 和 IdTCPClient 控件实现高效的文件传输。这些控件在默认情况下采用阻塞模式,并且服务器端已经集成了多线程处理,能够支持任意大小的文件传输,无需担心数据包大小的限制。与传统的 ClientSocket 相比,Indy 控件提供了更为简洁和可靠的解决方案,特别适用于开发高性能的网络文件传输应用程序。 ... [详细]
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社区 版权所有