写在前面:近期,参加2018/12/16日开源操作系统大会,听了华中科大在OSDI'18上的一个工作(《Write-Optimized and High-Performance Hashing Index Scheme for Persistent Memory》),结合研究生期间对 NVM的学习,整理以下内容。

一 非易失存储介质的机遇和挑战

1.1 机遇(这部分就直接贴我的毕业论文)

近年来数据密集型应用发展迅速,其密集的I/O 访问给页缓存系统造成了很大压力,内存系统需要提供足够的页面缓存空间来保证应用的服务质量,仅仅通过优化缓存替换算法已经不足以满足要求,构建大的缓存系统才是解决问题的根本途径。

传统的计算机系统使用DRAM 作为主存存储介质,然而DRAM 的存储机理导致了它存在高能耗和低集成度两方面的缺陷,限制了页缓存系统容量的扩充,具体体现着这样几个方面:

(1) 功耗问题:DRAM 利用电容中存储的电荷数的多少来表示逻辑上的0-1,但是电容会存在漏电的现象,如果电荷不足会导致数据出现差错,因此需要通过周期性预充电过程来保证数据不丢失,除了基础的数据存储操作所需能耗外,DRAM 设备为了保证数据可靠而产生的刷新能耗也给系统增加了很大的负担。据统计,典型的数据中心中,内存的耗电量占了整体计算机系统总耗电量的30%以上;在手机平板电脑等移动设备中,达到了21.8% 以上。

(2) 集成度问题:由于内部电容设备结构的制约,DRAM 设备难以进一步缩小。研究表明16nm 的集成密度已经是DRAM 技术的极限,而且DRAM 的集成度的提升是以牺牲访问性能为代价。

近年来,新型非易失存储技术得到了飞速的发展,为研究适合高效的存储系统带来了机遇。现今引起广泛关注的几种储器件主要有阻变存储器(Resistive Random Access Memory, RRAM)、相变存储器(Phase Change Memory, PCM),和自旋存储器(Spin-transfer Torque RAM, STT-RAM),它们同时具有了数据持久性和字节寻址的特性,为内存系统的变革提供了理论支持。

非易失存储介质的组成和设计原理的不同,使得它们在单元大小、单元存储位数、访问延迟、寿命和能耗开销等方面的特点有所不同。下表对比了多种新型非易失存储器件和传统意义上的存储介质在性能方面的差异。非易失存储介质由于其:低能耗、容量易于扩展,将有潜力取代DRAM作为计算机内存。

1.2 挑战

为什么NVM引用于索引会引发这么多新的思考?因为NVM具有以和DRAM截然不同的性质:

从硬件层面上:

① 硬件上可擦除次数有限。不同于DRAM,NVM的擦写次数有限,这个特性有点类似于用来做SSD的Flash介质(在NAND闪存中每个块的最大擦写次数是一百万次,而NOR的擦写次数是十万次),所不同的是Flash作为外存介质本身所承担的写次数就要相对内存少很多,因为内存层本身对写就有很多优化策略来优化写(因为毕竟外存相对内存速度还是很慢的),比如writeback、日志技术,屏蔽了很大一部分写。

② 不对称的读写延迟和能耗.STT-RAM 和PCM 在读访问操作时间的量级都与DRAM较为接近,约在20ns 左右,写操作

所需时间上,NVM 存在着读写不均衡的问题,例如,PCM 的写性能表现较差,写操作所需时长约为读的5 倍左右。

③ Write optimization matters【这个我不理解】

从应用层面看:

由于NVM其非易失的特性,一旦掉电数据仍然可以保持。

二 NVM在对于操作系统中索引结构的一些机遇和挑战

2.1 常见的索引方式对比: 树形索引结构 VS HASH索引结构

树形索引结构

HASH索引结构

Pros

对于区间索引有优势

解释:由于树的性质(左子树上的所有值小于根节点,右子树上的所有节点大于根节点,如此迭代),所以树的节点本身就是有序的。

多说一句,MYSQL 的innodb引擎中表数据本身就是按B+ Tree组织的一个索引结构;MyISAM的索引也是使用B+ Tree树,所不同的是索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。

对于定值索引有优势,都是O(1)时间。

解释:我们不考虑哈希冲突,对于查询和插入都是可以通过哈希函数直接计算到索引位置,故为O(1)时间;即便有哈希冲突,通常都是用一个链表存放该索引位置的多个冲突数据,只要该哈希索引的散列性质不太差都不会出现冲突数据很多的情况,所以对冲突数据的寻址时间也可以认为是O(1)。

