存储 频道

SSD固态硬盘2012终极横评及选购指南

  SSD 分区的 4KB 对齐问题

  硬盘驱动器的扇区大小一般是 512 字节,也就是说它的最小存储空间尺度是 0.5 KB,故此目前所有的操作系统都是采用 512 字节来对虚拟存储空间进行划切。理论上我们是不需要对 512 字节粒度转换为 4 KB 粒度过分关注的,特别是现在人们正在使用的大多数文件系统例如 Windows NTFS 就是采用 4KB 作为簇(Cluster)的大小。

  不过在现实情况会有点出入,原因是 10 年前开发的 Windows XP 内建磁盘工具在分区的时候由于设计上并没有考虑到 SSD 的情况,采用了一个 63 个扇区(相当于 7 + 7/8 个 4KB Page)的偏移量,这将导致每个从操作系统写入的 Page 会覆盖 SSD 的两个物理 Page,而且会导致两个 Page 的空间未能充分使用。

  由于 Page 是 SSD 的最小写入粒度,因此即使操作系统只是要求更新一个 Page 的数据,也会导致两个物理 Page 被执行写入操作。

  在读取的时候,特别是大文件的话,影响并不大,但是写入的话分区不对齐会很快导致性能衰减。

  不同的应用负荷产生的文件尺寸不尽相同,像富媒体(例如视频、静态图像)和科学或者财经应用程序的文件大小是存在差别的,后者的文件写入操作中 60%~70% 都是 4 KB。

  如果你是在 Windows 7 或者 Vista 下执行分区的,逻辑块会对齐至 SSD 的 Page 界线,因此不会发生 Windows XP 内建分区工具导致的不对齐问题。

  虽然 Windows XP 下有其他工具能实现创建对齐分区,但是这也只是克服了 Windows XP 使用 SSD 时候众多不足之一,光是缺乏前面所说缺乏原生 Trim 支持就应摒弃掉 Windows XP(当然,目前有一些可以“手工”向 SSD 发出 Trim 指令的 工具:http://www.ocztechnologyforum.com/forum/showthread.php?73888-Here-s-a-tool-to-force-TRIM-your-entire-drive

  SSD 错误纠正码(ECC)技术和成本

  和硬件损坏导致的硬错误(HEC)不同的是,软错误是由于地球低强度背景辐射的带电粒子所引起的,这些带电粒子有可能来自宇宙射线,也可能来自大多数材料 中的微量放射性元素,这些都可能会干扰依靠粒子运作的半导体芯片,例如带电粒子撞击闪存芯片存储单元造成位元翻转,就会导致数据错误。

  不过按照香农的信息论,只要采用一定的编码,就能将数据错误的几率弄到无限小,因此各种各样的错误纠正码(ECC)应运而生,数据错误原因远远不至于辐射带电粒子的闪存自然也毫不例外的引入了 ECC。

SSD分区4KB对齐、ECC技术和成本

  早期(指的是 Page 大小只有 512 字节的年代,这是差不多 20 年前了)在 NAND 闪存中常用的 ECC 方式是加权平均 ECC(Hamming ECC),能够纠正 1 个位元的错误或者侦测出 两个位元的错误,可以看做是 DRAM 中应用的 SEC/DED(单位元错误纠正/双位元错误侦测)的简单版本,只不过 NAND FLASH 的 Hamming ECC 是对整个 Block 的数据(因此也称作 Block Code),而 DRAM 的 Hamming ECC 是针对双字(Dualword)的。

  但是随着 Page 大小增加,一个 Page 中出现多个位元错误的机会也随之增加,Hamming ECC 已经无法应付这样的情况。于是乎工程师们开始采用在通信领域(例如 DSL、WiMAX)和其他存储技术(例如 CD-ROM、Blu-Ray、RAID6)中采用的 Reed-Solomon code(理德-所罗门码),一个可能是迄今为止最赚钱的编码技术。此时,2 KB 或者 4 KB的 Page 和 MLC (70nm 时代)设备需要 4 位错误纠正能力。

SSD分区4KB对齐、ECC技术和成本

  常见的 RS 码执行方式是把 512 个字节(选择这个大小是因为和传统存储的最小单位扇区一样大,当然具体的可能也有不同,取决于具体厂商和型号)的纠正块切开成多个符号(注意,这里说的是符号是位于一个有限域内的,而不是二进制数),提供 N 符号纠正。如果符号中的任何位元出错,RS 码都能将整个符号纠正。

  随着 MLC 每 512 字节纠正块的错误纠正能力需求增加到 8 个位元后(制程越先进,错误校正能力要求越高),RS 码校验位所占用的空间超出了 NAND 闪存芯片中的备用空间。为了将校验位最少化,NAND 闪存厂商开始推荐采用 BCH 码作纠正。

SSD分区4KB对齐、ECC技术和成本

  人们认为 NAND 闪存的错误不会一整片地出现,而是随机的分布于 Page 的各处,而 RS 码的强项是成片错误的纠正,非常适合于光盘的划花或者错乱的通信通道。

  而 BCH 在类似闪存这类偶尔出现单个位元错误的情况下能做得更加高效,在同样数量的校验字节数下,BCH 能做到比 RS 码更多个位元的错误纠正。

  随着 NAND 闪存错误率的持续增长和所需的 BCH ECC 级别提升,BCH 的纠正码块大小未来将会增加到 1 KB 以确保进一步改善纠正效率。

  例如同样是 1024KB 大小,在遇到高低位区各 9 + 5 = 14 位元错误的时候,分别采用两个 512B-ECC8 和 1 个 1024B-ECC16 纠正块的话,1024B-ECC16 能将这 14 个位元的错误全部纠正,而 512-ECC8 则无法应付高位区的 9 个错误。

SSD分区4KB对齐、ECC技术和成本
在 Windows 的计算器里的 log 其实是 lg
所以这里的 log2(512byte*8bit+12bit) 在
计算器里要用 lg(512*8+12)/lg2 来算
其中的 12 代表可以纠正的位数

  要满足多少位校正能力所需要的纠正码大小可以用一定的算式求出来,例如上面的 1024B-ECC16:

  需要纠错的数据块字节长度 k = 1024 Byte

  可以被纠错的位数 t = 16 bit

  需要增加的纠正码位数 P = m*t

  而 m=upper{log2(1024byte*8bit+16bit)}

  也就是要满足不等式:1024*8bit+m*16bit<2^m-1。

  用比较原始一点的办法求 m 值:

  请忽略->如果 m= 0->12,左边等于 ...,右边等于 ...-1=..,左边大于右边,不成立

  如果 m=13,左边等于 8400,右边等于 8192-1=8191,左边大于右边,不成立

  如果 m=14, 左边等于 8416,右边等于 16384-1=16383,左边小于右边,成立

  故此如果一个以 1024 字节为单位配置 BCH 码作 ECC 的话,所需要的纠正码位数 P 是 14*16 = 224bit 或者说 28 byte。

  现在很多厂商都在使用的 SandForce SSD 控制器号称可以实现 512B-ECC55,即可以对 512 字节块中的 55 个错误进行纠正,传统固定代码字长度下相当于需要为这 512 字节额外配备 90 个校验字节(因为(13*55bit)/8= 89.375 字节)。

  如果是 4KB 的 Page,这就相当于需要 715 个字节,目前没(未来也不可能)有任何闪存有这么大的备用空间比例(美光的 4KB Page 是 224 字节备用空间,尚欠 419 字节),所以 SandForce 在这里其实是以切出更多闪存空间作为二级备用空间存放多出来的 419 字节,配合 SandForce 独有的实时压缩技术以及自适应字长 ECC,应该还能在不牺牲性能的情况下显著缩少这些校验位占用的空间。

  根据 OCZ 的计划,该公司将会在 2012 年推出基于 TLC(单晶体管存放 3 位元数据)的 SSD,而 TLC 本身比目前的 MLC(TLC 也是属于 MLC,不过当下一般是指单晶体管存放两个位元的闪存为 MLC,TLC 有些时候被归类为 XLC)有更高的错误纠正需求。

  在将来,BCH 将会让位于 LDPC 码技术直到有比 NAND 闪存更先进的存储技术为止。

  现在的 SSD 除了闪存铁定需要采用 ECC 技术外,整个数据通道上的总线、先进先去缓存以及可能集成的 DRAM 都要视乎需要采用 ECC 技术,当然这都不是免费(性能、价钱)的。

  不过...我们的 SATA-2 总线上每 512B 只有 6-bit ECC 校验码,为了数据完整性万无一失,理论上...可以...考虑回传一次做 CRC。

0
相关文章