固态硬盘各种技术的介绍及发展
固态硬盘技术之磨损均衡
磨损平衡,也叫磨损均衡,英文名为Wear Leveling。其实很好理解,所有的产品使用后,都会产生磨损。具体到固态硬盘闪存上,就是说对同一块闪存Block不段地读取写入数据,会造成闪存磨损。最终导致Block彻底坏掉。这在我们之前SLC/MLC/TLC闪存中介绍了相关原理。
我们知道当硬盘出现了物理坏道后,我们能做的就是把其屏蔽掉,然后迁移数据,等待坏道增加最够多的时候,我们就无可奈何了,硬盘只好光荣退休。同样,在使用NAND闪存介质的SSD中,同样会面临坏块的影响,这也是磨损均衡这个概念的出发点。
更是为了应对闪存磨损的问题,因此磨损均衡技术也就应运而生了。固态硬盘中均应用了Wear Leveling(均衡磨损或磨损平衡)机制,它可以尽可能地将文件平均分配到每一个区块(Block),保证对每一个闪存块的编程/擦写次数一致,避免对某一部分区块的过度地重复进行擦除操作而报废,从而有效延长了固态硬盘的写入寿命。
磨损平衡算法一般分为静态和动态,当前所有主流的固态硬盘均支持动态磨损平衡。动态磨损平衡是指主控尽量选择那些“较新”的区块来使用,这种算法的优点是复杂度低,易用控制,不会占用太多资源,但缺点则是这种算法还不是最优。
当然这只不过是延长固态硬盘读写次数的一个方面了,接下来我们将会说到更多延长固态硬盘寿命的技术。
Trim指令和垃圾回收
其实固态硬盘和机械硬盘都会有越用越慢的特性。只不过原理不同,传统机械硬盘主要是由于硬盘写入从外到里的写入顺序,随着数据的增多,磁头的移动和寻址时间变长。
固态硬盘则是完全另外一回事。以前的固态硬盘主控和系统之间在删除数据方面缺乏交流。如果用户要删除某些数据,操作系统只会在磁盘映射表中做个标记,说明这个地址的数据被删除了。但是实际上,在没有写入新的数据之前,原来地址存放的资料仍然在原地。
当需要写入新数据的时候,需要固态硬盘先删除原来的数据再开始写入新数据,这样无疑使得硬盘的性能下降。更何况,固态硬盘的最小存储单元是Page,但是最小删除单元却是Block。这需要在删除小文件时,需要先把整个 Block的文件先转移到系统缓存中,然后在找到需要删除的数据删掉,在把有用的数据写入闪存内。这无疑是很浪费时间的一个过程。
正是针对固态硬盘的这一缺点,微软率先提出了Trim指令。TRIM是从Windows 7和Windows 2008 R2开始支持的一个ATA指令,他的作用就是由操作系统告诉固态硬盘,标记那些存有无效数据的地址,以提升后续垃圾回收的效率。有了这个功能,当删除文件时候,系统会及时通知主控,这样主控就能够在其他时间完成对数据的删除和整理,再有新数据写入的时候,就不在重复我们刚才上面提到的繁琐过程,从而让固态硬盘性能保持稳定。
垃圾回收是固态硬盘的另外一个特色功能。其实这个功能相当于机械硬盘的碎片整理。
垃圾回收的功能是将所有Block中的有效Page合并到一个新的Block中,并将旧的Block进行擦除,这样做的好处一方面减少寻址负担,另一方面留出更多的空闲Block。所以垃圾回收对固态硬盘的性能和寿命都起到至关重要的作用。
垃圾回收分为闲置垃圾回收和被动垃圾回收。顾名思义,前者就是在固态硬盘闲置时做垃圾回收操作,这样做的好处是不会占用额外的主控资源,能够让固态硬盘尽可能地保持较高的效能,但缺点就是会增加额外的写入放大。
而被动垃圾回收则是在数据输入/输出的同时做垃圾回收操作,这个机制会大量占用主控资源,对有数据请求时的“响应时间”产生一定影响。这个机制也可以称为“实时垃圾回收”
总的来说,垃圾回收操作由于将不同Block中的有效Page进行合并,有额外的擦除操作,会增加写入放大。因此过于频繁的垃圾回收会对NAND寿命产生影响,但又需要进行这样的机制来保证性能,怎样在两者之间取得一个平衡是衡量固件算法的重要指标。
OP预留空间和硬盘容量
有关硬盘容量,我们在机械硬盘使用过程中就遇到过这样的问题。总有人问我购买了120GB或160GB容量的硬盘为什么在系统里显示没有这么多容量?难道厂商把我黑了?又总有人出来解释,硬盘厂商的1GB=1000MB,而系统中容量的计算1GB=1024MB,因此就出现了所谓的差值。当然在固态硬盘中,有关厂商和系统的换算值不同仍将存在。固态硬盘当然也存在着同样的问题,只不过到了固态硬盘厂商使用了OP预留空间这个专有名词。凡是使用过采用SandForce主控的固态硬盘的用户可能都发现,这些硬盘的容量都是60GB/120GB/240GB/480GB等等。本章我们就说说预留空间的事!(很多采用SF主控的硬盘目前也已经允许不采用二级预留空间。)
预留空间(Over-provisioning)是指SSD保留一部分闪存空间留做其他用途,容量大小一般是由主控决定的。预留空间可分为三级,接下来我们就分别说一下这三级空间。
一级预留空间还是来自换算单位的不同。固态硬盘的容量本该用GiB(gibibyte)来表示容量,但是无论机械硬盘厂商还是固态硬盘厂商都不约而同的选择了使用GB(gigabyte)这个单位。1GB容量是10进制单位计算得来,等于1,000,000,000字节(bytes)。但是实际上闪存容量却是以2的n次方数来得出的。因此采用二进制计算出来1GB的容量实际是1,073,741,824 (230)。7.37% (=(230-109)/109,
这个得出的7.37%就是采用二进制计算多出的容量。因此如果一款没有采用预留空间的固态硬盘的容量将会是128,000,000,000。这个7.73%的容量差别一般情况下不能被算做预留空间。第二季预留空间则是由厂商决定。一般情况下是按照0%,7%或者28%的比例。例如尽管都是采用了128GB容量的闪存,不同厂商可能会标示100GB或者120GB的容量。这就是分别采用28%和7%预留空间比例。这并不包括由于十进制和2进制换算而产生的7.37%容量差别。第三级预留空间测试来自终端用户。有的固态硬盘厂商允许用户自行选择额外的预留空间,以获得更长的使用寿命以及更好的性能,当然前提是牺牲了部分容量。还有一种可能是由于系统分区时候并没有完全利用可供支配的空间,那么剩余的这部分空间也会执行预留空间所执行的功能。预留空间虽然占用了一部分用户的容量,但是的确在产品使用寿命以及性能方面提升了不少。
有关4K对齐的问题
4K对齐问题当然是源于磁盘扇区分配。当初的磁盘都是以每个扇区512字节管理存储文件的。但是随着硬盘容量的提升,使用512KB的扇区已经无法满足有效合理的管理文件的使命,于是乎厂商们就使用了新的4K扇区来管理文件了。4K就是4KB,每个扇区可以存储4096字节数据。
问题就出在这里,采用了新格式的硬盘如果在遇到不知道硬盘采用新格式的程序时,在读取和写入数据时,就会性能降低。但是如果采用了4K对齐,这样的问题就能够得到解决。
简而言之,我们还是希望采用了例如Windows 7的用户可以重新分区,以便能够实现4K对齐,从而提高硬盘性能。而其他不支持的系统,也可以使用某些软件进行操作,有兴趣的用户可以自己搜索一下,这里我们就说到这里吧。