对一个文件的同一字节快速反复读写容易把固态硬盘写坏吗?
有人提了写放大,我从硬件的角度来说说,写放大这玩意的影响可能比很多人想的要大的多。
闪存存储有一个比较奇怪的特性:每个bit可以从1变成0,但是不能反过来,比如闪存里某一个字节的原始状态是0xFF,那么是可以写成0x5A的,但是0x5A再写成0xFF就不行了。
所以,测试闪存性能和寿命,有一个最直接也是最暴力的写法,反复写0x55 + 0xAA,这会大幅度缩减闪存存储的性能。
闪存的另外一个特性是:擦除的最小单元和写的最小单元不一致,通常来说,擦除(把所有字节重置成0xFF)是以块(block)为单位的,块一般是128KB到256KB之间。写的最小单元是页(page),页的大小一般是1K/2K/4K这种大小。
闪存驱动一般提供三个接口:
写(write,有的地方叫做program接口)接口:允许把某一个page的内容从1写到0,但是不能反过来写。
读(read)接口:读一个page,不限制范围。
擦除(erase)接口:把一整个block的内容重置成0xFF。
所以,如果反复对一个字节写0x55-0xAA-0x55-0xAA,就会频繁触发闪存的擦除动作,也就是一次PE,对于这种操作,FTL都无能为力,因为很快就会消耗完一个block里干净(全是0xFF)的page。比如,一个底层是128K/2K型号的NAND,对一个page反复写64次(前提是要绕过缓存),就会触发block的一次PE,从应用层上看,只写了64字节。
对于FTL设计的不够好的主控,反复写55-AA会很容易把闪存搞崩掉,前期的表现是掉速。我早些年对于一个 128G的NvME,反复整盘写55-AA几十次以后,读盘速度就从GB掉到200M左右。当然,当年的nvme的主控也比较一般。
更极端的办法是,把闪存的空间使用率提高一些,比如先写满95%的数据,然后再对剩余的5%的空间反复写55-AA,就会频繁触发块迁移的动作,对于闪存的寿命影响极大。