第1章 闪存和固态盘

大数据之门

《闪存数据库概念与技术》

厦门大学数据库实验室  林子雨  编著

本网页是第1章内容,全书内容请点击这里访问本书官网,官网提供本书整本电子书PDF下载

第1章 闪存和固态盘

闪存是一种新型的存储技术,已经在社会生产和生活的各个领域得到广泛应用。闪存具有速度快、体积小、质量轻、能耗低、抗震等特点,可以很容易被封装成各种存储产品,比如固态盘,取代传统硬盘作为各种应用系统的底层存储介质。

本章内容首先简要回顾计算机存储技术的发展历史,然后介绍闪存的分类、特性和应用,最后,介绍基于闪存的固态盘。

[概念区分]一般意义上的硬盘,包括机械式硬盘和固态硬盘。机械式硬盘,也称为普通硬盘,是磁盘的一种,靠盘片表面的磁性材料存储信息。当前PC机中配置的硬盘大都是机械式硬盘,这种机械式硬盘中包含了盘片、旋转轴和磁头,通过盘片的转动和磁头的移动来读取数据。固态硬盘,也可以简称为“固态盘”,是一种纯粹的电子存储设备,是一种半导体存储器,不包含任何机械部件,靠电路控制存储数据。固态盘可以采用多种不同类型的半导体存储芯片,比如闪存或者相变内存(PRAM),但是,当前市场上的绝大多数固态盘产品都采用闪存作为存储介质。因此,本书中的固态盘,特指采用闪存的固态盘。此外,为了避免两种不同类型的硬盘——机械式硬盘和固态硬盘——发生概念混淆,本书中,经常会用磁盘来指代机械式硬盘。

 

1.1    计算机存储技术

计算机已经广泛应用于人们的生产和日常生活,为人类社会的进步做出了巨大的贡献。从第一台现代意义的通用计算机EDVAC (Electronic Discrete variable Automatic Computer),到当前最先进的计算机,都采用了冯.诺依曼体系结构,即一台计算机是由五个基本部分组成的,包括运算器、控制器、存储器、输入装置、输出装置,程序和数据放在一起存储,在程序的控制下自动完成操作。

存储器是计算机系统中的记忆设备,用来存放程序和数据,包括输入的原始数据、计算机程序、中间运行结果和最终运行结果等。存储器根据控制器指定的位置存入和取出信息。存储器为计算机赋予了记忆功能,保证计算机系统正常开展各项工作。

存储器按照用途来划分,可以分为主存储器(内存)和辅助存储器(外存)。内存访问速度快,容量小,价格高,属于易失性存储,一旦断电,就会丢失所有信息,因此,通常用来暂时存放当前正在运行的程序和数据。外存访问速度要比内存慢许多,但是,容量大,价格低,属于非易失性存储,断电后也不会丢失信息,通常用来长期保存数据。

存储器按照存储介质来划分,可以分为半导体存储器和磁表面存储器。半导体存储器是由半导体器件组成的,主要包括随机存储器(RAM:Random Access Memory)、只读存储器(ROM:Read Only Memory)和高速缓存(Cache):

l  随机存储器RAM:包括静态随机存储器SRAM(Static RAM)和动态随机存储器DRAM(Dynamic RAM)。SRAM不需要刷新电路就可以保存它内部存储的数据,相反,DRAM则要求每隔一段时间就要刷新充电一次,否则,内部的数据就会丢失,因此,SRAM具有较高的性能。但是,SRAM存在一个明显的缺点——集成度较低,这意味着,在设计产品时,在相同的容量下,DRAM内存产品体积较小,而SRAM却具有较大的体积,而且功耗较大。

l  只读存储器ROM:对于只读存储器ROM而言,在制造的时候,信息(数据或程序)就会被永久保存到ROM中,一般只能读出,不能写入,即使发生断电,ROM中的信息也不会丢失。ROM一般用于存放计算机的基础程序和数据,比如,BIOS就是一个永久保存在ROM中的一个软件,是操作系统输入输出管理系统的一部分,包含了自检程序、基本启动程序和基本的硬件驱动程序等,主要用来负责机器的启动和系统中重要硬件的控制和驱动,并为高层软件提供基层调用。

l  高速缓存(Cache):是介于内存与CPU之间的一级存储器,速度接近于CPU,一般而言它不会采用DRAM技术,而是使用昂贵但较快速的SRAM技术。

磁表面存储器是由磁性材料做成,简称“磁盘”。当前比较常见的磁盘设备就是传统的机械式硬盘(HDD:Hard Drive Disk),或称为普通硬盘。机械式硬盘是计算机主要的存储媒介之一,既可以作为输入设备,也可作为输出设备。绝大多数机械式硬盘中,包括磁盘驱动器、适配器及盘片(如图[Hard-disk-drive](b)所示)在内的各个部件,被永久性地密封固定在硬盘驱动器中(如图[Hard-disk-drive](a)所示),避免和外界物体直接基础,确保数据的安全存取。机械式硬盘通常由一个或者多个铝制或者玻璃制的盘片组成,这些盘片外表面覆盖着一层铁磁性材料,用来记录数据。盘片的表面会被划分成多个磁道,每个磁道又被划分成多个扇区,每个扇区的大小是固定的512字节。如图[Hard-disk-drive](c)所示,在存取数据时,通过磁头的移动和盘片的转动这二者相配合,就可以到达指定的扇区读取数据,这个过程被称为“寻址”。机械式硬盘的寻址过程是硬盘IO中最耗时的部分,因为,需要通过硬盘中的马达,带动磁头移动和盘片转动。因此,对于机械式硬盘而言,往往具有很高的顺序IO,而随机IO的性能却很差,因为,随机读写需要不断反复移动磁头进行寻址。

图[Hard-disk-drive]机械式硬盘外观

(a)外观

图[Hard-disk-drive]机械式硬盘内部

(b)内部

图[Hard-disk-drive]机械式硬盘存储原理示意图

(c)存储原理示意图

图[Hard-disk-drive]机械式硬盘

 机械式硬盘凭借着较高的性价比(即容量大、每字节价格较低),一直以来都是永久性存储领域的首要选择,已经广泛地应用于个人和企业级存储解决方案中。但是,随着闪存技术的不断发展,机械式硬盘的地位开始动摇,基于闪存的固态盘已经有逐渐取代机械式硬盘的趋势。闪存是一种新兴的半导体存储器,从1989年诞生第一款闪存产品开始,闪存技术不断获得新的突破,并逐渐在计算机存储产品市场中确立了自己的重要地位。闪存是电可擦除可编程只读存储器(EEPROM:Electrically Erasable Programmable Read-Only Memory)的变种,比EEPROM的更新速度更快。闪存是一种非易失性存储器,即使发生断电也不会丢失数据,因此,可以作为永久性存储设备。但是,闪存不能像RAM一样以字节为单位改写数据,因此,闪存不能取代RAM。

1.2   闪存的原理、分类、特性和应用

本节将介绍闪存的工作原理、闪存的分类、闪存的结构、闪存的特性、闪存产品和应用。

1.2.1      闪存的工作原理

闪存是电可擦除可编程只读存储器(EEPROM)的变种,最初是由日本东芝公司开发出来去代替磁盘的。关于闪存的名字中为什么使用“闪”字,有一种说法是[LeeK07],一般的EEPROM需要逐一字节进行写入和擦除,而闪存可以在一次操作行为中同时写入一个页(包含512字节)或者擦除一个块(包含16或32个页)。

为了更好地理解闪存的工作原理,有必要首先了解可擦除可编程只读存储器(EPROM: Erasable Programmable Read-Only Memory)和电可擦除可编程只读存储器EEPROM。

