ssd的写放大

原文地址:http://www.upantool.com/jiaocheng/ssd/2012/1499_2.html


1.基本ssd操作方式

 写入放大(WA)是闪存和固态硬盘之间相关联的一个属性,因为闪存必须先删除才能改写(我们也叫“编程“),在执行这些操作的时候,移动(或重写)用户数 据和元数据(metadata)不止一次。这些多次的操作,不但增加了写入数据量,减少了SSD的使用寿命,而且还吃光了闪存的带宽(间接地影响了随机写 入性能)。许多因素会影响到SSD的写入放大,下面我就来稍微详细的解释一下。

早在2008年,Intel公司和SiliconSystems公司(2009 年被西部数字收购)第一次提出了写入放大并在公开稿件里用到这个术语。他们当时的说法是,写入算法不可能低于1,但是这种说法在2009年被 SandForce打破,SandForce说他们的写入放大是0.5。


  由于闪存的运作特性,数据不能像在普通机械硬盘里那样被直接覆盖。当数据第一次写入SSD的时候,由于SSD内所有的颗粒都为已擦除状态,所以数据能够以 页为最小单位直接写入进去(一般是4K,参考颗粒资料),SSD上的主控制器,使用了逻辑和物理的映射系统来管理着闪存。(逻辑我们一般指的是LBA,而 物理指的是FTL)。当有新的数据写入时需要替换旧的数据时,SSD主控制器将把新的数据写入到另外的空白的闪存空间上(已擦除状态)然后更新逻辑LBA 地址来指向到新的物理FTL地址。而旧的地址内容就变成了无效的数据,但是要在上面再次写入的话,就需要首先擦除掉这个无效数据。(闪存运作特性,写入最 小单位是页,而擦除最小单位是块,一般为128~256个页)
那么问题就来了,闪存有编程和擦除的次数限制,这样每次的编程/擦除就叫做1个P/E(program/erase cycles)周期,大家应该都知道MLC一般是5000~10000次,而SLC是10万次左右(查闪存资料)。也就是说写入放大越低,P/E周期就越 少,闪存寿命就越久。

2.写入放大计算

 
对于单次操作,最简单的例子,比如我要写入一个4KB的数据,最坏的情况就是,一个块里已经没有干净空间了,但是有无效数据可以擦除,所以主控就把所有的 数据读出来,擦除块,再加上这个4KB新数据写回去,这个操作带来的写入放大就是: 我实际写4K的数据,造成了整个块(512KB)的写入操作,那就是128倍放大。同时带来了原本只需要简单的写4KB的操作变成读取(512KB),擦 (512KB),改写(512KB),造成了延迟大大增加,速度慢是自然了。


3.影响写放大的因素

(1) 垃圾回收(GC) Garbage collection    ---   虽然增加了写入放大,但是速度有提升。这个比较特殊的算法用来整理,移动,合并,删除闪存块来提升效率。
(2)预留空间(OP) Over-provisioning  ---  减少写入放大,好。(预留空间越大,写入放大越低)  在SSD的闪存上划出一部分空间留给主控做优化,用户不能操作的空间。
(3)Trim   开启后可以减少写入放大,好。一个ATA指令,由操作系统发送给SSD主控,告诉主控哪些数据是无效的并且可以不用做垃圾回收操作。
(4) 可用容量   减少写入放大,好。(可用空间越大,写入放大越低)用户使用中没有用到的空间,需要有Trim支持,不然不会影响写入放大。
(5)安全擦除 Secure Erase  减少写入放大,好清除所有用户数据和相关元数据,让SSD重置到初始性能。
(6) 静动数据分离 Separating Static and Dynamic Data 减少写入放大,好分组常改写和不常改写的数据。
(7) 持续写入 Sequential writes        减少写入放大,好理论上来说,持续写入的写入放大为1,但是某些因素还是会影响这个数值。
(8) 随机写入 Random writes  提高写入放大,不好随机写入会写入很多非连续的LBA,将会大大提升写入放大。
(9) 磨损平衡(WL) Wear Leveling    直接提高写入放大,不好确保闪存的每个块被写入的次数相等的一种机制。

4.详细解释

