第三章 磁盘大挪移——磁盘原理与技术 详解
第一十零节 固态存储介质和固态硬盘
所以,控制器在处理Delay Write时要非常小心,一定要检测两个针对同一个地址的写IO之间是否插有针对同一个地址的读IO,如果有读IO,首先处理读,然后再覆盖。
Combine Write是另一种存储系统控制器常用的写IO优化方法。对于基于机械硬盘的存储系统,如果控制器在一段时间内收到了多个写IO而这些写IO的地址在逻辑上是连续的,则可以将这些小的写IO合并为针对整体连续地址段的一个大的IO,一次性写入对应的磁盘,节约了很多SCSI指令周期,提高了效率。对于SSD来讲,由于SSD中的逻辑地址本来就是被杂乱地映射到可能不连续的物理地址上的,但是并不影响多少性能,所以,SSD控制器可以整合任何地址的小块写IO成一个大的写IO而不必在乎小块写IO针对的逻辑地址是否连续。整合之后的大写IO被直接写向一个Free的Block中,这样做大大提高了写效率。
5. 药方5:救命稻草,有备无患
为了防止文件系统将数据写满的极端情况,SSD干脆自己预留一部分备用空间用于重定向写。这部分空间并不通告给操作系统,只有SSD自己知道,也就是说文件系统永远也写不满SSD的全部实际物理空间,这样,就有了一个永远不会被占用的一份定额的Free Space用于重定向写。Intel X25-E系列企业级SSD拥有20%的多余空间。其他普通SSD拥有6%~7%的比例。

因为SSD需要对数据进行合并以及其他优化处理以适应Flash的这些劣势,所以SSD自身对接收的写IO数据使用Write Back模式,即接收到主机控制器的数据后立即返回成功,然后异步的后台处理和刷盘。所以,一旦遇到突然掉电,那么这些数据将会丢失,正因如此,SSD需要一种掉电保护机制,一般是使用一个超级电容来维持掉电之后的脏数据刷盘。
关于SSD性能方面的更详细的内容请参考本书第19章中的部分内容。
3.10.6 SSD的前景
对于机械硬盘,如果出现被划伤的磁道或者损坏的扇区,也就意味着对应的磁道或者扇区中的磁粉出现问题,不能够被成功地磁化,那么磁头会感知到这个结果,因为磁化成功必定对应着电流的扰动,如果针对某块磁粉区磁化不成功,磁头控制电路迟迟没感知到电流扰动,或者扰动没有达到一定程度,那么就证明这片区域已经损坏。而对于Flash中的Cell,当Cell中的绝缘体被击穿一定次数(SLC 10万次,MLC 1万次)之后,损坏的几率会变得很高,有时候不见得非要到这个门限值,可能出厂就有一定量损坏的Cell,使用一段时间之后也可能时不时出现损坏。那么SSD如何判断某个Cell损坏了呢?我们知道Cell损坏之后的表现是只能表示1而无法再被充电并且屏蔽住电子了,如果某个Cell之前被充了电,为0,某时刻Cell损坏,漏电了,变为1,那么在读取这个Cell的值的时候,电路并不会感知到这个Cell之前的值其实是0,电路依然读出的是1,那么此时问题就出现了。解决这个问题的办法是使用ECC纠错码,每次读出某个Page之后,都需要进行ECC校验来纠错。每种Flash生产厂商都会在其Datasheet中给出一个最低要求,即使用该种颗粒起码需要配合使用何种力度的纠错码,比如8b@512B或者24b@1KB等。8b@512B意味着如果在512字节范围内出现8b的错误,则是可以纠错恢复的,如果超过了8b,那么就无法纠错了,此时只能向上层报“不可恢复错误”;同理,24b@1KB也是一样的意思。厂商给出的纠错码力度越低,就证明这种Flash颗粒的品质越好,损坏率越低。