EPROM由以色列工程师Dov Frohman发明的,是一种非易失性的半导体存储器,即断电后仍能保留数据。EPROM具有可擦除功能,擦除后即可进行再编程,写入数据。因此,在写入数据前,必须用强紫外线照射来擦除里面的内容,采用的方法是:用紫外线照射芯片上面的透明擦除窗口(如图[EPROM]所示)。EPROM的编程是借助于编程器来完成的。编程器是用于产生EPROM编程所需要的高压脉冲信号的装置。在编程时需要将等待写入EPROM的数据首先送到随机存储器中,然后启动编程程序,编程器会把数据逐行地写入EPROM中。数据被写入到EPROM中以后,可以大约保持10~20年,并能无限次读取。同时,为了确保数据安全,擦除窗口必须保持覆盖,以防偶然被阳光擦除(阳光中包含紫外线)。

图[EPROM]一款EPROM产品

图[EPROM] 一款EPROM产品

图[EPROM-theory]EPROM工作原理

图[EPROM-theory] EPROM工作原理

 

图[EPROM-theory]给出了EPROM的工作原理。EPROM常采用浮栅雪崩注入式MOS(Metal Oxide Semi-conductor)电路,它与MOS电路相似,在P型基片上生长出两个高浓度的N型区,通过欧姆接触分别引出源极和漏极。在源极和漏极之间有一个多晶硅栅极浮空在绝缘层中,与四周无直接电气联接,称为“浮栅”。这种电路以浮栅是否带电来表示存储1或者存储0。当需要往EPROM中写入数据时,在漏极加高压,电子从源极流向漏极,沟道充分开启。在高压的作用下,电子的拉力加强,能量使电子的温度极度上升,变为热电子,在控制栅施加高压时,热电子可以注入到浮栅中,使得浮栅带电。当浮栅带电以后,沟道就会处于关闭状态,在没有别的外力的情况下,电子会很好地保持在浮栅中。在需要清除电子时,可以利用紫外线进行照射,给电子足够的能量,使电子逃逸出浮栅,浮栅就不带电了。

EEPROM与EPROM相似,它是在EPROM基本单元电路的浮栅上面再生成一个浮栅,前者称为第一级浮栅,后者称为第二级浮栅。可以给第二级浮栅引出一个电极,使得第二级浮栅接某一电压VG。若VG为正电压,第一级浮栅与漏极之间产生隧道效应,使得电子注入第一级浮栅,即编程写入。若使VG为负电压,就会使得第一浮栅的电子散失,即擦除,擦除后可重新写入。

闪存通常包括NOR和NAND两种类型,其中,NAND闪存的基本单元电路与EEPROM类似,也是由双层浮栅MOS管组成。但是,NAND闪存的第一级浮栅的介质很薄,作为隧道氧化层。NAND闪存的写入方法与EEPROM相同,也是在第二级浮栅加正电压,使电子进入到第一级浮栅。当需要擦除EEPROM中的内容时,需要在源极加正电压,利用第一级浮栅与漏极之间的隧道效应,将注入到第一级浮栅的负电荷吸引到源极。由于利用源极加正电压擦除,因此,各单元的源极是连接在一起的,这样,擦除操作不能以字节为单位进行擦除,而是全片或者分块擦除,因此,NAND闪存的擦除代价较高。

1.2.2      闪存的分类

根据所采用的逻辑门类型的不同,闪存通常包括NOR和NAND两种类型。NOR闪存是由Intel公司开发的,是一种随机访问设备,具有专用的地址和数据线(和SRAM类似),以字节的方式进行读写,允许对存储器当中的任何位置进行访问,这使得NOR闪存是传统的只读存储器(ROM)的一种很好的替代方案,比如计算机的BIOS芯片。而NAND闪存则没有专用的地址线,不能直接寻址,是通过一个间接的、类似I/O的接口来发送命令和地址来进行控制的,这就意味着NAND闪存只能够以页的方式进行访问。相对于NOR闪存而言,NAND闪存只需要更少的逻辑门就可以存储相同数量的位,因此,NAND闪存比NOR闪存体积更小,存储密度更大。就读取速度而言,NOR闪存要比NAND闪存稍快一些;就写入速度而言,NAND闪存要比NOR闪存快许多。NAND闪存执行擦除操作比较简单,只需要擦除整个块即可。NOR闪存进行擦除时,需要把所有的位都写为1。NOR闪存虽然具备更快、更简单的访问过程,但是,存储能力比较低,因此,比较适合用来进行程序的存储。NAND闪存可以提供极高的单元存储密度(当前单个芯片具备了32GB的存储能力),比较适合存储大量的数据,并且写入和擦除的速度也很快;此外,NAND闪存的读写操作单元通常是一个扇区的大小(即512KB),这使得NAND闪存和磁盘的行为非常类似[InoueW04]。

在闪存发展的初期阶段,NOR闪存在市场上占据统治地位,但是,后来随着各种手持设备(比如MP3、手机和数码相机等)对数据存储量需求的快速增加,NAND闪存的市场占有率开始逐渐超越NOR闪存。作为NOR闪存的开发者,Intel公司也和生产NAND闪存的Micron科技公司合作成立了一个新的公司——IM闪存科技公司,涉足NAND闪存的生产。一些手机生产商也开始抛弃NOR闪存转而选择NAND闪存,而且,NAND闪存提供了和磁盘类似的标准访问接口,因此,目前市场上的存储产品很多采用了NAND闪存。

表[NAND-NOR] NAND和NOR闪存的比较

NOR闪存

NAND闪存

访问模式

线性随机访问

以页的方式进行访问

存储密度

存储能力比较低

单元存储密度高

擦写次数

10~100万次

1~10万次

擦写速度

写入和擦除的速度较慢

写入和擦除的速度很快

主要用途

比较适合用来进行程序的存储

比较适合存储大量的数据

 

就可靠性而言,可以从位反转和坏块处理这两个方面来比较NOR闪存和NAND闪存[Xiang09]:

(1)位反转现象:是指某些情况下闪存芯片上的一个位(bit)发生了反转,这种现象在NOR闪存和NAND闪存上都可能出现,不过出现的概率很低,而且前者发生反转现象的概率要远小于后者。为了增强NAND闪存的可靠性,系统往往使用错误探查和更正算法。

(2)坏块问题:主要与NAND闪存有关。NAND闪存在生产过程中,由于生产环节的各种因素,会不可避免地产生坏块,坏块在闪存产品中是随机分布的,这些坏块性能很不稳定,如果在成品中使用,会造成用户数据的丢失。因此,产品在发布使用前,需要对整个闪存空间进行初始化扫描,如果发现坏块,就把它标记为无效不可用,这些坏块会被事先预备的区域来替代,或者可以直接改变映射表,隔离这些坏块。

虽然NOR闪存和NAND闪存在特性上存在很多差异,但是二者也存在共同点,比如,对于二者而言,写代价和擦除代价都要明显高于读代价,都需要进行“写前擦除”操作,都存在擦除次数的限制等。

NAND闪存包含两种类型:SLC(Single-Level Cell)和MLC(Multi-Level Cell)。SLC的全称是“单层式存储”,即在每个存储单元中存储1位;MLC的全称是“多层式存储”,它采用较高的电压驱动,通过不同级别的电压在一个块中记录两组位信息,这样就可以在理论上将原本SLC的存储密度提升一倍。因此,MLC比SLC的存储密度更高。由于MLC比SLC价格更低,容量更高,因此,它已经被用于很多低端的消费类电子产品中,比如移动电话、MP3播放器、PDA和数码相机等。但是,SLC结构简单,在写入数据时电压变化的区间小,所以寿命较长,传统的SLC NAND闪存可以经受10万次的读写。由于SLC比MLC具有更高的速度和寿命(寿命通常是MLC的10倍[ChenKZ09]),因此,SLC大多用于对性能和可靠性要求较高的工业化应用中。

1989年,日本东芝公司发布了NAND闪存的结构,此后,NAND闪存的发展非常迅速。从1996年开始,NAND闪存芯片的存储密度每年都会翻翻。Chang-gyu Hwang[Hwang03]曾在2003年做出预测,到2012年,每个NAND闪存芯片的容量可以达到250GB,到2014年,每个NAND闪存芯片的容量可以达到1TB。Chang-gyu Hwang对闪存发展的预测,到2012年为止一直都是成立的。