(1)垃圾回收 Garbage collection

 
一旦SSD的所有块都已经写入了一次,SSD主控制器将会初始化那些包含无效数据的块。(陈旧数据,这些块里的数据已经被更新的数据替换,已经无效了,没 了LBA地址),现在他们正在等待被删除,以便新的数据可以写入其中,如何优化并整理这些个等待被删除的无效数据,这个算法被称为垃圾收集(GC)。我们 可以看出这个操作是要有前提的,就是SSD必须要支持Trim技术,不然GC就显不出他的优势了(这也是为啥目前只有支持Trim的SSD才会有GC功 能),而GC的本质区别是它们何时处理?效率多少?

数据的最小写入单位是页,然而擦除的最小单位是块(大小取决于闪存,自己查资料,一般128~256页)。如果在块上的某些页中的数据不再需要,与在该块 内好的数据的其他所有页必须全部读取并重新写入到新的已擦除的块内。这个操作叫做Copy Block,每个主控都会带。(包括U盘主控,这也是为了磨损平衡考虑)然后主控制器再删除掉这个块,用来给下一次写入数据用。这种操作一切指令来自主控 而非用户的叫做GC,将会影响写入放大。请记住,GC有点像整理硬盘,所以要保证有一定的可用容量,可用容量越大,GC效率越高

(2)GC分为后台GC和主动GC
我们知道垃圾的收集过程,包括读取和重写数据到闪存。意味着这样操作会大大降低主控的性能,因为占用了主控的能力和带宽。所以,一些SSD控制器采用所谓 的后台垃圾收集算法(也称为闲置垃圾收集),该控制器会使用空闲的时间来做垃圾收集,让主控在使用时一直保持高性能。试想一下如果垃圾回收把所有的空间都 整理合并过了,那样在性能提升的同时,也增加了写入放大,所以像barefoot主控的SSD(闲置GC)一般只垃圾回收一小部分的空白空间来限制过多的 写入操作。另一种方案就是主动GC,这需要有相当性能的主控制器,来保证在操作数据的同时进行GC操作,这类GC适合在服务器里用到,因为个人用户可以把 电脑闲置了做GC,但是服务器可不行,所以要保证性能的话必须在运行的同时做GC,这对主控制器的性能提出了很高的要求,SandForce的主控就是这 类。。

(3)手动GC
SSD的NAND颗粒有2个状态,物理上来说就是颗粒充电表示1,颗粒放电表示0,擦除数据意味着全盘写1(充电)。颗粒必须以块为最小单位一下子充电, 能以页为单位一个个放电。前面我们得知,如果SSD不支持Trim的话(RAID阵列目前都不支持),在全部SSD写满后,主控并不知道颗粒的块中哪些数 据是无效的,所以它认为他们都有效,操作系统的LBA却知道(因为新数据有LBA,无效数据的LBA已经被重定向了),所以不支持Trim的SSD就意味 着全盘颗粒写满后(指的是颗粒写满,其中包括有效和无效数据,不是我们通常看到的系统里可用容量满)再写入数据要等待写前的擦除操作,系统就会在没用到的 LBA地址下做写入操作。说白了就是系统知道哪里可以写而SSD主控不知道。手动GC正是利用了这一点,做了全盘填FF操作,FF在逻辑上就是1,那么就 是全盘颗粒里的无效数据处填1,1在NAND颗粒上代表充电,代表擦除。所以随着用户的可用容量越来越少,然后再一下子删除这个生成出来的大文件,代表了 全部可用容量区域都为逻辑1(擦除状态),这个状态就是GC操作后删除无效数据区块后的状态,所以叫做手动GC,自然这些区块在之后的操作中可以直接写入 而不需要再擦除了。

(4)预留空间 Over-provisioning
预留空间一般是指用户不可操作的容量,为实际物理闪存容量减去用户可用容量。这块取用一般被用来做优化,包括磨损均衡,GC,Trim和坏块映射。


(5)TRIM
Trim是一种SATA命令,他能让操作系统在删除某个文件或者格式化后告诉SSD主控这个数据块不再需要了。
一般情况下,当LBA被操作系统更新后,只有随着之后的每次数据写入(其实等于覆盖),SSD主控制器才知道这个地址原来早已经失效了。(之前认为每个数 据都是有效的)在Win7里,由于Trim的引入解决了这个问题,当某些文件被删除或者格式化了整个分区,操作系统把Trim指令和在操作中更新的LBA 一起发给SSD主控制器(其中包含了无效数据地址),这样在之后的GC操作中,无效数据就能被清空了,减少了写入放大同时也提升了性能。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值