闪存是一种新型的存储技术,已经在社会生产和生活的各个领域得到广泛应用。闪存具有速度快、体积小、质量轻、能耗低、抗震等特点,可以很容易被封装成各种存储产品,比如固态盘,取代传统硬盘作为各种应用系统的底层存储介质。
本章内容首先简要回顾计算机存储技术的发展历史,然后介绍闪存的分类、特性和应用,最后,介绍基于闪存的固态盘。
计算机已经广泛应用于人们的生产和日常生活,为人类社会的进步做出了巨大的贡献。从第一台现代意义的通用计算机EDVAC(ElectronicDiscretevariableAutomaticComputer),到当前最先进的计算机,都采用了冯.诺依曼体系结构,即一台计算机是由五个基本部分组成的,包括运算器、控制器、存储器、输入装置、输出装置,程序和数据放在一起存储,在程序的控制下自动完成操作。
存储器是计算机系统中的记忆设备,用来存放程序和数据,包括输入的原始数据、计算机程序、中间运行结果和最终运行结果等。存储器根据控制器指定的位置存入和取出信息。存储器为计算机赋予了记忆功能,保证计算机系统正常开展各项工作。
存储器按照用途来划分,可以分为主存储器(内存)和辅助存储器(外存)。内存访问速度快,容量小,价格高,属于易失性存储,一旦断电,就会丢失所有信息,因此,通常用来暂时存放当前正在运行的程序和数据。外存访问速度要比内存慢许多,但是,容量大,价格低,属于非易失性存储,断电后也不会丢失信息,通常用来长期保存数据。
存储器按照存储介质来划分,可以分为半导体存储器和磁表面存储器。半导体存储器是由半导体器件组成的,主要包括随机存储器(RAM:RandomAccessMemory)、只读存储器(ROM:ReadOnlyMemory)和高速缓存(Cache):
l只读存储器ROM:对于只读存储器ROM而言,在制造的时候,信息(数据或程序)就会被永久保存到ROM中,一般只能读出,不能写入,即使发生断电,ROM中的信息也不会丢失。ROM一般用于存放计算机的基础程序和数据,比如,BIOS就是一个永久保存在ROM中的一个软件,是操作系统输入输出管理系统的一部分,包含了自检程序、基本启动程序和基本的硬件驱动程序等,主要用来负责机器的启动和系统中重要硬件的控制和驱动,并为高层软件提供基层调用。
l高速缓存(Cache):是介于内存与CPU之间的一级存储器,速度接近于CPU,一般而言它不会采用DRAM技术,而是使用昂贵但较快速的SRAM技术。
磁表面存储器是由磁性材料做成,简称“磁盘”。当前比较常见的磁盘设备就是传统的机械式硬盘(HDD:HardDriveDisk),或称为普通硬盘。机械式硬盘是计算机主要的存储媒介之一,既可以作为输入设备,也可作为输出设备。绝大多数机械式硬盘中,包括磁盘驱动器、适配器及盘片(如图[Hard-disk-drive](b)所示)在内的各个部件,被永久性地密封固定在硬盘驱动器中(如图[Hard-disk-drive](a)所示),避免和外界物体直接基础,确保数据的安全存取。机械式硬盘通常由一个或者多个铝制或者玻璃制的盘片组成,这些盘片外表面覆盖着一层铁磁性材料,用来记录数据。盘片的表面会被划分成多个磁道,每个磁道又被划分成多个扇区,每个扇区的大小是固定的512字节。如图[Hard-disk-drive](c)所示,在存取数据时,通过磁头的移动和盘片的转动这二者相配合,就可以到达指定的扇区读取数据,这个过程被称为“寻址”。机械式硬盘的寻址过程是硬盘IO中最耗时的部分,因为,需要通过硬盘中的马达,带动磁头移动和盘片转动。因此,对于机械式硬盘而言,往往具有很高的顺序IO,而随机IO的性能却很差,因为,随机读写需要不断反复移动磁头进行寻址。
(a)外观
(b)内部
(c)存储原理示意图
图[Hard-disk-drive]机械式硬盘
机械式硬盘凭借着较高的性价比(即容量大、每字节价格较低),一直以来都是永久性存储领域的首要选择,已经广泛地应用于个人和企业级存储解决方案中。但是,随着闪存技术的不断发展,机械式硬盘的地位开始动摇,基于闪存的固态盘已经有逐渐取代机械式硬盘的趋势。闪存是一种新兴的半导体存储器,从1989年诞生第一款闪存产品开始,闪存技术不断获得新的突破,并逐渐在计算机存储产品市场中确立了自己的重要地位。闪存是电可擦除可编程只读存储器(EEPROM:ElectricallyErasableProgrammableRead-OnlyMemory)的变种,比EEPROM的更新速度更快。闪存是一种非易失性存储器,即使发生断电也不会丢失数据,因此,可以作为永久性存储设备。但是,闪存不能像RAM一样以字节为单位改写数据,因此,闪存不能取代RAM。
本节将介绍闪存的工作原理、闪存的分类、闪存的结构、闪存的特性、闪存产品和应用。
闪存是电可擦除可编程只读存储器(EEPROM)的变种,最初是由日本东芝公司开发出来去代替磁盘的。关于闪存的名字中为什么使用“闪”字,有一种说法是[LeeK07],一般的EEPROM需要逐一字节进行写入和擦除,而闪存可以在一次操作行为中同时写入一个页(包含512字节)或者擦除一个块(包含16或32个页)。
为了更好地理解闪存的工作原理,有必要首先了解可擦除可编程只读存储器(EPROM:ErasableProgrammableRead-OnlyMemory)和电可擦除可编程只读存储器EEPROM。
EPROM由以色列工程师DovFrohman发明的,是一种非易失性的半导体存储器,即断电后仍能保留数据。EPROM具有可擦除功能,擦除后即可进行再编程,写入数据。因此,在写入数据前,必须用强紫外线照射来擦除里面的内容,采用的方法是:用紫外线照射芯片上面的透明擦除窗口(如图[EPROM]所示)。EPROM的编程是借助于编程器来完成的。编程器是用于产生EPROM编程所需要的高压脉冲信号的装置。在编程时需要将等待写入EPROM的数据首先送到随机存储器中,然后启动编程程序,编程器会把数据逐行地写入EPROM中。数据被写入到EPROM中以后,可以大约保持10~20年,并能无限次读取。同时,为了确保数据安全,擦除窗口必须保持覆盖,以防偶然被阳光擦除(阳光中包含紫外线)。
图[EPROM]一款EPROM产品
图[EPROM-theory]EPROM工作原理
图[EPROM-theory]给出了EPROM的工作原理。EPROM常采用浮栅雪崩注入式MOS(MetalOxideSemi-conductor)电路,它与MOS电路相似,在P型基片上生长出两个高浓度的N型区,通过欧姆接触分别引出源极和漏极。在源极和漏极之间有一个多晶硅栅极浮空在绝缘层中,与四周无直接电气联接,称为“浮栅”。这种电路以浮栅是否带电来表示存储1或者存储0。当需要往EPROM中写入数据时,在漏极加高压,电子从源极流向漏极,沟道充分开启。在高压的作用下,电子的拉力加强,能量使电子的温度极度上升,变为热电子,在控制栅施加高压时,热电子可以注入到浮栅中,使得浮栅带电。当浮栅带电以后,沟道就会处于关闭状态,在没有别的外力的情况下,电子会很好地保持在浮栅中。在需要清除电子时,可以利用紫外线进行照射,给电子足够的能量,使电子逃逸出浮栅,浮栅就不带电了。
EEPROM与EPROM相似,它是在EPROM基本单元电路的浮栅上面再生成一个浮栅,前者称为第一级浮栅,后者称为第二级浮栅。可以给第二级浮栅引出一个电极,使得第二级浮栅接某一电压VG。若VG为正电压,第一级浮栅与漏极之间产生隧道效应,使得电子注入第一级浮栅,即编程写入。若使VG为负电压,就会使得第一浮栅的电子散失,即擦除,擦除后可重新写入。
闪存通常包括NOR和NAND两种类型,其中,NAND闪存的基本单元电路与EEPROM类似,也是由双层浮栅MOS管组成。但是,NAND闪存的第一级浮栅的介质很薄,作为隧道氧化层。NAND闪存的写入方法与EEPROM相同,也是在第二级浮栅加正电压,使电子进入到第一级浮栅。当需要擦除EEPROM中的内容时,需要在源极加正电压,利用第一级浮栅与漏极之间的隧道效应,将注入到第一级浮栅的负电荷吸引到源极。由于利用源极加正电压擦除,因此,各单元的源极是连接在一起的,这样,擦除操作不能以字节为单位进行擦除,而是全片或者分块擦除,因此,NAND闪存的擦除代价较高。
在闪存发展的初期阶段,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闪存在特性上存在很多差异,但是二者也存在共同点,比如,对于二者而言,写代价和擦除代价都要明显高于读代价,都需要进行“写前擦除”操作,都存在擦除次数的限制等。
1989年,日本东芝公司发布了NAND闪存的结构,此后,NAND闪存的发展非常迅速。从1996年开始,NAND闪存芯片的存储密度每年都会翻翻。Chang-gyuHwang[Hwang03]曾在2003年做出预测,到2012年,每个NAND闪存芯片的容量可以达到250GB,到2014年,每个NAND闪存芯片的容量可以达到1TB。Chang-gyuHwang对闪存发展的预测,到2012年为止一直都是成立的。
MLCNAND闪存的市场仍然在不断扩大,主要是因为它的容量迅速扩大,而且性能也不断得到提升。如果没有特殊说明,在本文后面的内容中,闪存专门是指MLCNAND闪存。
图[flash-chip-sumsung]一款三星闪存芯片产品外观
单个闪存芯片可以提供很高的性能,读操作速率可以达到40MB/秒,写操作的速率可以达到10MB/秒,并且具有很低的能耗。因此,几十个闪存芯片并行连接,可以提供每秒成百上千个IO。一个闪存设备是由闪存芯片构成的,这些芯片并行连接到控制器,控制器中通常包含一定数量的缓存,比如16MB到32MB。
如图[flash-structure]所示,闪存芯片是由一组数据存储单元阵列组成的,包含许多个“块”,每个块又包含许多个“页”(通常是32个页),一个页通常是512字节,因为闪存被开发出来时的最初目的就是为了取代磁盘,因此,一个闪存页的大小和磁盘扇区大小保持了一致。一个页不仅包括数据区域(通常是512字节),还包含了一个额外的、小的备用区域(通常是16字节),或者称为“带外数据(OOB:OutofBand)”区域,它是用来存储一系列的管理信息,包括:(1)错误纠正码;(2)和存储在数据区域中的数据对应的逻辑页面编号;(3)页面状态[KimKNMC02]。在写数据的同时,就可以顺便把管理信息写入这些备用区域,额外开销有时候可以忽略不计。每个闪存页的状态可以是以下三种状态中的一种:(1)有效;(2)无效;(3)自由/擦除。当没有数据被写入一个页时,这个页就处于“擦除”状态,这时,页中的所有位都是1。一个写操作只能针对处于擦除状态的页,然后把这个页的状态改变为“有效”。异地更新会导致一些页面不再有效,它们被称为“无效页”。
图[flash-structure]闪存的结构
闪存的一个块通常包含32个页,因此,一个块的大小通常是16KB,一般称这种闪存为“小块NAND闪存”。但是,一些高端应用需要更快的写和擦除速度,因此,闪存生产商开始生产“大块NAND闪存”,这类闪存中,一个块包含了64个页,每个页2212字节,因此,一个块的大小就是128KB。
图[Flash-chip]K9G8G08U0M芯片的阵列组织结构
图[Flash-chip]给出了一款来自三星公司的闪存芯片产品(K9G8G08UOM芯片)的阵列组织结构图[Samsung2006],从图中可以看出,这款闪存芯片一共包含4096个块,每个块包含128个页,每个页的数据区域大小是2KB,备用区域的大小是64B,因此,可以计算得到这款闪存芯片的容量是8448MB。
闪存在最初始阶段,所有位都被设置成1,闪存的三种典型操作是读操作、写操作和擦除操作,三者对位的操作具体如下:
l读操作:返回被读取目标页的所有位;
l写操作:把目标页中选中的一些位从1变成0;
l擦除操作:把目标块的所有位都设置为1。
闪存中的每个操作的能耗分别大约是:24uJ(读操作)、763uJ(写操作)和425uJ(擦除操作)[ZhengGSZJKW03]。
从技术角度而言,NAND闪存具有不同于磁盘的几个显著特点:
(2)写操作最小单元是页:一个写操作的最小单元是一个页,只对一个页的一部分进行写操作是不可能的。对于不同的产品,一个页的大小可能是2KB或者4KB[LeeKWCK09]。页面在块内部会被顺序写入,即当一个块中的第i页被写入后,块中的第j页(1 (3)写前擦除:闪存和磁盘在更新时采用两种不同的方式,前者采用“就地更新”,后者采用“异地更新”,两种方式的主要区别在于逻辑页是否总是被写入到同一个物理地址。磁盘采用“就地更新”的方式,在更新一个数据项时,首先找到这个数据项的存储位置,然后,就在原地执行更新操作,可以直接覆盖原来的数据。但是,闪存的更新方式则不同,并不支持对原来数据的直接覆盖,为了对存储在闪存中的现有数据项进行更新,必须在写入数据之前执行一个耗时的擦除操作,然后在这个擦除过的页面上写入新数据,擦除操作的平均延迟是1500微秒[AgrawalPWDMP08],比写操作慢得多。闪存的这个特性,严重制约了写操作的性能。为了避免每次更新操作都带来代价高昂的擦除操作,闪存一般采用“异地更新”的方式(如图[out-of-place-update]所示),即在更新数据时,把更新操作引导到其他空闲页执行,原来的旧数据所在的页可以暂时不擦除,只要简单设置为“无效”即可,只需要等到垃圾回收的时候才统一执行擦除操作。 图[out-of-place-update]异地更新 为了提高闪存性能,还应该通过各种其他方式尽量减少由写操作引起的擦除操作的数量,这个问题通常是由FTL机制来解决的(见本书第3章关于FTL的介绍)。对于封装了闪存芯片的固态盘而言,FTL作为核心组件会被固化到ROM中,而对于直接使用闪存芯片的掌上设备(如手机)而言,则是由操作系统(比如WindowsMobile)中的软件来实现FTL功能。一旦一个闪存设备中已经写入数据的页需要被更新,并且没有可用的擦除页,FTL必须执行下列操作:(1)确定一个要被擦除的块;(2)从这个块中读取所有有效的页到内存;(3)擦除这个块;(4)把有效页写回这个块;(5)把更新的页写入这个块。擦除操作是很慢的,同时,转移有效页也会增加额外的开销。因此,一个擦除操作的总代价取决于两个方面的因素:(1)擦除操作的代价被分摊到多少个写操作上面和(2)在每次擦除操作中,有多少个有效页被转移。比较理想的情况是,不需要拷贝任何有效页,在更新一个完整的擦除块时只需要进行一次擦除操作。 (4)擦除操作粒度比写操作粒度大很多:擦除操作的粒度通常要比写操作大许多,因为,写操作的最小单元是页,而擦除操作并不是有选择性地针对某个数据项或者页,而是必须擦除包含该数据项的整个块,这个块被称为“擦除块”,擦除块的尺寸要比页大得多,通常一个擦除块包含64个页或者128个页。此外,对于一个块而言,擦除次数是有限的。如果一个块被擦除的次数超过一定数量,这个块就会老化掉,变得不稳定。 (5)读写速度不对称:在闪存中,读取数据时,只需要获得闪存中某个存储单元的状态即可;相反,在写入数据时,则需要往相应的存储单元中填充电子直到达到一个稳定的状态。由此可知,闪存的读取数据和写入数据的速度是不相同的,前者要比后者快一个数量级。一般来说,读操作和写操作的访问延迟分别为25微秒和200微秒[AgrawalPWDMP08]。 (6)存在快慢块的现象:即不是所有块的读写速度都一样。图[SSD-3-test-result]给出了一款由OCZ公司生产的固态盘产品在不同块大小时的测试结果[FanLM12],该款固态盘容量为60GB,采用了MLCNAND闪存芯片,接口类型为SATA2。图[SSD-3-test-result]中曲线显示了该固态盘产品的请求响应延迟随着请求偏移位置的变化而变化的情况。从图中可以看出,随着请求偏移大小的变化,请求响应延迟都会随着请求位置的增加而呈现出周期性的变化,并且在一个变化周期内,出现快慢两个阶段,这就说明这款固态盘产品具有快慢块的现象,即不是所有块的读写速度都一样。 图[SSD-3-test-result]某款固态盘在不同块大小时的测试结果 闪存由于具备体积小、质量轻、能耗低、抗震性能好等优良特性,已经被广泛应用于各类消费电子设备中作为存储介质,包括数码相机、手机、PDA、MP3等小型数码产品。在这些设备中,闪存被制作成一张小的“卡片”,直接插入到设备插槽里,所以被称为“闪存卡”。根据不同的生产厂商和不同的应用,闪存卡的类型也不大相同(如图[flash-device]所示),主要包括SmartMedia(SM卡)、CompactFlash(CF卡)、MultiMediaCard(MMC卡)、microSD(TF卡)、SecureDigital(SD卡)、MemoryStick(记忆棒)、XD-PictureCard(XD卡)和微硬盘(MICRODRIVE)。虽然这些闪存卡在外观和规格上存在着很大的区别,但是底层的技术原理都是相同的。此外,闪存芯片还别封装制作成U盘和固态盘,前者主要用于个人新的存储,后者则越来越多地应用于企业级别的数据存储。闪存由于具有很好的抗震性能,因此,它在一些对抗震和防热要求较高的领域也得到了广泛的应用,比如应用在坦克和飞机中携带的嵌入式设备中。 目前市场上生产闪存产品的主要厂商包括金士顿、索尼、晟碟、Kingmax、鹰泰、创见、爱国者、纽曼、威刚、联想、台电等。 图[flash-device]采用闪存的电子设备 表[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 闪存芯片可以被封装成固态盘产品,提供标准的访问接口和大容量的存储能力。本节首先介绍固态盘的特性、产品和应用,然后,介绍固态盘的内部结构,揭示固态盘内部并行特性,并给出探测固态盘内部特性的方法,最后,介绍了固态盘的性能,并给出了一些固态盘IO性能实验测试分析结果。 固态盘是硬盘的一种,硬盘包括机械式硬盘(HDD:HardDiskDrive)和固态硬盘(SSD:SolidStateDisk,简称固态盘)。机械式硬盘属于磁盘设备,而固态盘则是半导体存储器。 固态盘是指用固态电子存储芯片阵列而制成的硬盘,由控制单元和存储单元组成。固态盘的接口规范和定义、功能及使用方法上与机械式硬盘完全相同,在产品外形和尺寸上也完全与机械式硬盘一致。固态盘已经广泛地应用于军事、车载、工控、视频监控、网络监控、网络终端、电力、医疗、航空等、导航设备等领域。虽然在当前阶段固态盘的成本较高,但是,它已经表现出广阔的应用前景,已经逐渐开始在各个应用领域取代传统的机械式硬盘。 固态存储技术在过去这些年不断取得新的进步,比如NAND闪存、磁性RAM、相变内存(PRAM)和铁电存储器(FRAM)等。其中,基于NAND闪存的固态盘(下文简称“固态盘”),更是得到了广泛的应用。由于采用闪存技术,固态盘继承了闪存的诸多优点,拥有一些传统机械式硬盘(或称为普通硬盘)无法比拟的优势: (2)能耗低、噪音小、体积小和抗震。固态盘是靠电路控制的设备,不包含任何机械部件和风扇,因此,体积比机械式硬盘更小,在使用过程中不会产生噪音,发热量和能耗也比机械式硬盘低,同时不怕外力冲击,具有较好的抗震性能。固态盘比机械式硬盘具有更大的工作温度范围,后者的正常工作温度范围在5~55摄氏度之间,而前者则可以在-10~70摄氏度之间正常工作。 (3)竞争力不断增强。虽然从每字节价格而言,在目前阶段,固态盘要比机械式硬盘贵,但是,从每秒钟每个随机I/O的价格而言,固态盘要明显比机械式硬盘便宜得多[CanimMBRL10]。而且,固态盘的价格每年都在不断地迅速下降,它相对于机械式硬盘的竞争力会不断增强。 固态盘的发展已经走过了二十几年的历程。1989年,世界上第一块固态盘产品出现。2006年3月三星公司发布了一款采用32GB容量的固态盘的笔记本电脑。2008年9月,以忆正MemoRightSSD的正式发布为标志,中国企业开始加速进军固态盘行业。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 Intel320SeriesG3(80G) SandForce SF-1500/SF-1200、SF-2000系列 OCZAgility3SATA360G JMicron JMF602、JMF612、JMF618 金士顿的SSDNowV系列 Marvell 88SS9174-BJP2、88SS9174-BKK2 Intel的510系列、镁光C400、浦科特PX-128M2S Indilinx IDX110M00-LC、IDX110M01-LC SOLIDATAK5-64Me 三星 S3C49RBX01-YH80、S3C29RBB01-YK40 三星SLC3.5100GB 东芝 TC58NCF602GAT、TC58NCF618GBT、T6UG1XBG 金士顿SSDNowV+100系列 固态盘具有和机械式硬盘一样的I/O接口,比如SATA、PATA或PCMCIA接口,新一代的固态盘普遍采用SATA-2接口及SATA-3接口。例如,SamsungStandardTypeMCAQE32G8APP-0XA就设计了1.8英寸的PATA接口,具备32GB的存储容量,该产品内部配置了SamsungK9WAG08U1A16GbitsSLCNAND闪存芯片(如图[SSD-PATA]所示)[LeeMPKK08]。 图[SSD-PATA]采用PATA接口的固态盘产品 图[SSD-SATA]采用SATA接口的固态盘产品 由于采用相同的I/O接口标准,因此,对于上层操作系统而言,可以用完全相同的方法访问机械式硬盘和固态盘。因此,现有的基于磁盘的各种应用,不做任何修改就可以直接转移到固态盘上面。 图[SSD-structure]给出了固态盘的内部结构,通常包括I/O接口、控制器、FTL、内置缓冲区和闪存存储器。 lI/O接口:负责接收来自外部的读写请求,并返回结果。I/O接口一般采用和机械式硬盘类似的标准接口,比如SATA、PATA或PCMCIA接口,因此,固态盘可以直接被集成到那些原来采用机械式硬盘的系统中。 l控制器:负责管理闪存空间,完成数据读写请求。控制器中包含三个主要组件,即处理器、缓冲区管理器和闪存存储器控制器。处理器负责从ROM中读取加载FTL,实现FTL各种功能;缓冲区管理器负责管理内置缓冲区;闪存存储器控制器负责闪存存储器的连接、控制、读写命令传输、地址传输和数据传输等等[FanLM12]。闪存存储器和闪存存储器控制器之间使用通道进行连接,由通道来实现命令、地址和数据的传输。不同通道之间可以实现并行操作。 lFTL:FTL被固化到ROM中,ROM是非易失性存储,即使断电也不丢失信息,因此FTL可以一直保存在ROM中,当系统启动时,控制器就从ROM中读取加载FTL。FTL是最核心的组件,隐藏了闪存的特性,可以让线性的闪存设备看起来像一个虚拟磁盘。FTL的功能包括提供逻辑地址到物理地址的映射、断电恢复、垃圾回收和磨损均衡等。 l内置缓冲区:用来存储地址映射表等信息,加快地址转换过程。有些固态盘采用专用的DRAM作为内置缓冲区来保存元数据或数据,而有些固态盘则采用成本相对低一些的、较小的SRAM,SRAM读写速度比闪存芯片快许多,但是,相对于闪存芯片而言,SRAM价格仍然较高,因此,通常一个固态盘配置的SRAM容量为闪存空间的3%到5%左右。此外,SRAM是易失性存储,一旦断电就会丢失信息。 lNAND闪存芯片:是最终用来存储数据的物理介质,包含许多个块,一个块中又包含许多个页。固态盘在接收到读写命令、逻辑地址和数据大小等信息以后,FTL会把读写命令转换成一系列的闪存内部命令(读、写、擦除),并通过查找保存在SRAM中的映射表来实现逻辑地址到物理地址的转换。这个SRAM中的映射表,最初是通过对闪存可用的空间进行扫描后构建起来的,此后,更新操作会不断修改映射表条目,记录最新版本数据的物理存储位置。 图[SSD-structure]基于NAND闪存的固态盘内部结构示意图 在固态盘中,闪存存储器采用多级并行结构,每个级别的操作都可以并行执行或者交叉执行,从而可以拥有很高的数据存取效率。一般而言,固态盘可以包括以下几个级别的并行[ParkSSML10][ChenLZ11]: l通道级别并行:在一个固态盘中,闪存存储器包(flashmemorypackage)会通过多个通道连接到控制器上,每个通道都可以独立并行操作。有些固态盘会采用多个ECC(ErrorCorrectionCode)引擎和闪存控制器,给每个通道都分配一个,从而可以获得更好的性能。 l包级别的并行:为了优化资源利用率,一个通道会被多个闪存存储器包所共享,每个闪存存储器包可以独立操作。附加在同一个通道上的闪存存储器包,也可以交叉工作,因此,总线的利用率可以达到最优化。 l晶粒级别的并行:一个闪存存储器包通常包含两个或者多个晶粒(die),每个晶粒可以被单独选择,并且独立于其他晶粒而执行自己的命令,从而大大增加了吞吐量。 l面板级别的并行:一个闪存存储器晶粒通常包含两个或者多个面板。大多数闪存存储器支持在多个面板上并行执行相同的操作,包括读、写和擦除操作。 在固态盘中,第1个级别的并行是多个通道之间的并行操作,即多个通道之间可以同时操作,如果通道数为n,我们就说第1级并行的并行度为n。图[SSD-structure-parallelism]给出了闪存存储器在通道上的组织方式的一个实例,其中,一个通道可以存取两个包,每个包中包含两个晶粒,每个晶粒中包含两个面板,每个面板中包含缓冲区寄存器、数据寄存器和4096个块,每个块包含了64个页,块是擦除操作的基本单元。从图中可以看出,这种组织方式实际上是一个4级并行结构,按照并行粒度从大到小的顺序分别是通道级并行、包级并行、晶粒级并行和面板级并行。在这种4级并行结构中,面板是最小粒度的并行操作单元,多个并行访问的面板可以构成一个晶粒,多个并行访问的晶粒可以构成一个包,多个并行访问的包可以连接到一个通道上。 图[SSD-structure-parallelism]固态盘的内部并行结构 固态盘的内部并行特性,可以用来优化闪存数据库的各个模块,提高数据库整体性能,比如缓冲区管理、查询处理与优化、事务处理和索引等。比如,范玉雷等人[FanLM12]充分利用固态盘内部并行特性,对传统数据库表扫描操作进行了相应的改进,提出了一种并行表扫描模型ParaSSDScan,并在此基础上设计了一种高效的并行聚集操作模型ParaSSDAggr,通过此模型来实现几种常见的聚集操作;实验结果表明,这种并行表扫描和并行聚集操作相对于传统的数据库表扫描和聚集操作而言,性能分别提升了3倍和4倍,这充分说明了固态盘内部并行特性相对于传统机械式硬盘的优越性。 了解固态盘内部结构特性,比如所采用的映射策略、块大小等,对于设计高效的数据存取策略,提高固态盘IO性能具有重要的意义。比如,如果固态盘采用了基于写操作顺序的映射策略——根据写操作到达的先后顺序把写操作分发到相应的闪存物理位置,那么,一些由于较差的映射而形成的物理数据布局,就会严重降低固态盘IO性能,因此,必须尽量避免形成这种较差的物理数据布局;再比如,如果能够知道固态盘中通道的数量,我们就可以设置一个正确的并发级别,避免过度并行化。 但是,就目前而言,获取固态盘内部结构信息又是一件非常棘手的事情。因为,固态盘内部架构细节,通常是生产商的核心技术,往往不会对外公开。尽管固态盘生产商通常会提供一些标准参数,比如峰值带宽,但是,许多重要的信息都是缺失的,比如,包括映射策略等一些关键信息,都无法在生厂商提供的产品说明文档中找到,尽管这些信息对于充分了解和利用固态盘的性能而言是至关重要的。 针对这个问题,一些研究通过设计特定的实验来探测发现固态盘内部的一些技术细节,比如,文献[ChenLZ11]在固态盘生产商已经公开的文档的基础上,定义了一个通用模型来抽象固态盘的内部结构。 在文献[ChenLZ11]提出的通用模型中,一个域(domain)是一个共享了一组特定资源(比如通道)的闪存存储器的集合。一个域可以被进一步分区成多个子域,比如包。一个块(chunk)是一个被连续分配到一个域内的数据单元。多个不同的块可以通过映射策略,被交织放置在D个域中。比如,假设固态盘有2个域Dom1和Dom2,现在要把4个块b1,b2,b3,b4写入到这2个域中,则采用交织方式进行存储的过程是,把b1放入Dom1,把b2放入Dom2,把b3放入Dom1,把b4放入Dom2。 我们可以把固态盘看成一个“黑盒子”,并且假设固态盘中的映射遵循了一些可重复但是对于我们而言是未知的模式。通过向固态盘中注入精心设计的IO模式,就可以观察到固态盘的反应,然后记录一些关键指标,比如延迟和带宽。基于这些探测信息,我们就可以推测固态盘的内部结构和所采用的映射策略。 目前,文献[ChenLZ11]提出的通用模型可以通过实验方法探测到固态盘的以下三个关键技术参数: l块大小:一个被连续分配到一个域内的最大数据单元的大小。 l交织度:在同一个层次的域的数量。交织度通常是由资源的冗余度来决定的,比如通道的冗余度。 l映射策略:该策略决定了逻辑数据块被映射到哪个域,决定了物理数据布局。 在开展探测实验时需要注意以下事项[FanLM12]: (1)主板BIOS需开启AHCI(SerialATAAdvancedHostControllerInterface,串行ATA高级主控接口/高级主机控制器接口)模式,以支持固态盘接口逻辑中最新融入的NCQ技术,该技术对挖掘利用固态盘内部并行特性至关重要; (2)固态盘文件访问需设置为DirectIO模式,以避免操作系统文件缓冲区的影响。 NCQ(NativeCommandQueuing)是SATAII标准引入的一个新特性。有了NCQ的支持,设备可以接收多个到达的命令,然后在内部对作业进行排序。NCQ对于固态盘而言,是尤其重要的,因为,当固态盘可以接收多个并行IO作业时,有了NCQ的支持,就可以充分利用固态盘较高的内部并行结构,获得很高的吞吐量。早期的固态盘产品不能支持NCQ,因此,无法从并行IO中获益。 作为一个基本的映射单元,一个块只能被映射到一个域中,而两个连续的块则可以被映射到两个不同的域中。假设块的尺寸是S,对于任何读操作请求而言,可能包括以下两种情形: (1)第一种情形:如果读操作的请求起始位置的偏移量是0,并且请求数据量大小不超过S,那么,这个读操作只需要涉及一个域; (2)第二种情形:如果读操作的请求起始位置的偏移量是S/2,那么,这个读操作就需要跨越两个域。 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]探测块大小时的平均延迟曲线 当把多个不同块分配到多个域中时,对不存在资源共享机制的多个域中的数据执行并行访问,要比在一个域内部执行上述操作具有更高的带宽。基于这个特性,就可以设计实验来确定交织度,即处于同一层次上的域的数量。假设域的数量是D,数据被交织分布在这些域中,并且假设同时发起2个并行线程进行数据读取操作,每次读取n个块(n表示IO请求的大小,以块为单位),其中,对于第1个线程s1而言,从偏移量为0的位置开始读取n个块,另一个线程s2读操作跳跃d个块的偏移量后再读取n个块,这里的d被称为“跳读距离”。当s2读操作的跳读距离d的值增加到一定程度时,线程s2的读操作会跳跃经过若干个域,落入到和线程s1所处的相同的域中。由于两个线程并行执行,并行的数据访问就会竞争同一个资源,带宽就会降低。而采用其他跳读距离时,两个并行的线程就会分布到两个域中执行,因此,就会带来更高的带宽。由此,我们可以设计实验,让跳读距离在某个区间内变化,观测带宽曲线,曲线就会表现出周期性的波动,两个连续的波谷底部的距离就是交织度的大小。算法[SSD-interleaving-degree-probe]给出了探测固态盘交织度的伪代码。 图[SSD-interleaving-degree]显示了在某款固态盘上的交织度测试结果,可以看出,随着跳读距离的变化,带宽曲线呈现周期性波动,周期是10,因此,可以得出这个固态盘的交织度是10,即拥有10个域。 图[SSD-interleaving-degree]固态盘交织度测试结果 映射策略决定了一个逻辑页如何被映射到一个物理页。当前的固态盘产品中通常采用的映射策略主要包括以下两种: (1)基于LBA(逻辑块地址)的映射:对于一个给定的块,如果固态盘的交织度为D,那么,这个块就会被映射到一个域编号(LBAmodD)。 (2)基于写顺序的映射:对于第i个写操作,这个块会被分配给一个域编号(imodD)。 为了确定固态盘采用了哪种映射策略,可以首先向固态盘中随机写入1024MB数据,IO请求的大小为4KB,即一个块的大小。经过这种随机化写入操作之后,这些块会被分配到不同的域中。如果固态盘采用了基于LBA的映射,映射结果应该不会受到这种随机写操作的影响。但是,在经过几次反复实验后,原本随着跳读距离变化而周期性波动的带宽曲线的特征如果发生了变化,不再和原来测试结果相同,就说明随机写操作改变了块映射,那么这个固态盘肯定没有使用基于LBA的映射。比如,图[SSD-map-policy-test](I)给出了采用上述方法后的固态盘映射策略测试结果,从中可以看出,带宽曲线的周期性波动特征消失了,因此,可以说明这个固态盘肯定没有使用基于LBA的映射。 图[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)中的实验结果验证了这种假设,说明这个固态盘确实采用了基于写顺序的映射策略。 表[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]机械式硬盘和固态盘的特性参数表二 SATADisk SATAFlash FCFlash ioDFlash GB 500 32 146 320 $/GB $0.12 $15.62 $85 $30 Watts(W) 13 2 8.4 6 seq.read(MB/s) 60 92 seq.write(MB/s) 55 100 108 ran.read(IO/s) 120 11,200 54,000 79,000 ran.write(IO/s) 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方面,固态盘会逐渐超越机械式硬盘;在许多分析应用中,固态盘会逐步取代机械式硬盘。 表[HDD-SSD-performance-comparision]机械式硬盘和闪存固态盘的性能比较 存储 平均延迟 8.33毫秒 0.2毫秒(读) 0.4毫秒(写) 持续传输速率 110MB/秒 56MB/秒(读) 32MB/秒(写) 图[Exp-On-FusionIO]在固态盘FusionIO上面的随机写和顺序写 图[cuibin-01]固态盘与磁盘的顺序与随机读取速度对比 图[cuibin-02]给出了固态盘的顺序与随机写操作速度的对比结果,从中可以看出,固态盘的顺序写操作速度远远快于随机写操作,原因在于随机写操作会引起更多的擦除操作。特别要注意的是,在这个实验结果中,固态盘的随机写操作速度甚至要比磁盘慢一个数量级。可以看出,固态盘的随机写操作代价较高,因此,在设计基于固态盘的各种应用时(比如索引机制和缓冲区替换策略),应该尽量避免随机写操作,甚至有时候不惜以增加读操作为代价。 图[cuibin-02]固态盘的顺序与随机写入速度对比 图[cuibin-03]显示了文件系统下固态盘的读取与写入操作的速度。在块大小小于64KB时,读写速度都会随着块大小的增加而显著提高,但是,当块大小超过64KB时,读写速度的提高幅度明显减小,不过,读与写操作依然存在比较大的速度差距。 图[cuibin-03]文件系统下固态盘的读取与写入速度 1、阐述计算机存储介质的分类以及不同类型存储介质的特点。 2、阐述闪存的特性,并比较闪存与传统的机械式硬盘的特性差异。 3、阐述固态盘结构以及各个功能组件的功能。 4、阐述固态盘内部不同级别的并行特性的具体含义。 5、比较不同厂家的固态盘产品和传统的机械式硬盘在不同性能参数之间的差异。