写放大(Write Amplification Factor, WAF), 有的时候也会写成WA。
写放大最根本的原因是nand特性造成的,读写以page为单位,擦除以block为单位,不能覆盖写。
比如要写一个page H的数据,这时如果没有干净的block,需要做垃圾回收,把block x的3个有效page搬出来,擦除block x,再写入新数据。这样本来写入1个page数据,实际上却写了4个page。那写放大就是4/1 = 4。
WA = nand_bytes_written / host_bytes_written (additional smart log中的2个参数,单位32MB)
假如是覆盖写,比如修改page B,有效数据和新的page b写入到新的block里,WA就是3。
Block大小也会影响写放大,Block越大其中的有效数据相对也会较多,因此数据搬移的也越多,写放大也就越大。
怎么减小写放大?
从公式上来看,host写入不变的情况下,只能想办法减小nand写入。
1. GC 优化,比如GC时选择垃圾多的,这样有效数据少搬移的数据就少。
还有trim功能对删除操作的通知(文件系统中设置discard),提升GC的效率也改善了写放大。
2. WL优化,比如冷热数据的分离处理,冷数据挪到EC(erase count)值最大的block中,这样也较少了GC对冷数据的搬移次数。
3. 数据压缩,取决于controller压缩能力,比如4k数据压缩成1k,那写入nand数据不就减少4倍?
4. 调节OP,数据区比例小了,每个block中的有效数据占比也减少,做GC操作时搬移数据也就相应减少。当然这个代价是减少了可用数据区。可以看很多产品的data sheet,比如同一个SSD同样的固件,3.84TB TLC SSD DWPD 1左右,3.2TB的3左右。
5. 上层软件优化,不同应用程序或者说不同的应用负载下,WAF也会有很大的差异。比如随机的数据会比顺序写入的WAF高很多,所以应用层的优化就是尽量整合成顺序写,或者顺序占比更多些。
6. 数据对齐,比如fio测试时设置的4k对齐,有一定程度减少数据非对其造成的多余搬移。
7. FTL算法优化,包括前面说的GC/WL等,还有后台扫描,LDPC等等算法的优劣都会对WAF有一定的影响。