NAND闪存颗粒在写入数据时是以一个页面(通常是4KB)为单元,但在擦除数据时却是以块为单位。一般来说,一个块相当128个页面单元,即512KB。假如在X块中包含了A、B、C、D等几个页面单元,当需要擦除A页面单元中的数据时,SSD主控会读取整个X块的数据并写入缓存,然后分别擦除缓存中的A页面数据和NAND芯片中的X块,后将缓存中不包含A页面的X块数据重新写入SSD中(写入过程也称为编程)。也就是说,虽然擦除的只是A页面的数据,但B、C、D页面的数据也要重新擦除并写入。因此即便是只需要擦除4KB的数据,其实也要进行512KB的数据“搬运”工作。这个过程可以简单的概括为“读取→擦除→修改→写入”。听起来似乎没什么问题,但其实NAND闪存芯片的编程/擦除(P/E)周期次数是一定的。目前普遍使用的MLC闪存P/E周期为3000次左右,一些优质颗粒可以达到5000次,超过这个阈值闪存芯片就会报废。
所谓垃圾回收就是主控将闪存中所有的有效页面合并成一个新的块,并将旧的块擦除,以减少寻址负担并留出更多空闲的块。目前的垃圾回收机制包括主动和被动两种。前者就是在SSD闲置时运行垃圾回收机制,这样就不会占用额外的主控资源,但缺点是会对闪存产生额外的写入操作,这就是所谓的“写入放大”。被动垃圾回收则是在SSD读写数据的同时进行垃圾回收,此时会大量占用主控资源,因此会对性能产生影响。
了解了闪存擦写和垃圾回收原理之后我们就会知道,无论主动还是被动垃圾回收,都会对闪存的页和块进行频繁的擦写,对闪存寿命会有一定影响。如何将垃圾回收与磨损平衡算法相结合,达到性能与寿命兼顾的平衡,这是主控固件必须考虑的问题。
接下来我们将实际测试三种主流主控方案的典型产品,看看它们的垃圾回收运作效率,以及对SSD性能的影响。三款SSD容量均为128GB,采用IOMeter填充数据,Anvil SSD Benchmark进行性能评估。测试结果见表格。
SandForce SF-2281为了减少对NAND闪存的读写操作,因此并不会做主动垃圾回收,而是采用被动垃圾回收机制。这样做虽然可以减少NAND的损耗,但SSD被占用大部分存储空间之后,会频繁依靠被动垃圾回收技术来整理存储空间,从而出现性能的大幅度下降。从测试结果来看,SF-2281填充80%空间再闲置30分钟之后性能恢复也不够理想。TRIM后可以恢复近90%的性能,要想“满血复活”还是需要进行全盘重置。
Marvell主控更多采用主动和被动垃圾回收结合的策略,在SSD闲置时主控芯片就会在后台进行垃圾回收操作。从测试结果来看,88SS9187尽管在被动垃圾回收状态下性能下降幅度更大,但闲置30分钟后就基本上已经恢复了初始性能,TRIM与否影响已经不大,更不需要进行重置。不过在这种垃圾回收机制下,理论上采用Marvell主控的SSD使用寿命会稍逊于采用相同闪存颗粒的SandForce主控SSD,但目前对此并没有权威的对比和统计数据。
在NAND闪存里,写入4KB的页面数据,也需要搬运512KB的块数据。
三星S4LJ204X01主控的垃圾回收机制与Marvell主控类似,主动垃圾回收及全盘TRIM之后性能均可以恢复至95%以上,优于SandForce主控,但略低于Marvell。
从测试结果来看,显然Marvell 88SS9187主控可以称得上“佳环卫工”。在三款产品对比中无论空盘还是满盘性能表现都非常好。但实际使用中用户很少会将SSD填满80%以上,即使填满也几乎不会立即进行大量数据读写,并且厂商也都建议用户为SSD预留充足的空间,所以不论主控运作被动还是主动垃圾回收,对大部分用户都不会产生很明显的影响。不过SandForce主控的SSD性能无法自然恢复,除了Intel外几乎所有的厂商都没有提供官方重置工具,只能使用HDDErase这种用起来很麻烦的第三方工具。相比之下,三星和Marvell主控的SSD自动“满血复活”则让用户省了很多事。
此外,垃圾回收机制对于颗粒寿命虽然有一定的影响,但这绝对不是用户需要纠结的问题。从三款产品的对比测试来看,Marvell主控的垃圾回收对颗粒寿命影响似乎大,但实际上一些Marvell主控的SSD保修年限比SandForce方案的SSD更长,所以还需要结合闪存颗粒类型来综合考虑选择产品。