MLC NAND闪存的市场仍然在不断扩大,主要是因为它的容量迅速扩大,而且性能也不断得到提升。如果没有特殊说明,在本文后面的内容中,闪存专门是指MLC NAND闪存。

1.2.3      闪存的结构

闪存是一种纯粹的电子设备,不包含任何机械部件,靠电路控制进行存取操作,具备良好的物理特性,体积小,质量轻,能耗低,抗震性能好。闪存的能耗较低,一般假设闪存中一个操作的时间和它的电能消耗成正比。图[flash-chip-sumsung]显示了一款三星闪存芯片产品SAMSUNG KLMBG8EEGM-8001的外观。

图[flash-chip-sumsung]一款三星闪存芯片产品外观

图[flash-chip-sumsung] 一款三星闪存芯片产品外观

单个闪存芯片可以提供很高的性能,读操作速率可以达到40MB/秒,写操作的速率可以达到10MB/秒,并且具有很低的能耗。因此,几十个闪存芯片并行连接,可以提供每秒成百上千个IO。一个闪存设备是由闪存芯片构成的,这些芯片并行连接到控制器,控制器中通常包含一定数量的缓存,比如16MB到32MB。

如图[flash-structure]所示,闪存芯片是由一组数据存储单元阵列组成的,包含许多个“块”,每个块又包含许多个“页”(通常是32个页),一个页通常是512字节,因为闪存被开发出来时的最初目的就是为了取代磁盘,因此,一个闪存页的大小和磁盘扇区大小保持了一致。一个页不仅包括数据区域(通常是512字节),还包含了一个额外的、小的备用区域(通常是16字节),或者称为“带外数据(OOB:Out of Band)”区域,它是用来存储一系列的管理信息,包括:(1)错误纠正码;(2)和存储在数据区域中的数据对应的逻辑页面编号;(3)页面状态[KimKNMC02]。在写数据的同时,就可以顺便把管理信息写入这些备用区域,额外开销有时候可以忽略不计。每个闪存页的状态可以是以下三种状态中的一种:(1)有效;(2)无效;(3)自由/擦除。当没有数据被写入一个页时,这个页就处于“擦除”状态,这时,页中的所有位都是1。一个写操作只能针对处于擦除状态的页,然后把这个页的状态改变为“有效”。异地更新会导致一些页面不再有效,它们被称为“无效页”。

图[flash-structure]闪存的结构

图[flash-structure] 闪存的结构

 闪存的一个块通常包含32个页,因此,一个块的大小通常是16KB,一般称这种闪存为“小块NAND闪存”。但是,一些高端应用需要更快的写和擦除速度,因此,闪存生产商开始生产“大块NAND闪存”,这类闪存中,一个块包含了64个页,每个页2212字节,因此,一个块的大小就是128KB。

图[Flash-chip]K9G8G08U0M芯片的阵列组织结构

图[Flash-chip] K9G8G08U0M芯片的阵列组织结构

图[Flash-chip]给出了一款来自三星公司的闪存芯片产品(K9G8G08UOM芯片)的阵列组织结构图[Samsung2006],从图中可以看出,这款闪存芯片一共包含4096个块,每个块包含128个页,每个页的数据区域大小是2KB,备用区域的大小是64B,因此,可以计算得到这款闪存芯片的容量是8448MB。

1.2.4      闪存的特性

闪存在最初始阶段,所有位都被设置成1,闪存的三种典型操作是读操作、写操作和擦除操作,三者对位的操作具体如下:

l  读操作:返回被读取目标页的所有位;

l  写操作:把目标页中选中的一些位从1变成0;

l  擦除操作:把目标块的所有位都设置为1。

闪存中的每个操作的能耗分别大约是:24uJ(读操作)、763uJ(写操作)和425uJ(擦除操作) [ZhengGSZJKW03]。

从技术角度而言,NAND闪存具有不同于磁盘的几个显著特点:

(1)没有机械延迟:和磁盘不同,闪存中不存在任何机械部件,就是一个纯粹的电子设备,可以通过电路实现直接寻址,读取数据,不需要像磁盘那样进行耗时的寻址。对于闪存而言,不管是顺序读取,还是随机读取,性能都没有区别,都可以获得较快的速度。因此,在闪存中,访问数据的时间开销几乎和要访问的数据量成正比,而与数据在闪存中的物理位置无关。

(2)写操作最小单元是页:一个写操作的最小单元是一个页,只对一个页的一部分进行写操作是不可能的。对于不同的产品,一个页的大小可能是2KB或者4KB[LeeKWCK09]。页面在块内部会被顺序写入,即当一个块中的第i页被写入后,块中的第j页(1<j<i)就不能被写入,直到这个块被擦除。

(3)写前擦除:闪存和磁盘在更新时采用两种不同的方式,前者采用“就地更新”,后者采用“异地更新”,两种方式的主要区别在于逻辑页是否总是被写入到同一个物理地址。磁盘采用“就地更新”的方式,在更新一个数据项时,首先找到这个数据项的存储位置,然后,就在原地执行更新操作,可以直接覆盖原来的数据。但是,闪存的更新方式则不同,并不支持对原来数据的直接覆盖,为了对存储在闪存中的现有数据项进行更新,必须在写入数据之前执行一个耗时的擦除操作,然后在这个擦除过的页面上写入新数据,擦除操作的平均延迟是1500微秒[AgrawalPWDMP08],比写操作慢得多。闪存的这个特性,严重制约了写操作的性能。为了避免每次更新操作都带来代价高昂的擦除操作,闪存一般采用“异地更新”的方式(如图[out-of-place-update]所示),即在更新数据时,把更新操作引导到其他空闲页执行,原来的旧数据所在的页可以暂时不擦除,只要简单设置为“无效”即可,只需要等到垃圾回收的时候才统一执行擦除操作。

图[out-of-place-update]异地更新

图[out-of-place-update] 异地更新

为了提高闪存性能,还应该通过各种其他方式尽量减少由写操作引起的擦除操作的数量,这个问题通常是由FTL机制来解决的(见本书第3章关于FTL的介绍)。对于封装了闪存芯片的固态盘而言,FTL作为核心组件会被固化到ROM中,而对于直接使用闪存芯片的掌上设备(如手机)而言,则是由操作系统(比如Windows Mobile)中的软件来实现FTL功能。一旦一个闪存设备中已经写入数据的页需要被更新,并且没有可用的擦除页,FTL必须执行下列操作:(1)确定一个要被擦除的块;(2)从这个块中读取所有有效的页到内存;(3)擦除这个块;(4)把有效页写回这个块;(5)把更新的页写入这个块。擦除操作是很慢的,同时,转移有效页也会增加额外的开销。因此,一个擦除操作的总代价取决于两个方面的因素:(1)擦除操作的代价被分摊到多少个写操作上面和(2)在每次擦除操作中,有多少个有效页被转移。比较理想的情况是,不需要拷贝任何有效页,在更新一个完整的擦除块时只需要进行一次擦除操作。

(4)擦除操作粒度比写操作粒度大很多:擦除操作的粒度通常要比写操作大许多,因为,写操作的最小单元是页,而擦除操作并不是有选择性地针对某个数据项或者页,而是必须擦除包含该数据项的整个块,这个块被称为“擦除块”,擦除块的尺寸要比页大得多,通常一个擦除块包含64个页或者128个页。此外,对于一个块而言,擦除次数是有限的。如果一个块被擦除的次数超过一定数量,这个块就会老化掉,变得不稳定。

(5)读写速度不对称:在闪存中,读取数据时,只需要获得闪存中某个存储单元的状态即可;相反,在写入数据时,则需要往相应的存储单元中填充电子直到达到一个稳定的状态。由此可知,闪存的读取数据和写入数据的速度是不相同的,前者要比后者快一个数量级。一般来说,读操作和写操作的访问延迟分别为25微秒和200微秒[AgrawalPWDMP08]。

