概述
闪存是一种电可擦除可编程只读存储器(Electrically Erasable ProgrammableRead Only Memory,EEPROM),具有非易失、读写速度快、抗震、低功耗、体积小等特性,目前己广泛应用于嵌入式系统、航空航天、消费电子等领域。
闪存存储器主要分为NOR型(Not OR,或非门)和NAND型(Not AND,与非门)两种,NOR型闪存有独立的地址线和数据线,它支持按位进行访问,具有高可靠性且随机读取速度较快,但NOR闪存的擦除和写操作速度较慢、容量小、价格昂贵,主要用于存储程序代码并在内存中直接运行。NOR闪存在手机上得到了广泛的应用。NAND闪存相对于NOR型闪存拥有更大的容量,适合进行数据存储。
此外,它类似于传统的机械硬盘,对于小数据块的操作较慢,对于大数据块操作较快。NAND闪存根据其芯片单元所能存储的比特位数又可分为单级晶胞(SLC)和多级晶胞(MLC)两类。MLC技术具有显著的存储密度优越性,相对于SLC每个单元仅能存储1位比特,MLC可以存储多位比特,但MLC在速度和可靠性方面还有一定的提升空间。
国内外研究现状
闪存数据库的相关研究包括若干方面:缓冲区管理、数据库索引管理、查询处理和事务恢复和基于闪存的混合存储数据管理等。其中闪存数据库索引的优化对于降低I/O操作代价、提高数据库查询效率、提升数据库性能有着重要作用。
数据库索引记录了数据和其存储地址的映射关系,利用索引可以快速访问数据库表中的特定信息,降低I/O操作代价、提高查询效率。但是,由于数据库索引需要反映数据库存储位置的变化,因此,当数据发生更新时,索引也需要随之更新,这造成了一定量的读写操作。闪存相对于磁盘具有读写不对称的特性,其写代价远远高于读代价,而传统的数据库索引结构并没有考虑这个特点,这导致了数据库直接移植到闪存上会造成性能下降。以B+树索引为例,B+树结点更新往往只是针对小部分数据的修改,而闪存以页为最小单位进行读写,少量数据更新也会使整个页面被重写:同时,由于闪存的写前擦除特性,索引更新也会带来大量擦除操作,这将极大降低索引性能和寿命,因此,减少索引更新代价是闪存数据库索引管理需要解决的主要问题。
目前,国内外不少研究人员提出了许多具有代表性的研究方法,其主要思想分为以下两种:
(1)通过优化索引结构提升性能。这类方法通过改进传统的B+树索引结构或者根据闪存特点设计新的索引结构,使新的索引较传统的B+树索引更适应于运行在闪存存储介质上,并利用闪存读写不对称以及不需要寻道时间等特点,最终降低索引更新代价并提高数据查询效率,目前主要的优化方式包括-Tree索引、MircroHash索引、PBFilter索引等。
(2)通过延时更新索引变更信息的方式提升性能。延时更新方法将数据更新引发的索引变化首先缓存在内存中,当缓存的数据满足设定条件时再执行批量更新操作。延迟更新通过消除冗余操作和批量提交的方式减少了写操作代价,使B+树索引结构在闪存存储介质上获得了更好的性能,相关的主要算法有:BFTL、IBSF、LA-Tree、Lazy-Update B+-Tree、UMB+-tree、FD-tree等。
基础读写控制
闪存作为一种新兴的存储介质,不同于传统的机械存储或易失性的随机存储,其独特的控制指令和读写时序需要专门控制逻辑的支持。
早在20世纪90年代初,闪存还没有从EEPROM的类别中独立出来,K.Seki和T.Nakayama等,就提出了闪存控制电路的概念,当时的闪存还没有形成统一的标准和规范,因此控制电路也和闪存本身集成在一起,只针对某一特定的闪存结构。
随着闪存成为一种独立的存储介质,其控制指令和读写时序也在不同厂商之间形成了统一的协议,闪存控制电路得以独立出来不再依托于特定的闪存结构。2006年Chuan-Sheng Lin等针对SD卡等当时闪存的常见应用,提出了具有实用意义的闪存控制器,除了具备基础的读写控制功能以外,还集成了简单的BCH 码检错纠错功能,但是对于闪存按页读写特性带来的数据不对称问题,所提供的简单缓冲器并不能完全解决。
受到最早的闪存控制器的启发,2009年Ken Takeuchi等提出了重新将闪存控制器与闪存本身紧密结合的设计思想,通过在底层连接进行直接控制,极大降低了系统的功耗开销,但是这种思路需要深亚微米工艺的支持而且需要从闪存到控制器的全定制设计,并不适合一般用途的大容量闪存芯片。
2013年Koushel Agarwal等提出了另一种思路,以算术逻辑单元为基础,大部分的接口时序和指令发送都是以软件形式实现了对闪存的控制,资源开销很低,但是对于不同的闪存芯片用户的易用度不高。
相较于国外,中国国内在闪存方面的研究起步较晚,2011年Gong Xin等提出的闪存控制器,将之前控制器中常见的一组两个乒乓缓冲器合并为一个缓冲器,提高了缓存的利用率,也是在尽力试图解决闪存按页读写带来的相关问题。随着闪存技术的进步,闪存厂商们在之前异步接口的基础上,又进一步提出了以外部输入时钟为基准的同步接口,可以大大提高闪存的读写效率,不过与此相对的,新协议的出现也对闪存控制器的研究提出了新的要求。2012年Peng Qiang等提出了同时支持异步与同步协议的闪存控制器,对新型高端闪存芯片实现了兼容,但是在支持新协议的同时忽视了对闪存稳定性的保证,缺少了检错纠错单元。
存储层次
存储器从诞生之时起,就由于其结构和原理上的限制,在速度和数据格式上制约着处理器即运算单元的进一步发展,这一般被称为存储墙,而Cache正是解决存储墙问题最常见也是最有效的手段。根据Cache层次所面向的主存不同,设计Cache时的侧重点和优化思路也有显著区别。
位于CPU和易失性随机存储器之间的Cache,容量小速度快,块大小等主要参数不受额外条件制约。2007年付雄等从Cache理论的基础即程序局部性原理出发,利用程序分析和优化来改善程度的局部性,进而提高Cache的性能,无需专有硬件支持具有良好的跨平台特性。2012年唐铁轩等针对面向多线程应用的Cache,逐一分析失效率、失效开销以及命中时间等决定Cache性能的关键因素,提出了多种专为多线程应用设计的优化措施,2013年洪兴勇等基于自主研制的高性能DSP处理器,详细分析了指令Cache设计以及指令代码压缩等有助于从软件方面提高Cache性能的优化措施。
同样的在易失性存储器和下一级存储器,通常是闪存,之间也可以通过增加Cache的形式来提高整体的访存性能,这类Cache容量大速度相对较慢,设计时也需要考虑闪存页大小等因素对Cache相关参数的制约。2007年郝记生等通过在NAND型闪存中引入Cache机制,来实现与NOR型闪存类似的芯片内执行(XIP)功能,拓展NAND型闪存在指令存储领域的应用。2011年Zhiwei Qin等针对闪存容量增加带来的地址空间不断增加,提出一种两级Cache结构有选择地缓存所需页面地址,进而减少大容量闪存的寻址时间。2013年Renshuo Lin等提出了一种面向固态硬盘的耐用型ache,除了Cache原本提高访存性能的功能之外,还可以有效克服固态硬盘寿命有限的缺点,大幅提高固态硬盘的可用时间。
检错纠错
早期的闪存都是SLC结构,出错概率并不高,控制器一般都不包含检错纠错逻辑,随着MLC和TLC结构的普及,闪存的数据出错逐渐成为闪存的一个重要缺陷,错误修正成为闪存读写通路中的必备功能。提高数据可靠性的方法可以分为冗余和检错纠错码两类。
早在20世纪60年代,E.Midzuta就提出通过在数据传输过程中增加额外的一条并行路径,以冗余的思想提高可靠性,这种数据传输过程中的冗余,所需资源很少但是提升的可靠性有限,极端情况下不谈纠错,甚至根本无法判断是否出错。相比数据传输,针对存储器内数据的冗余需要长期稳定地保存,往往需要很高的硬件开销代价。2016年Shengyang Mao等在传统三模冗余的基础上,提出了所谓最佳划分的三模冗余机制,在保证数据可靠性的同时减少了硬件的额外开销。
对于一些成本敏感的应用,需要除了冗余以外的另一种保证可靠性的机制。在数学领域存在已久的一些特殊编码方式,现在被重新挖掘出来用于数据的检错纠错,相比冗余,检错纠错码只需少量的冗余位就可以记录数据的信息,再根据特定算法附加对应的编码解码逻辑,尽管纠错位数有限,但硬件开销大大降低。常见的检错纠错码可以分为分组码和卷积码两类,卷积码的问题在于它是非线性码,如果要基于硬件电路实现,线性的分组码更为适合。具体到分组码,主要包括汉明码、RS码和BCH码。最早被采用的是汉明码,1987年James E.Robertson等提出将汉明码应用于加减法等算术单元中,主要是为了应对人为攻击带来的结果不稳定。它结构简单所需冗余位也很少,但只能纠正一位错误或检测两位错误,2007年Zhao Jianwu等提出一种高基提高汉明码纠错能力的方案,并通过软件方式实现。2014年John Metzner等通过硬件方式实现对汉明码纠错能力的扩展,并仿照BCH码提出了(n, k, t)的定义格式。但总体来说,汉明码仍然主要应用于算术逻辑等出错位数较少的场合,应对如今数据密度越来越高的闪存能力有限。
接下来的Reed-Solomon(RS)码,纠错能力由冗余位决定的特点,使其成为真正适合新型闪存的检错纠错码。2003 年S.Gregori等以综述的形式,提出RS码应用在新型MLC结构闪存上的可能性,2008年Bainan Chen 等将RS码实际应用于MLC结构闪存,同时基于格雷码提出了一种新型位映射策略,2013年Shenzong Fu提出了一种可配置的RS码结构,在通用的结构框架下用户可以结合自身需求设置编码与解码逻辑的强度与复杂度。尽管RS 码相比之后的检错纠错码所需位数更少,编解码速度更快,但它有个致命缺点是非二进制码,这样带来的问题是检错到错误位之后还需要再进行计算来求得正确值,额外增加了计算量。
最后是目前最广泛使用的BCH码,它的概念在数学上的提出很早,与RS码类似,也是由编码生成的少量冗余位决定纠错能力上限。2009年Junho Cho等通过软件方式实现BCH编码与解码逻辑,此时的BCH码相关研究大多都是基于软件形式,尽管结构灵活但运行效率较低,2014年Shriharsha Koila等提出基于FPGA实现的BCH检错纠错码,但受限于FPGA平台资源,只能支持很短位数的原始信息编码。以硬件形式实现的BCH码,一类如这种同时支持编解码但位数有限,另一类如支持大数据但只有编码或解码逻辑,同时集成了大数据编解码的相关研究较少。
数据安全加密
对于存储器中数据的安全加密相关研究在国外起步较早,从理论到产品都有较为成熟的成果,国内则近几年才开始大力发展,也取得了很大进展。但不管国外还是国内,大多数产品的安全性主要是通过软件实现,限于成本和开发难度等因素,硬件形式的解决方案并没有大规模的应用。
2002年戴跃伟等提出了多媒体信息隐藏技术的概念,包括从数学模型到具体实现的全套解决方案,2012 年Safwan El Assad等提出了基于混沌发生器的信息隐藏技术,并讨论了将其应用在加密系统中的可能性。但是从本质上讲,所谓的信息隐藏只是一种伪加密手段,并没有对实际存储的数据有任何改动,在文件系统层面上的隐藏和口令等方式破解难度很低。
针对数据本身的加密处理,相关研究较多的集中在对算法本身的研究以及对应软件实现上。2010年El-Sayed Abdoul-Moaty ElBadawy等提出了一种混沌AES算法,将传统的仿射变换S盒子替换为基于混沌理论的另一种S盒子,复杂度少量增加带来了加密强度和性能的大幅提升。2012年丁传新等提出了一种基于虚拟磁盘的软件加密方案并应用于数据的移动存储,充分体现了软件方案的灵活性,可以自由简便地修改或更换加密算法。2015年Gaurav Raj等提出了针对云计算,综合三种密钥长度的AES算法,提高了用户对安全度选择的自由性和便捷性。与之相对的,加密算法的专用硬件实现则相对讨论较少,2010年Maoyin Wang 等提出单核或多核可配置的AES加密结构,同时支持128、192和256三种密钥长度,并可根据用户需求在性能和开销之前寻求平衡。
总体来说要实现对数据真正的保护,必须对数据本身进行加密处理,而软件和硬件方式各有优势与劣势,软件方式的灵活性,和硬件方式的高效率,分别适用于不同需求的各类应用。如果条件允许,硬件实现底层数据加密,软件构成上层文件系统的这种软硬件结合方式能够实现最好的数据保护效果。
存储介质及构成
闪存设备主要由闪存介质、闪存控制器两部分构成,如图1所示,闪存操作以闪存页(page)为读写单元,以闪存块(block)为擦除单元,设备内部的介质访问提供了通道(channel)、颗粒封装(package)、颗粒(die)、闪存片(plane)等多个级别的并行。设备内部以多通道方式组织闪存颗粒封装,每个通道上可连接多个颗粒封装,多颗粒封装之间共享传输通道,但可独立执行指令。每个颗粒封装内部包含两个或多个闪存颗粒,每个颗粒可被独立选中执行指令,颗粒内部可分为多个闪存片,每个闪存片含有一个闪存页大小的寄存器缓存,用于暂存读写数据。通过多个级别的指令并行执行,闪存设备充分利用介质的存取性能。闪存控制器主要负责地址映射、垃圾回收和磨损均衡,闪存通过异地更新的方式缓解闪存单元写前擦除的延迟。由于闪存单元的擦除次数有限,闪存控制器通过磨损均衡算法平衡设备内部闪存块之间的擦除次数,同时垃圾回收算法尽量选取擦除效率较高的块回收以控制写放大(writeamplification)。闪存控制器既要维护高效的数据地址映射查询,也要均衡设备内部磨损,控制写放大,以提高设备的整体寿命。闪存存储主要以固态盘(solid state drive,SSD)以及裸闪存两种形式存在。固态盘的方式是在设备内部通过闪存转换层(flash translation layer,FTI。)的转换可处理SATA命令,其外部的使用接口与传统磁盘没有差别。固态盘与传统磁盘在外部使用上差异极小,固态盘可以简单地替换磁盘,因而固态盘的形式为当前闪存存储的主要形式,包括个人笔记本、服务器、存储阵列等。
闪存内部结构图
特性
一个NAND型闪存芯片通常由若干个块组成,每个块又由若干页组成。例如,容量为1GB的三星K9WAG08U1AQ)闪存芯片包含8192个块,每个块由64个页组成,每一个页由数据区和备用区组成,2KB的数据区用于存储用户数据,64B的备用区用来存储校验、逻辑页地址等信息。闪存具备读、写和擦除3种操作,页是闪存的基本读写单位,重写数据前必须进行擦除,擦除操作以块为单位,执行时间和能耗远高于读写操作。在页被擦除前,SLC型闪存可以对同一个数据页进行多次写操作,最小写单元为512个字节。闪存芯片的读写方式与磁盘截然不同,二者的I/O操作性能对比见表1。
总的来说,闪存不同于磁盘的特性包括以下几点:
(1)无机械延迟,作为一种纯电子设备,闪存没有机器延迟,随机访问和顺序访问的开销相当,具有很高的随机读性能;
(2)读写不对称,闪存对不同类型访问操作表现的性能差别很大,一般来说,读速度很快,写入数据时,因为需要通过加压的方式对存储单元进行电子填充,所以速度较慢;
(3)异位更新。与磁盘的原位更新不同,对闪存数据进行重写需要先执行擦除操作,即便是只更新数据块中的一条数据也需要将整个块擦除,频繁的擦除操作会使系统性能显著降低。因此,闪存设备在更新数据时并不会直接在原位进行更新,而是先将原数据置为无效,然后把修改后的数据写到一个新的空闲页;
(4)擦除次数有限,闪存芯片的块擦除次数是有限制的,通常SLC闪存支持10万次擦除操作,MLC闪存数据存储密度高,可擦除次数在1万次左右,超过一定擦除次数的闪存单元将不再可用;
(5)低能耗。与磁盘相比,闪存的能耗更低,每GB读数据能耗只有磁盘的2%,写操作能耗不足磁盘的30%。闪存的出现为建设绿色数据中心以及低能耗数据管理系统提供了有力支持,闪存有比磁盘更加复杂的硬件特性,传统的磁盘数据库技术在闪存上并不适用,设计适用于闪存的结构、算法和应用是闪存数据管理必须要解决的一个重要问题。
分布式集群系统
FAWN(a fast array of wimpy nodes)是卡内基梅隆大学(Carnegie Mellon University,CMU)基于闪存介质构建的可扩展、低能耗、高性能的集群系统。与闪存加速卡和闪存阵列仅关注于I/o子系统的性能和可靠性的设计不同,FAwN从集群整体设计的角度考虑闪存与处理器的匹配以降低系统整体能耗。
在数据密集型计算环境下,1/o速度远不及CPU处理速度,CPU很多时候处于空闲等待状态,同时CPU的能耗随着频率的提高呈现超线性增长,FAWN采用低频低能耗CPU与闪存存储相匹配,提供数据密集型计算的集群系统,提高系统各组成部分的利用率,降低能耗FAwN实现了键值存储系统,以日志的方式进行更新,实现闪存的异地更新,FAWN可提供每焦耳高达364次查询请求,相比于桌面硬盘系统的每焦耳1.96次查询性能提升数百倍。
存储系统关键技术
闪存介质访问呈现低延迟、读写不对称的特点,与磁盘介质访问相比,随机性能提升很多。传统针对磁盘优化设计的软件系统直接用于闪存系统时,一方面带来了软件系统不必要冗余功能,另一方面隐藏了闪存可能带来优势。闪存的可靠性与传统磁盘设备不同,闪存单元的擦除次数有限,可靠性随着擦除次数的增加而下降,闪存的可靠性与闪存设备负载相关。此外,闪存体积小、能耗低,给低能耗的系统设计带来了机遇。