据说,【memcache和redis就是用的hash索引方式】,由于我也没研究过,之后再求证。

Cons

对于定值插入和查找操作都是O(logN)量级

解释:这个很好理解,就是树高

不支持区间索引

解释:用哈希索引做区间查询简直是噩梦,需要对每一个值都进行不断的查找。

NVM在树形索引上的应用相关文章:

CDDS B-tree [FAST’11], NV-Tree [FAST’15], wB+-Tree [VLDB’15], FP-Tree [SIGMOD’16], WORT [FAST’17], FAST&FAIR [FAST’18]

2.2 哈希索引中NVM技术面临的挑战和机遇

传统哈希索引并不适用于NVM,主要体现在以下几点:

① 当前技术不能很好的应用NVM对于非易失的特性不能充分应用。

之前的很多策略都是针对DRAM掉电数据丢失的特性设计的,有很多为了维持一致性而增加的开销,这对于NVM是可以改进的。比如:Cache line flush:linux内核中的Buffer和PageCache的作用是利用部分不用的内存用了缓存数据,那对于cache中的脏数据,需要定期的或者主动调用flush来进行数据同步,否则更新就会丢失;logging:比如说MYSQL中,如果每一条数据都需要访问磁盘,找到那条记录在做更新,那么代价会非常大,目前MYSQL就是采用日志(WAL write ahead logging)的方式,通过将更新写入内存中的日志,然后由checkpoint触发数据的同步。诸如buffer、logging技术都需要考虑数据一致性问题,如果使用NVM,那么以上两个机制就会有很大的改善空间。【论文中还提到到了copy-on-write,暂时不理解NVM对于COW中有什么可以被改进的地方】

② 当前已经存在的算法不能很好的适应NVM读写不对称的特性降低写操作会带来性能的损耗。

针对DRAM设计的哈希算法通常都使用格外的写来解决哈希冲突问题[INFLOW’15, MSST’17],也有人提出了写友好的哈希算法,例如(PCM-friendly hash table (PFHT) [INFLOW’15], Path hashing [MSST’17])但是都是以降低访问性能为代价的。

③ 哈希表的扩容问题

当哈希表已经不能处理新的元素插入时,就要进行resize,将hash表大小扩容,传统的扩容方式就是out-of-place,然后依次将旧表中的哈希元素挪到新表上,扩容的过程中会消耗内存(因为是需要新开辟一块空间嘛,而且通常都是旧表两倍大小),消耗CPU(因为需要对元素进行重新的哈希计算),且在扩容过程中对于新的操作(应该指查询,这个过程中不知道是否允许修改和插入)可能会涉及到两张表,如果一张表上没有该元素,就要去另一张表查找。

哈希表的resize过程会引起很多写操作和memoryfence,严重损耗NVM性能,写操作这个很好理解,memory fence是什么呢?

2.3 已有的哈希算法表现:

[1] B. Debnath et al. “Revisiting hash table design for phase change memory”, INFLOW, 2015.

[2] P. Zuo and Y. Hua. “A write-friendly hashing scheme for non-volatile memory systems”, MSST, 2017

2.3.1 Cuckoo

2.3.1.1 简要介绍

Cuckoo是一种解决哈希冲突的方法,其基本思想是用2个哈希函数来处理地址冲突。哈希函数是成对的,每一个元素都有两个,分别映射到两个位置,一个是记录的位置,另一个是备用位置。这个备用位置是处理碰撞时用的。cuckoo hashing处理碰撞的方法,就是把原来占用位置的这个元素踢走,插入操作如下:

第一步: 对key值hash,生成两个hash key值,hashk1和 hashk2, 如果对应的两个位置上有一个为空,那么直接把key插入即可。

第二步: 否则,任选一个位置,把key值插入,把已经在那个位置的key值踢出来。

第三步: 被踢出来的key值,需要重新插入,直到没有key被踢出为止。如此往复。直到被踢的次数达到一个上限,才确认哈希表已满,并执行rehash操作。

2.3.1.2 性能分析

解释

Memory Efficiency

Good

相对于传统的哈希算法,cuckoo可以通过2个哈希函数降低哈希冲突,从而提高空间利用率

Search

Good

O(1)

Deletion

Good

O(1)

Insertion

Bad