表[flash-HDD-DRAM]中给出了不同类型的存储介质的每种操作的时间开销,可以看出,DRAM和磁盘都具有读写操作对称性,即读操作和写操作的时间开销都相同,而闪存则表现出了读写操作的不对称性,写操作的时间开销要比读操作高一个数量级。而且闪存中存在耗时的擦除操作,擦除操作的时间开销比读操作开销高两个数量级,而DRAM和磁盘中则不存在擦除操作。

 

表[flash-HDD-DRAM] 不同类型的存储介质的每种操作的时间开销

读操作 写操作 擦除操作
闪存 25微秒/512字节 200微秒/512字节 2毫秒/2KB
DRAM 100纳秒/字节 100纳秒/字节
磁盘 12.4毫秒/512字节 12.4毫秒/512字节

 

(6)存在快慢块的现象:即不是所有块的读写速度都一样。图[SSD-3-test-result]给出了一款由OCZ公司生产的固态盘产品在不同块大小时的测试结果[FanLM12],该款固态盘容量为60GB,采用了MLC NAND闪存芯片,接口类型为SATA2。图[SSD-3-test-result]中曲线显示了该固态盘产品的请求响应延迟随着请求偏移位置的变化而变化的情况。从图中可以看出,随着请求偏移大小的变化,请求响应延迟都会随着请求位置的增加而呈现出周期性的变化,并且在一个变化周期内,出现快慢两个阶段,这就说明这款固态盘产品具有快慢块的现象,即不是所有块的读写速度都一样。

图[SSD-3-test-result]某款固态盘在不同块大小时的测试结果

图[SSD-3-test-result] 某款固态盘在不同块大小时的测试结果

1.2.5      闪存产品和应用

闪存由于具备体积小、质量轻、能耗低、抗震性能好等优良特性,已经被广泛应用于各类消费电子设备中作为存储介质,包括数码相机、手机、PDA、MP3等小型数码产品。在这些设备中,闪存被制作成一张小的“卡片”,直接插入到设备插槽里,所以被称为“闪存卡”。根据不同的生产厂商和不同的应用,闪存卡的类型也不大相同(如图[flash-device]所示),主要包括SmartMedia(SM卡)、Compact Flash(CF卡)、MultiMediaCard(MMC卡)、microSD(TF卡)、Secure Digital(SD卡)、Memory Stick(记忆棒)、XD-Picture Card(XD卡)和微硬盘(MICRODRIVE)。虽然这些闪存卡在外观和规格上存在着很大的区别,但是底层的技术原理都是相同的。此外,闪存芯片还别封装制作成U盘和固态盘,前者主要用于个人新的存储,后者则越来越多地应用于企业级别的数据存储。闪存由于具有很好的抗震性能,因此,它在一些对抗震和防热要求较高的领域也得到了广泛的应用,比如应用在坦克和飞机中携带的嵌入式设备中。

目前市场上生产闪存产品的主要厂商包括金士顿、索尼、晟碟、Kingmax、鹰泰、创见、爱国者、纽曼、威刚、联想、台电等。

图[flash-device]采用闪存的电子设备

图[flash-device] 采用闪存的电子设备

需要指出的是,不同类型的磁盘产品的性能差别不大,因为,它们内部都是包含类似的磁头和碟片,寻址时间和旋转速度差异不大。但是,对于基于闪存的存储产品而言,不同产品的性能差异却是比较大的,如表[HDD-flash-performance]所示。廉价的低端闪存存储产品,比如USB存储棒或者相机存储卡,只能提供适中的读带宽,但是写性能很差。具有SATA接口的固态盘产品则能够提供更好的性能,比最好的磁盘速度还要快3倍以上,这主要归功于固态盘的内部设计,比如智能的块映射机制、对多个闪存芯片的并行IO访问和写缓冲等等。一些高端的固态盘产品的速度更快,采用了PCI-e连接接口,并且具有专用的设备驱动,而不是采用现有的SATA驱动。不同闪存产品的性能差异主要来自两个方面:首先,固态盘可以充分利用内部并行特性提高吞吐量;其次,固态盘可以利用智能的FTL机制来减少闪存“写前擦除”的代价。

表[HDD-flash-performance] 磁盘和不同闪存产品的性能比较

设备

顺序(MB/s)

随机4K-IO/s

磁盘

80

70

120-300/s

USB闪存

11.7

4.3

150/s

20/s

固态盘

250

170

35K/s

3.3K/s

PCI-e闪存

700

600

102K/s

101K/s

1.3    基于闪存的固态盘

闪存芯片可以被封装成固态盘产品,提供标准的访问接口和大容量的存储能力。本节首先介绍固态盘的特性、产品和应用,然后,介绍固态盘的内部结构,揭示固态盘内部并行特性,并给出探测固态盘内部特性的方法,最后,介绍了固态盘的性能,并给出了一些固态盘IO性能实验测试分析结果。

1.3.1      固态盘特性

固态盘是硬盘的一种,硬盘包括机械式硬盘(HDD:Hard Disk Drive)和固态硬盘(SSD:Solid State Disk,简称固态盘)。机械式硬盘属于磁盘设备,而固态盘则是半导体存储器。

固态盘是指用固态电子存储芯片阵列而制成的硬盘,由控制单元和存储单元组成。固态盘的接口规范和定义、功能及使用方法上与机械式硬盘完全相同,在产品外形和尺寸上也完全与机械式硬盘一致。固态盘已经广泛地应用于军事、车载、工控、视频监控、网络监控、网络终端、电力、医疗、航空等、导航设备等领域。虽然在当前阶段固态盘的成本较高,但是,它已经表现出广阔的应用前景,已经逐渐开始在各个应用领域取代传统的机械式硬盘。

固态存储技术在过去这些年不断取得新的进步,比如NAND闪存、磁性RAM、相变内存(PRAM)和铁电存储器(FRAM)等。其中,基于NAND闪存的固态盘(下文简称“固态盘”),更是得到了广泛的应用。由于采用闪存技术,固态盘继承了闪存的诸多优点,拥有一些传统机械式硬盘(或称为普通硬盘)无法比拟的优势:

(1)       读写速度快。机械式硬盘包含了机械部件,需要较长的寻址时间。固态盘采用了闪存技术,不包含机械部件,寻址开销几乎是0,可以忽略不计。固态盘的存取速度也要比机械式硬盘快许多。

(2)       能耗低、噪音小、体积小和抗震。固态盘是靠电路控制的设备,不包含任何机械部件和风扇,因此,体积比机械式硬盘更小,在使用过程中不会产生噪音,发热量和能耗也比机械式硬盘低,同时不怕外力冲击,具有较好的抗震性能。固态盘比机械式硬盘具有更大的工作温度范围,后者的正常工作温度范围在5~55摄氏度之间,而前者则可以在-10~70摄氏度之间正常工作。

(3)       竞争力不断增强。虽然从每字节价格而言,在目前阶段,固态盘要比机械式硬盘贵,但是,从每秒钟每个随机I/O的价格而言,固态盘要明显比机械式硬盘便宜得多[CanimMBRL10]。而且,固态盘的价格每年都在不断地迅速下降,它相对于机械式硬盘的竞争力会不断增强。

1.3.2      固态盘产品

固态盘的发展已经走过了二十几年的历程。1989年,世界上第一块固态盘产品出现。2006年3月三星公司发布了一款采用32GB容量的固态盘的笔记本电脑。2008年9月,以忆正MemoRight SSD的正式发布为标志,中国企业开始加速进军固态盘行业。2009年,固态盘行业进入高速发展时期,各大厂商纷纷加入固态盘研发和制造的队伍。2011年,固态盘的容量完成了从32GB到256GB的跨越,读取速度高达500MB/s。2012年,苹果公司在笔记本电脑上应用容量为512GB的固态盘[BaiduBaikeSSD]。

由于固态盘技术与机械式硬盘技术不同,所以产生了不少新兴的存储器厂商。厂商只需购买NAND存储器,再配合适当的控制芯片,就可以制造固态盘了。目前市场上比较常见的固态盘主要使用Indilinx、SandForce、JMicron、Marvell、Samsung和Intel等各种主控芯片。主控芯片是固态盘的核心部件,负责合理调配数据在各个闪存芯片上的存取,并且承担了整个数据中转任务,连接闪存芯片和外部接口(比如SATA接口)。不同的主控芯片之间的能力差异很大,在数据处理能力、算法、对闪存芯片的读取写入控制上,都存在非常大的区别,由此导致固态盘产品在性能上的差距可能会高达数十倍。表[SSD-control-chip]列出了一些主要的固态盘主控芯片品牌、型号和产品[BaiduBaikeSSD]。

