如何理解SSD的写放大?
举个简单的,大家容易理解的例子:
很多时候,你写一张纸需要耗费一张纸,你写一行字也会浪费一张草稿纸,这就是写入放大的一个主要原因。我高中记笔记的时候就强迫症,每堂课都新换一张纸写,就会写入放大。
另外的原因是,你需要先把旧本子中有用的资料抄到新的本子上,然后把旧本子泡在消字灵的,这样你就能重新使用旧本子了——但是这个过程中你需要把有用的资料重新抄一遍,这又造成了写放大。但是这样做就有个好处——每节课对应的位置很清楚,不用来回翻。
还有一个问题就是损耗均衡——假设你的本子只能泡在消字灵中100次,但是有个本子只泡了1次,但是上面全部都是有用的资料,另一个本子泡了80次,但是经常记录没用的东西,那么理智的选择是将第一个本子的东西抄到第二个本子上——不然再过20次你就只剩下一个本子了。
以上三个过程就是造成写入放大的主要过程。其中页=闪存页,本子=闪存块。一般的闪存就是和我高中一样,一个页只写一次,不管写多少。当然还有蛋疼的DFTL、FAST、BAST之类的算法,但是都是会导致其他方面的代价提升——比如需要整本乱翻才知道位置在哪,这就比直接每堂课对应一张纸的方法查找效率低很多。
但是闪存的这种写入策略不是没有好处的,好处就是在固态硬盘中,几乎不存在物理上的“磁盘碎片”,因为在垃圾回收过程中就顺便解决了硬盘内部级别的碎片问题。但是上层操作系统上仍然会有一些碎片的问题,这就是NTFS之类的磁盘系统本身的锅了。当然,坏处就是写入放大。
在传统磁盘中有个东西叫“磁盘碎片整理”,尤其是xp时代。至于现在,你可以在“我的电脑”里面右键磁盘,选择工具,看看“磁盘碎片整理”是否还能用?我这边看上去是不能用的,分析按钮都是灰色的。这也算是一种写入放大造成的收益吧。
写放大主要来自两点:
1,写入必须写在空白page上,如果不得不写在“脏块”上必须先擦除成空白page。
先扫清屋子再请客。
2,NAND写入可以是page,但是一触发擦除就要整个block。而多个pag组成一个block。也就是:
写错一个字,就要撕掉整张纸。。。
如果NAND可以像磁盘那样直接覆盖,那么就无需擦除即可写入,写放大就几乎为零了。
如果写入和擦除的最小单元都是page,写错一个字,只要撕掉一个字的纸就行。那么写放大会小很多。
但是这些底层操作是SSD自行控制的。所以你都是不可控的,
你能控制的是:
写放大跟可用空间有密切关系。
提出这样问题人一般都知道闪存基本构成是由:页page(4K)→块block(通常64个page组成一个block,有的是128个)→面plane(多个blcok组成)→die(plane就是一个die)→闪存片(多个die组成)→SSD(多颗闪存片组成)
↑↑↑↑一个块block是由128个页page组成,一个页page是大小是4KB
↑↑↑↑一个面Plane由1024个块block组成
△▼△▼△▼△▼△▼分割线▼△▼▽▼△▼△▼△
其实WA写入放大很好理解,而造成写入的元凶是GC垃圾回收,说之前先说下操作系统当删除一个数据时,他不会立马删除,而是把这个要删除的数据上标记一个“删”的标签,实际上没有真正删除,就是因为如此硬盘上数据纯在可恢复的原因,而机械硬盘与固态硬盘工作原理不同,当机械硬盘要写入新数据时可以直接覆盖那些已经被标记“删”标签的数据,而固态硬盘不行,只能先擦除旧的数据才能写入新数据,而NAND闪存工作原理是以4K页(page)为一个单元写入的,但擦除只能以块block(64个page)为单位,如果一个块block上有32个page有效数据和32个被标记“删”标签的无效数据,那要在这个块block上重新写入数据,那必须要擦除整个块block,那还有一半有效数据怎么办了?那只有把那32page的有效数据就要搬到另一个有空位置的块block中,这个这就是GC垃圾回收技术,那把那有效的数据搬到另一个块block中,原本就已经写入过一次了再加上这次搬迁不就又多了一次写入吗,这就是所谓的写入放大,讲了这么多小付我还要讲个trim技术,trim只是一种命令,只负责通知固态硬盘哪些是无效的数据,因为我们刚才讲过操作系统删除数据时,只是把这个要删除的数据上打上“删”的标签,并没有真正的删除,这只是操作层面上的,但作为底层的固态硬盘鬼知道哪数据是有效那些事是无效的,如果没有trim指令的话当固态硬盘要擦除一个块block时,GC垃圾回收就会把有效数据连同被打上“删的”无效数据一起搬到别的块block上,这样写入量变的更大,增加硬盘负担,就会影响硬盘速度和硬盘寿命,因为SSD不像机械硬盘,SSD有寿命限制就是所谓的全盘的写入擦除次数(全盘进行一次写入擦除就是1P/E),这样来看TRIM命令是和GC垃圾回收是互补的,TRIM命令给SSD的可删除数据越多,GC操作需要转移的数据就越少,写入量也会减少,写入放大就会减少。小弟不才,这些只是自己片面理解然后告诉大家,有错误的地方请前辈指正