一个插入过程可能会引起踢掉一个位置的元素,引起连锁位置变动,这个效应称为Cascading write[INFLOS'15],甚至可能引起resize,因此为Bad

NVM writes

Bad

当哈希空间负载率很高时,引起的额外写代价很大,eg:大于50%时,When the hash table has a high load factor, e.g., > 50%, an insertion usually causes tens of eviction operations [MSST, 2017]

Resizing

Bad

resize操作要求所有数据都执行reHash操作,时间复杂度为O(n)

Consistency

Bad

2.3.1.3 Cuckoo hash的一些变种

Hopscotch hashing ,发表于HERLIHY, M. , SHAVIT, N . , ANDTZAFRIR , M . Hopscotch Hashing. In DISC ( 2008) .

是cuckoo哈希算法的改进版,提高了其利用率和并发度[INFLOS'15]。该算法处理碰撞的方法是分配连续的备选位置,连续分配的位置称为hop distance,

通常hop distance大小设为cache line的整数倍,这样可以较好的利用CPU,因为CPU每次访问数据都是一次性读入一个cache line大小。

对于插入操作。插入操作如下:

第一步: 对key值hash,根据hash值找到位置,如果为空直接把key插入即可。

第二步: 否则,依次遍历hop distance找到一个空位置,把key值插入。

第三步: 如果hop distance中没有空位置,则尝试将该范围内的元素剔除,被踢出来的key值,需要重新插入,直到没有key被踢出为止。如此往复。

直到被踢的次数达到一个上限,才确认哈希表已满,并执行rehash操作。

总结:因为NVM在性能上的读写不对称性,Cuckoo和Hopscotch在insert操作时,cascading write会引起极大的性能降低。

2.3.2 FPHT 

(待更新)

2.3.3 Path Hashing (MSST'17)

2.3.3.1 简要介绍

与2-path和cuckoo hash算法一样,Leveling Hash也是使用两个hash函数来降低哈希冲突,所不同冲突时他们的处理方式。Leveling Hash 在逻辑上构建了一个二叉树结构,叶子节点是原始映射的哈希地址,非叶子节点是发生哈希冲突时的备选位置。实际上存储方式是如右图所示的扁平的结构,每个叶子节点的备选位置的地址是直接可以通过计算得到的。不同level的entry分布在不同的内存页,所以不同level搜索的过程可以并发起来

            

2.3.3.2 详细介绍

① l的备选路径path-l的地址计算算法

叶子节点l的备选路径path-l的地址计算算法如下:

【举例说明】以上图L=3的树为例,叶子节点l(存在l-th位置)的备用节点的位置计算如下:

9 13 15

l=l/2取下整 = 1

P[1]=9=1 + 2^4 - 2^3

P[2]=13=1 + 2^4 - 2^2

P[3]=15=1+ 2^4 - 2^1

② 插入元素

使用两个哈希算法h1,h2计算出哈希位置l1和l2,

如果l1或l2位置为空(也就是token==0),那么就直接将元素插入空的位置,并把token值置为1;

如果l1或l2位置不为空(也就是token==1),那么用①中的算法找到位置l1和l2的备选路径path-l1,path-l2,

如果path-l1,path-l2有空的位置,找到路径上空的位置插入,并把token值置为1;

如果path-l1,path-l2没有空的位置,那么就说明需要resize哈希表了。

③ 删除元素

删除过程就是插入过程的逆过程

2.3.3.3 性能分析

(待更新)

2.3.4 Level Hashing

(待更新)

References:

<Cuckoo Hash 基本思想和代码实现> https://blog.csdn.net/suwei19870312/article/details/7442786

NVM(非易失存储介质)在索引结构中的机遇与挑战(未完,整理中...)相关推荐

  1. 华为数据之道(2):非数字原生企业数字化转型的4个挑战

    注:微信公众号不按照时间排序,请关注"亨利笔记",并加星标以置顶,以免错过更新. 新书消息: 秋天里的第一本云原生巨著:<Harbor权威指南> 我们云原生实验室从事着 ...

  2. 聚簇索引、非聚簇索引、普通索引、唯一索引

    一.聚簇索引 VS 非聚簇索引 聚簇索引:将数据存储与索引放到了一块,找到索引也就找到了数据 非聚簇索引:将数据存储于索引分开结构,索引结构的叶子节点指向了数据的对应行,myisam通过key_buf ...

  3. MySQL聚簇索引:叶子保存主键或unique字段+data 非聚簇保存索引字段

    非聚簇索引:索引与真实数据文件不在一个文件中 myisam的一个数据表table中,它是有table.frm.table.myd以及table.myi组成. table.myd记录了数据,table. ...

  4. 必知必会SQL(贰) --索引(聚集[簇]索引和非聚[簇]集索引) vs 全文本索引

    ①联结 定义:基于两个表之间相等的查询:等值联结(equijoin)也称内部联结 eg: SELECT a,b,c FROM A ,B WHERE A.a=B.a SELECT a,b,c FROM ...

  5. MySQL中的聚簇索引、非聚簇索引、联合索引和唯一索引

    一.索引类型 索引根据底层实现可分为B-Tree索引和哈希索引,大部分时候我们使用的都是B-Tree索引,因为它良好的性能和特性更适合于构建高并发系统. 根据索引的存储方式来划分,索引可以分为聚簇索引 ...

  6. STT-MRAM非易失存储器特点及应用

    STT-MRAM非易失性随机存取存储器是一款像SRAM一样 高速.高耐久性.单字节访问的工作,也可以像ROM/Flash一样非挥发性,保留时间长的存储.MRAM供应RAMSUN供技术支持. STT-M ...

  7. 基于双目视觉的非标机械臂的空间定位流程(未完待续)

    文章目录 系统 坐标系变换原理 双目标定 原理 准备 步骤 图像极线校正.对应点匹配.空间定位 图像校正 计算视差 计算深度 目标点空间定位 三维重建 手眼标定(eye-in-hand ) 问题故障解 ...

  8. 演讲实录丨中科大陈小平教授《从封闭性到非封闭性:2020到2035年智能机器的机遇和挑战》...

    来源:中国人工智能学会 陈小平 中国科学技术大学机器人实验室主任.教授 以下是陈小平教授的演讲实录: 非常高兴有这个机会进行中.新学术交流.本报告包括四方面内容.第一,关于人工智能(简称AI)的两种类 ...

  9. 华为大数据战略_任正非:华为应抓住“大数据”机遇 抢占战略制高点

    OFweek 以下为讲话摘要: 首先是感谢大家,一年来取得了不少成绩,第二是拜个年,给企业业务全体员工拜年,给全体员工的家属拜年. 一.先讲两句离题的话. 最近我写了两篇文章,在传播过程中引发了一些误 ...

最新文章

  1. 公路修建问题(二分+最小生成树)
  2. spring执行定时任务
  3. 【计算机网络(微课版)】第2章 物理层 课后习题及答案
  4. 基于AgileEAS.NET企业应用平台实现基于SOA架构的应用整合方案-开篇
  5. 删了自己写的代码?判刑10个月!
  6. iOS-FMDB 使用
  7. 关于Ajax的get与post浅分析,同步请求与异步请求,跨域请求;
  8. STM32读写ADXL345 中断功能
  9. 随机向量函数链神经网络(RVFLNN)
  10. 抢票软件不靠谱?不如看看用AI怎么玩转12306
  11. 37岁,跨专业学习Java
  12. 向您推荐一个免费的装修门户网站
  13. Sprig的EL表达式和读取Properties文件教程
  14. 如何卸载有密码保护的Symantec Endpoint Protection v11
  15. vector多维向量初始化等操作
  16. The Phantom of the Opera 歌剧魅影
  17. POJ 3278 Catch That Cow java 二分法 加 组合算法
  18. RTMP推流协议视频直播点播平台/人脸识别系统EasyDSS 定制标签检索功能检索数据出错的问题排查
  19. C# 学习笔记 1.初识
  20. HI5 2.0 交互 SDK 用户手册—— HTC Vive 系列

热门文章

  1. openwrt x86 登录不上_openwrt x86的安装与使用
  2. 【赠书】《ATT&CK框架实践指南》
  3. 一些经典但惊人的知识
  4. MBA-day11数学-浓度问题-练习题
  5. 流媒体技术知识梳理整合
  6. 虚拟机和物理机之间互ping【局域网内ping不通,防火墙规则更改(win7为例)】
  7. ASP 3.0高级编程(四)
  8. win7计算机管理中没有本地用户,帮你win7系统计算机管理中没有本地用户和组的设置教程...
  9. 计算机里没有显示用户和组,小编面对win7系统计算机管理中没有本地用户和组的解决技巧...
  10. Milogs正式发布工作日志管理软件