[SSD-control-chip] 固态盘主控芯片品牌、型号、产品一览表

品牌

型号

代表产品

Intel

PC29AS21AA0、PC29AS21BA0

Intel 320 Series G3(80G)

SandForce

SF-1500/SF-1200、SF-2000系列

OCZ Agility 3 SATA3 60G

JMicron

JMF602、JMF612、JMF618

金士顿的SSD Now V系列

Marvell

88SS9174-BJP2、88SS9174-BKK2

Intel的510系列、镁光C400、浦科特 PX-128M2S

Indilinx

IDX110M00-LC、IDX110M01-LC

SOLIDATA K5-64Me

三星

S3C49RBX01-YH80、S3C29RBB01-YK40

三星 SLC 3.5 100GB

东芝

TC58NCF602GAT、TC58NCF618GBT、T6UG1XBG

金士顿 SSDNow V+100系列

  固态盘具有和机械式硬盘一样的I/O接口,比如SATA、PATA或PCMCIA接口,新一代的固态盘普遍采用SATA-2接口及SATA-3接口。例如,Samsung Standard Type MCAQE32G8APP-0XA就设计了1.8英寸的PATA接口,具备32GB的存储容量,该产品内部配置了Samsung K9WAG08U1A 16 Gbits SLC NAND闪存芯片(如图[SSD-PATA]所示)[LeeMPKK08]。

图[SSD-PATA]采用PATA接口的固态盘产品

图[SSD-PATA] 采用PATA接口的固态盘产品

图[SSD-SATA]给出了一款KINGDISK(金典)公司的固态盘产品KDSF12MXXX,外形尺寸为2.5寸,采用了SATA-2接口和MLC NAND闪存,存储容量包括60GB\120GB\240GB,缓存容量为64MB,4KB随机读IOPS为30000,4KB随机写IOPS为10000,平均存取时间为0.1ms,连续读速度和连续写速度分别可以达到283MB/s和271MB/s,采用了动态和静态的平衡擦除算法,读寿命为无限期,对于60GB容量的产品,每天写100GB资料,可以使用16年,工作温度范围在0-70摄氏度,存放温度为-40~85摄氏度,在25摄氏度下可以正常保存数据10年。该产品可以应用在所有笔记本及SATA接口的设备中。

图[SSD-SATA]采用SATA接口的固态盘产品

图[SSD-SATA] 采用SATA接口的固态盘产品

1.3.3      固态盘应用

由于采用相同的I/O接口标准,因此,对于上层操作系统而言,可以用完全相同的方法访问机械式硬盘和固态盘。因此,现有的基于磁盘的各种应用,不做任何修改就可以直接转移到固态盘上面。

固态盘可以帮助企业构建大型存储系统,提高数据访问速度。市场上已经有一些支持大型企业应用的固态盘产品,比如Texas Memory System的RamSan-500和EMC的Symmetrix DMX-4。三星和戴尔公司已经发布了完全采用固态盘的笔记本电脑[Samsung06]。目前,已经有一些知名企业开始在固态盘上部署各种企业应用。比如,苹果公司曾在部分音乐播放器上用闪存代替磁盘,Myspace.com已经在数据中心采用固态盘作为主要存储介质[Myspace],Facebook也发布了Flashcache,可以把数据缓存在固态盘中加速读写操作[Facebook]。全球领先的在线搜索引擎服务提供商——谷歌,宣布计划把现有的基于磁盘的存储系统,转移到基于固态盘的平台[Claburn08]。2008年8月,中国领先的在线搜索引擎服务提供商——百度公司,宣布以闪存及其配套技术全面代替磁盘存储,该公司承载全球检索及索引存储的运算集群中的硬盘已经全部拆除,百度也成为全球首个使用闪存技术代替磁盘并大规模商用的互联网公司。百度认为,全面采用闪存及其配套技术,可以大幅提高其服务能力和检索速度。根据IDC的预计,将有超过300万的固态盘被部署到企业中,仅在2011年,固态盘的市场规模就已经达到12亿美元[DatacenterSSD]。国际数据集团IDC公司曾在2009年作出分析,随着基于Web和云计算公司的需求的不断增加,直到2013年为止,企业级闪存设备都会保持每年165%的增长,并且有越来越多的数据库应用会运行在闪存设备上[Lawson09]。

1.3.4      固态盘结构

图[SSD-structure]给出了固态盘的内部结构,通常包括I/O接口、控制器、FTL、内置缓冲区和闪存存储器。

l  I/O接口:负责接收来自外部的读写请求,并返回结果。I/O接口一般采用和机械式硬盘类似的标准接口,比如SATA、PATA或PCMCIA接口,因此,固态盘可以直接被集成到那些原来采用机械式硬盘的系统中。

l  控制器:负责管理闪存空间,完成数据读写请求。控制器中包含三个主要组件,即处理器、缓冲区管理器和闪存存储器控制器。处理器负责从ROM中读取加载FTL,实现FTL各种功能;缓冲区管理器负责管理内置缓冲区;闪存存储器控制器负责闪存存储器的连接、控制、读写命令传输、地址传输和数据传输等等[FanLM12]。闪存存储器和闪存存储器控制器之间使用通道进行连接,由通道来实现命令、地址和数据的传输。不同通道之间可以实现并行操作。

l  FTL:FTL被固化到ROM中,ROM是非易失性存储,即使断电也不丢失信息,因此FTL可以一直保存在ROM中,当系统启动时,控制器就从ROM中读取加载FTL。FTL是最核心的组件,隐藏了闪存的特性,可以让线性的闪存设备看起来像一个虚拟磁盘。FTL的功能包括提供逻辑地址到物理地址的映射、断电恢复、垃圾回收和磨损均衡等。

l  内置缓冲区:用来存储地址映射表等信息,加快地址转换过程。有些固态盘采用专用的DRAM作为内置缓冲区来保存元数据或数据,而有些固态盘则采用成本相对低一些的、较小的SRAM, SRAM读写速度比闪存芯片快许多,但是,相对于闪存芯片而言,SRAM价格仍然较高,因此,通常一个固态盘配置的SRAM容量为闪存空间的3%到5%左右。此外,SRAM是易失性存储,一旦断电就会丢失信息。

l  NAND闪存芯片:是最终用来存储数据的物理介质,包含许多个块,一个块中又包含许多个页。固态盘在接收到读写命令、逻辑地址和数据大小等信息以后,FTL会把读写命令转换成一系列的闪存内部命令(读、写、擦除),并通过查找保存在SRAM中的映射表来实现逻辑地址到物理地址的转换。这个SRAM中的映射表,最初是通过对闪存可用的空间进行扫描后构建起来的,此后,更新操作会不断修改映射表条目,记录最新版本数据的物理存储位置。

 图[SSD-structure]基于NAND闪存的固态盘内部结构示意图

图[SSD-structure] 基于NAND闪存的固态盘内部结构示意图

1.3.5      固态盘内部并行特性

      在固态盘中,闪存存储器采用多级并行结构,每个级别的操作都可以并行执行或者交叉执行,从而可以拥有很高的数据存取效率。一般而言,固态盘可以包括以下几个级别的并行[ParkSSML10][ChenLZ11]:

通道级别并行:在一个固态盘中,闪存存储器包(flash memory package)会通过多个通道连接到控制器上,每个通道都可以独立并行操作。有些固态盘会采用多个ECC(Error Correction Code)引擎和闪存控制器,给每个通道都分配一个,从而可以获得更好的性能。

包级别的并行:为了优化资源利用率,一个通道会被多个闪存存储器包所共享,每个闪存存储器包可以独立操作。附加在同一个通道上的闪存存储器包,也可以交叉工作,因此,总线的利用率可以达到最优化。

晶粒级别的并行:一个闪存存储器包通常包含两个或者多个晶粒(die),每个晶粒可以被单独选择,并且独立于其他晶粒而执行自己的命令,从而大大增加了吞吐量。

面板级别的并行:一个闪存存储器晶粒通常包含两个或者多个面板。大多数闪存存储器支持在多个面板上并行执行相同的操作,包括读、写和擦除操作。

         在固态盘中,第1个级别的并行是多个通道之间的并行操作,即多个通道之间可以同时操作,如果通道数为n,我们就说第1级并行的并行度为n。图[SSD- structure-parallelism]给出了闪存存储器在通道上的组织方式的一个实例,其中,一个通道可以存取两个包,每个包中包含两个晶粒,每个晶粒中包含两个面板,每个面板中包含缓冲区寄存器、数据寄存器和4096个块,每个块包含了64个页,块是擦除操作的基本单元。从图中可以看出,这种组织方式实际上是一个4级并行结构,按照并行粒度从大到小的顺序分别是通道级并行、包级并行、晶粒级并行和面板级并行。在这种4级并行结构中,面板是最小粒度的并行操作单元,多个并行访问的面板可以构成一个晶粒,多个并行访问的晶粒可以构成一个包,多个并行访问的包可以连接到一个通道上。

图[SSD- structure-parallelism]固态盘的内部并行结构

图[SSD- structure-parallelism] 固态盘的内部并行结构

固态盘的内部并行特性,可以用来优化闪存数据库的各个模块,提高数据库整体性能,比如缓冲区管理、查询处理与优化、事务处理和索引等。比如,范玉雷等人[FanLM12]充分利用固态盘内部并行特性,对传统数据库表扫描操作进行了相应的改进,提出了一种并行表扫描模型ParaSSDScan,并在此基础上设计了一种高效的并行聚集操作模型ParaSSDAggr,通过此模型来实现几种常见的聚集操作;实验结果表明,这种并行表扫描和并行聚集操作相对于传统的数据库表扫描和聚集操作而言,性能分别提升了3倍和4倍,这充分说明了固态盘内部并行特性相对于传统机械式硬盘的优越性。

1.3.6      固态盘内部特性的探测

      了解固态盘内部结构特性,比如所采用的映射策略、块大小等,对于设计高效的数据存取策略,提高固态盘IO性能具有重要的意义。比如,如果固态盘采用了基于写操作顺序的映射策略——根据写操作到达的先后顺序把写操作分发到相应的闪存物理位置,那么,一些由于较差的映射而形成的物理数据布局,就会严重降低固态盘IO性能,因此,必须尽量避免形成这种较差的物理数据布局;再比如,如果能够知道固态盘中通道的数量,我们就可以设置一个正确的并发级别,避免过度并行化。

      但是,就目前而言,获取固态盘内部结构信息又是一件非常棘手的事情。因为,固态盘内部架构细节,通常是生产商的核心技术,往往不会对外公开。尽管固态盘生产商通常会提供一些标准参数,比如峰值带宽,但是,许多重要的信息都是缺失的,比如,包括映射策略等一些关键信息,都无法在生厂商提供的产品说明文档中找到,尽管这些信息对于充分了解和利用固态盘的性能而言是至关重要的。

         针对这个问题,一些研究通过设计特定的实验来探测发现固态盘内部的一些技术细节,比如,文献[ChenLZ11]在固态盘生产商已经公开的文档的基础上,定义了一个通用模型来抽象固态盘的内部结构。

1.3.6.1       探测模型

在文献[ChenLZ11]提出的通用模型中,一个域(domain)是一个共享了一组特定资源(比如通道)的闪存存储器的集合。一个域可以被进一步分区成多个子域,比如包。一个块(chunk)是一个被连续分配到一个域内的数据单元。多个不同的块可以通过映射策略,被交织放置在D个域中。比如,假设固态盘有2个域Dom1Dom2,现在要把4个块b1,b2,b3,b4写入到这2个域中,则采用交织方式进行存储的过程是,把b1放入Dom1,把b2放入Dom2,把b3放入Dom1,把b4放入Dom2

我们可以把固态盘看成一个“黑盒子”,并且假设固态盘中的映射遵循了一些可重复但是对于我们而言是未知的模式。通过向固态盘中注入精心设计的IO模式,就可以观察到固态盘的反应,然后记录一些关键指标,比如延迟和带宽。基于这些探测信息,我们就可以推测固态盘的内部结构和所采用的映射策略。

目前,文献[ChenLZ11]提出的通用模型可以通过实验方法探测到固态盘的以下三个关键技术参数:

l  块大小:一个被连续分配到一个域内的最大数据单元的大小。

l  交织度:在同一个层次的域的数量。交织度通常是由资源的冗余度来决定的,比如通道的冗余度。

l  映射策略:该策略决定了逻辑数据块被映射到哪个域,决定了物理数据布局。

在开展探测实验时需要注意以下事项[FanLM12]:

(1)主板BIOS需开启AHCI(Serial ATA Advanced Host ControllerInterface,串行ATA高级主控接口/高级主机控制器接口)模式,以支持固态盘接口逻辑中最新融入的NCQ技术,该技术对挖掘利用固态盘内部并行特性至关重要;

(2)固态盘文件访问需设置为DirectIO模式,以避免操作系统文件缓冲区的影响。

NCQ(Native Command Queuing)是SATA II标准引入的一个新特性。有了NCQ的支持,设备可以接收多个到达的命令,然后在内部对作业进行排序。NCQ对于固态盘而言,是尤其重要的,因为,当固态盘可以接收多个并行IO作业时,有了NCQ的支持,就可以充分利用固态盘较高的内部并行结构,获得很高的吞吐量。早期的固态盘产品不能支持NCQ,因此,无法从并行IO中获益。

1.3.6.2 探测方法和结果

1.3.6.2.1 块大小的探测

作为一个基本的映射单元,一个块只能被映射到一个域中,而两个连续的块则可以被映射到两个不同的域中。假设块的尺寸是S,对于任何读操作请求而言,可能包括以下两种情形:

(1)第一种情形:如果读操作的请求起始位置的偏移量是0,并且请求数据量大小不超过S,那么,这个读操作只需要涉及一个域;

(2)第二种情形:如果读操作的请求起始位置的偏移量是S/2,那么,这个读操作就需要跨越两个域。

很显然,在第二种情形下的读取速度要比第一种情形更快,因为,第二种情形跨越两个域,可以充分利用固态盘内部并行性,在两个域上并行执行读操作。基于这个特性,可以设计一个实验来确定块的大小。算法[SSD-chunk-size-probe]给出了探测块大小的伪代码。首先,需要对固态盘进行初始化,即采用顺序写操作写满整个固态盘。然后,设计不同IO请求大小的情形,即让IO请求大小从1个扇区变化到M个扇区,其中,M是预估的最大可能的块大小;接着,针对每种IO请求大小,分别测试在不同的IO请求偏移位置开始读取指定大小的数据量所需要的平均时间延迟,并绘制平均延迟曲线。随着IO请求起始位置偏移量从0开始逐渐增加,实验过程会不断分别经历上述的第一种和第二种情形,而每次经历第二种情形时,平均时间延迟都会降低,因此,平均延迟曲线会出现周期性的波动,而两个连续的波谷底部之间的距离就是块的大小。

 

算法[SSD-chunk-size-probe]:探测固态盘的块大小init_SSD(): 顺序写满固态盘rand_pos(A): 获取一个和第A个扇区对齐的随机偏移量read(P, S): 从偏移量P位置开始读取S个扇区;plot(X,Y,C): 为曲线C在(X,Y)位置绘制出一个点;M: 预估的最大可能的块大小;//开始探测块大小init_SSD(); //初始化固态盘空间for (n = 1 sector; n <= M; n *= 2) //IO请求的大小for (k = 0 sector; k <= 2*M; k ++)// IO请求的偏移量{for (i = 0, latency=0; i < 100000; i ++){pos = rand_pos(M) + k;//读取数据操作的起始位置

latency += read (pos, n);//读取数据并计算延迟,即从pos位置开始读取n个扇区的数据

}

plot (k, latency/100000, n); //绘制平均延迟曲线

}

图[SSD-chunk-size-experiment]显示了在某款固态盘上的测试结果,其中,每条曲线都代表了一个特定的IO请求大小,对于每个IO请求所对应的曲线,请求的起始位置偏移量在0-64个扇区之间进行变化。从图中可以看出,除了IO请求大小是1个扇区的情形以外,在所有其他情形下,随着请求起始位置偏移量的增加,曲线会出现周期性的波动。两个连续的波谷底部之间的距离就是块的大小。在这种情形下,探测到的块大小就是8个扇区(4KB)。

图[SSD-chunk-size-experiment]探测块大小时的平均延迟曲线

 图[SSD-chunk-size-experiment] 探测块大小时的平均延迟曲线

1.3.6.2.2  交织度的探测

当把多个不同块分配到多个域中时,对不存在资源共享机制的多个域中的数据执行并行访问,要比在一个域内部执行上述操作具有更高的带宽。基于这个特性,就可以设计实验来确定交织度,即处于同一层次上的域的数量。假设域的数量是D,数据被交织分布在这些域中,并且假设同时发起2个并行线程进行数据读取操作,每次读取n个块(n表示IO请求的大小,以块为单位),其中,对于第1个线程s1而言,从偏移量为0的位置开始读取n个块,另一个线程s2读操作跳跃d个块的偏移量后再读取n个块,这里的d被称为“跳读距离”。当s2读操作的跳读距离d的值增加到一定程度时,线程s2的读操作会跳跃经过若干个域,落入到和线程s1所处的相同的域中。由于两个线程并行执行,并行的数据访问就会竞争同一个资源,带宽就会降低。而采用其他跳读距离时,两个并行的线程就会分布到两个域中执行,因此,就会带来更高的带宽。由此,我们可以设计实验,让跳读距离在某个区间内变化,观测带宽曲线,曲线就会表现出周期性的波动,两个连续的波谷底部的距离就是交织度的大小。算法[SSD-interleaving-degree-probe]给出了探测固态盘交织度的伪代码。

算法[SSD-interleaving-degree-probe]:探测固态盘的交织度init_SSD(): 顺序写满固态盘;D:预估的最大可能的交织度;stride_read(d): 2个并发作业执行跳读操作,跳读距离为d//开始探测交织度init_SSD(); //初始化固态盘空间for (d = 1 chunk; d < 4*D; d ++)://跳读距离{bw = stride_read (d);//跳读数据并计算IO带宽plot (d, bw, j); //绘制带宽曲线}

 

         图[SSD-interleaving-degree]显示了在某款固态盘上的交织度测试结果,可以看出,随着跳读距离的变化,带宽曲线呈现周期性波动,周期是10,因此,可以得出这个固态盘的交织度是10,即拥有10个域。

图[SSD-interleaving-degree]固态盘交织度测试结果

图[SSD-interleaving-degree] 固态盘交织度测试结果

1.3.6.2.3 映射策略的探测

映射策略决定了一个逻辑页如何被映射到一个物理页。当前的固态盘产品中通常采用的映射策略主要包括以下两种:

(1)基于LBA(逻辑块地址)的映射:对于一个给定的块,如果固态盘的交织度为D,那么,这个块就会被映射到一个域编号(LBA mod D)。

(2)基于写顺序的映射:对于第i个写操作,这个块会被分配给一个域编号(i mod D)。

为了确定固态盘采用了哪种映射策略,可以首先向固态盘中随机写入1024MB数据,IO请求的大小为4KB,即一个块的大小。经过这种随机化写入操作之后,这些块会被分配到不同的域中。如果固态盘采用了基于LBA的映射,映射结果应该不会受到这种随机写操作的影响。但是,在经过几次反复实验后,原本随着跳读距离变化而周期性波动的带宽曲线的特征如果发生了变化,不再和原来测试结果相同,就说明随机写操作改变了块映射,那么这个固态盘肯定没有使用基于LBA的映射。比如,图[SSD-map-policy-test](I)给出了采用上述方法后的固态盘映射策略测试结果,从中可以看出,带宽曲线的周期性波动特征消失了,因此,可以说明这个固态盘肯定没有使用基于LBA的映射。

图[SSD-map-policy-test]固态盘映射策略测试结果

图[SSD-map-policy-test] 固态盘映射策略测试结果

可以进一步设计实验来确认一个固态盘是否采用了基于写顺序的映射策略。首先,我们向固态盘随机写入1024MB空间,每个块都唯一写入一次。然后,我们采用和块被写入的顺序相同的顺序,来发起针对固态盘的读操作,并且重复这个实验过程。例如,如果随机写操作的LBN(逻辑块编号)的顺序是(11,25,67,9……),那么,我们读数据的顺序也是(11,25,67,9……)。如果一个固态盘使用了基于写操作顺序的映射,这些块应该会被以写操作的顺序交织地分布到不同的域中,比如块11,25,67,9分别被交织分配到域0,1,2,3中。这个时候,采用相同顺序的读操作,就会重现我们之前观察到的相同的周期性波动带宽曲线。图[SSD-map-policy-test](II)中的实验结果验证了这种假设,说明这个固态盘确实采用了基于写顺序的映射策略。

1.3.7 固态盘性能

表[HD-SSD-comparion-01] 固态盘与磁盘的特性参数表一[Chenjianqiang10]

表[HD-SSD-comparion-01] 固态盘与磁盘的特性参数表一[Chenjianqiang10]

表[HD-SSD-comparion-01]给出了固态盘与磁盘的特性参数,从中可以看出,固态盘没有机械部件,体积小,重量轻,能耗低,抗震好,噪音低,相对于磁盘而言具有明显的优势。比如,在能耗方面,固态盘明显小于磁盘,固态盘在系统空闲期间的能耗甚至可以达到零。一般而言,当固态盘处于活动状态时,能耗在0.15到2瓦之间,当处于空闲状态时,可以低到0.06瓦。相反,SATA磁盘的能耗在13到18瓦之间,要比固态盘高6到10倍。按照每度电0.5元计算,一个SATA磁盘持续工作三年的电费消耗将会达到大约235元,如果再把空调制冷等费用计算进来,总计费用将会达到大约500元。而对于一个固态盘而言,持续工作三年的费用只需要大约50元。因此,如果考虑总体的设备能耗,固态盘相对于磁盘而言具有明显的优势。

表[HD-SSD-comparison] 机械式硬盘和固态盘的特性参数表二

SATA Disk

SATA Flash

FC Flash

ioD Flash

GB

500

32

146

320

/GB

$0.12

$15.62

$85

$30

WattsW

13

2

8.4

6

seq.readMB/s

60

80

92

700

seq.writeMB/s

55

100

108

500

ran.readIO/s

120

11,200

54,000

79,000

ran.writeIO/s

120

9,600

15,000

60,000

IO/s/

2.0

11.2

4.4

8.3

IO/s/W

9.2

5,600

6,430

13,166

表[HD-SSD-comparison]给出了一些机械式硬盘和固态盘的特性参数,从中可以看出,所有的固态盘都提供了比传统的机械式硬盘快10-100倍的随机读I/O,许多企业级的固态盘也可以提供和机械式硬盘相媲美的顺序读和写带宽。但是,固态盘的随机写性能,都要比读性能差。总体而言,固态盘在以下方面超越了机械式硬盘:价格性能指标IO/s/$(每美元的I/O速率)和能效指标IO/s/W(消耗每瓦特电能产生的随机I/O速率)。闪存固态盘的每GB的价格,正在以每年50%的速度下降,这要比机械式硬盘价格下降速度快许多。因此,我们可以预期,在每GB的价格方面,闪存固态盘将会和机械式硬盘逐渐缩小差距;在价格性能指标IO/s/$和能效指标IO/s/W方面,固态盘会逐渐超越机械式硬盘;在许多分析应用中,固态盘会逐步取代机械式硬盘。

但是,也应该注意到,固态盘并非在所有方面都优于传统的机械式硬盘,比如,在顺序读取方面,机械式硬盘的性能仍然要好于中低端的固态盘[LeeM07],只有一些高端的固态盘,比如FusionIO[FusionIO],在随机访问方面,比机械式硬盘的随机和顺序访问都具有更好的性能。因此,如果不考虑负载类型,盲目采用固态盘取代机械式硬盘,有时候会适得其反,恶化系统的性能。为了更好地说明这个问题,表[HDD-SSD-performance-comparision]给出了一款希捷的机械式硬盘产品和一款三星固态盘产品的性能比较,从中可以看出,在平均读写延迟方面,固态盘具有明显的优势,但是,在连续传输速率方面,机械式硬盘仍然要好于固态盘,也就是说,机械式硬盘具备更好的顺序读写性能。所以,在近期一段时间内,把固态盘应用于任何类型的企业应用负载是不现实的,由于固态盘可以让随机I/O为主的负载带来明显的性能改进,因此,固态盘当前应该重点服务于随机I/O负载[CanimMBRL10]。

表[HDD-SSD-performance-comparision] 机械式硬盘和闪存固态盘的性能比较

存储

磁盘

固态盘

平均延迟

8.33毫秒

0.2毫秒(读)

0.4毫秒(写)

持续传输速率

110MB/秒

56MB/秒(读)

32 MB/秒(写)

对于闪存固态盘而言,由于采用NAND闪存作为存储介质,而一个NAND闪存块被擦除的次数是有限制的,通常可以擦除1万到10万次[AgrawalPWDMP08],因此,闪存固态盘的寿命通常比机械式硬盘的寿命要短,不过,在实际应用中,二者的寿命不会有太大差距,都可以满足应用对数据可靠性的要求。例如,在6年时间内,以100MB/秒的速率对一个250GB的机械式硬盘进行持续的写操作,覆盖整个机械式硬盘的次数不会超过8万次。如果在闪存固态盘上采用一个日志结构的文件系统,以30MB/秒的速度对一个32GB的闪存固态盘进行连续的覆盖写操作,达到10万次大概需要3年半的时间[Graefe07]。因此,在平均使用情况下,固态盘的寿命可以达到5-10年,这是企业用户可以接受的。可以看出,闪存固态盘的寿命和可靠性,还是和机械式硬盘有得一拼的。

1.3.8  固态盘IO特性实验测试分析

 闪存的诸多特性决定了,闪存固态盘在不同的负载下会表现出和机械式硬盘不同的性能特性。文献[StoicaAJA09]在一个高端闪存固态盘FusionIO[FusionIO]上利用一个微型的测试基准uFLIP[BouganimJB09]进行了相关实验,展示了在大量随机写和顺序写负载下闪存吞吐量的变化情况。从图[Exp-On-FusionIO](a)可以看出,在对不同的闪存物理位置进行大量的随机写操作以后,闪存的吞吐量明显下降,性能下降幅度竟然达到了一个数量级以上,因为随机写操作会带来代价高昂的块擦除操作。在图[Exp-On-FusionIO](b)中,第0秒之前已经对FusionIO执行了大量随机写操作,此后开始执行大量顺序写操作。可以看出,在顺序读操作开始后的一段时间内(大约从第0到200秒),闪存吞吐量依然继续在下降,但是,此后慢慢增长回到了最初的高吞吐量阶段的水平,并保持稳定的性能状态。由此可以看出,闪存设备的性能高度依赖于IO历史,随机写操作会引起响应时间上的巨大变化,导致性能恶化,即使在随机写操作停止后的一段时间内也会如此。该文作者由此得出结论,对于闪存设备而言,如果能够把随机写操作转换成顺序写操作,并且在进行写操作的时候增大IO尺寸,就可以获得明显的性能改进。

图[Exp-On-FusionIO]在固态盘FusionIO上面的随机写和顺序写

图[Exp-On-FusionIO] 在固态盘FusionIO上面的随机写和顺序写

Jim Gray等人[GrayF06]也用大量实验验证了闪存的读写特性。实验环境配置如下:32位的Windows Vista RC2 Build 5744平台,双核3.2GHz Intel x86 CPU,1 GB的RAM,32GB的三星NAND闪存盘。实验结果显示,在以512KB为单位进行顺序读写请求时,闪存盘可以为顺序读写请求提供很好的服务,每秒可以执行6,528个读操作,每秒可以执行写操作的数量是1,644个,可以看出,读性能要明显比写性能好。对于随机读写请求,闪存盘的性能表现令人失望。在以8KB为单位进行随机读写请求时,每秒可以执行2,800个随机读操作,于此形成鲜明对比的是,每秒只能执行27个随机写操作,可见,闪存上面的随机写操作的性能是比较差的。当然,导致随机写操作性能如此之差也是和实验平台相关的,Windows Vista采用了同步写技术,即在确认写操作完成之前,必须确保数据已经被写入到稳定的存储器上,如果采用缓冲区技术,把写操作先在缓冲区里排队,达到一定数量后一次性写入到稳定存储器上,会大幅度改进写操作的性能。

         文献[LvCC09]对固态盘和磁盘的相关IO性能进行了实验对比分析,作者选取了PQI 32G SSD和西部数据的机械式硬盘产品WD5000AAKS,在Windows XP操作系统下完成了大量测试工作。图[cuibin-01]显示了固态盘与磁盘的顺序与随机读取速度对比情况,可以看出,固态盘的顺序读取速度高于磁盘,随机存取性能高于磁盘1~2个数量级,主要是因为磁盘存在机械部件,寻址时间较高。随着块大小的增加,无论固态盘还是磁盘的读取速度都显著提高;在某个特定的块大小情况下,固态盘的顺序与随机读取速度相差不多。

图[cuibin-01]固态盘与磁盘的顺序与随机读取速度对比

图[cuibin-01] 固态盘与磁盘的顺序与随机读取速度对比

图[cuibin-02]给出了固态盘的顺序与随机写操作速度的对比结果,从中可以看出,固态盘的顺序写操作速度远远快于随机写操作,原因在于随机写操作会引起更多的擦除操作。特别要注意的是,在这个实验结果中,固态盘的随机写操作速度甚至要比磁盘慢一个数量级。可以看出,固态盘的随机写操作代价较高,因此,在设计基于固态盘的各种应用时(比如索引机制和缓冲区替换策略),应该尽量避免随机写操作,甚至有时候不惜以增加读操作为代价。

图[cuibin-02]固态盘的顺序与随机写入速度对比

图[cuibin-02] 固态盘的顺序与随机写入速度对比

图[cuibin-03]显示了文件系统下固态盘的读取与写入操作的速度。在块大小小于64 KB时,读写速度都会随着块大小的增加而显著提高,但是,当块大小超过64KB时,读写速度的提高幅度明显减小,不过,读与写操作依然存在比较大的速度差距。

图[cuibin-03]文件系统下固态盘的读取与写入速度

图[cuibin-03] 文件系统下固态盘的读取与写入速度

1.4  本章小结

本章内容主要围绕闪存和固态盘,是更好地理解闪存数据库的基础。首先,介绍了计算机存储技术,给出了存储介质的类别划分和不同存储介质的特点;然后,介绍了闪存的工作原理、分类、结构、特性、产品和应用;接下来,介绍了固态盘的相关知识,包括固态盘的特性、产品和应用,展示了固态盘的内部结构,从而揭示固态盘内部并行特性,并给出探测固态盘内部特性的方法;最后,介绍了固态盘的性能,并给出了一些固态盘IO性能实验测试分析结果。

1.5    习题

1、  阐述计算机存储介质的分类以及不同类型存储介质的特点。

2、  阐述闪存的特性,并比较闪存与传统的机械式硬盘的特性差异。

3、  阐述固态盘结构以及各个功能组件的功能。

4、  阐述固态盘内部不同级别的并行特性的具体含义。

5、  比较不同厂家的固态盘产品和传统的机械式硬盘在不同性能参数之间的差异。