@pceva.com.cn:SSD工作原理傻瓜教程
1个page为4KB,1个Block为256个page组成,1个Plane由2048个Block组成,2个Plane组成1个Die,也就是最小的芯片(4GB),X25-M 80G Gen2 SSD上面我们看到10个颗粒,每个颗粒是8GB的,就是由2个Die封装起来的。
Page为最小的读写单位,Block为最小的擦除/编程单位。 (我知道这些很多人都知道,重复重复再重复我也很烦)。
接下来,我来假设一个主控和颗粒环境:
1个8通道8位的主控连接到8个Die上,为了解释方便,我这里就画了每个Die里的第一个Block。(实际当然要复杂很多)
好了,接下来我们要进行读写了,看清楚,这下面的东西才是你们最想知道的。
1. 现在我先对主机发送一条命令,要求写入4KB。
主控接到主机发来的指令后,往颗粒1的Block1里写入了1个4KB(占1Page)。
2.继续写入8KB。
主控接到主机发来的指令后,往颗粒2的Block1里和颗粒3的Block1里各写入4KB。
好了,我们来举一反三,如果写入的是32KB,那么主控就会一下子往每个颗粒的Block1里写入4KB,这样就能发挥出这个SSD主控理论最大的写入带宽,相对4KB来说最好情况下我们可以得到8倍的速度(取决于主控对通道的优化,颗粒当前的文件状况等等)。这样你们就会知道为啥4KB的写入慢,而持续写入SSD并不慢的道理了吧,实际情况下当然不会都写Block1,我这里只是想解释的简单点。这个类似RAID 0的操作模式就是大部分的SSD内部操作情况。
上面是写入的情况,对于读取自然也是如此,4KB的读取就从一个Block里读,而32KB的话就从8个Block里拿,速度是不是8倍提升取决于要读取 的数据是不是平均分布在每个颗粒的Block里,如果32KB数据是存储在图中颗粒1~4的Block1里的(每个Block假设8KB),那么读取就最 多只有4倍的提升了,这也是为啥文件越小传输率越低的道理。
这样经过一段时间之后,所有的NAND Block都被填满了,就会产生如下图的情况:
这个图显示的是LBA(逻辑块地址),也就是我们的操作系统看到的文件系统结构,而非我们的SSD主控制器看到的结构。
图中红色的地方表示为这个地址里的数据已经“过期”或者“无效”,这些红色地址是如何产生的?在你删除文件的时候,这个地址就“无效”了,里面的文件还在,只不过不用了而已,等待下一次的数据更新并覆盖进去。
对于SSD的主控制器来说,它看到的并不是如图中这样,而是如下图:
是的,在SSD主控制器看来,这里的文件都是有效的,也就是不能擦除,那么接下来如何?在操作系统的要求下,继续写入数据的话就要在前面LBA红色的地方写入,对于SSD来说,这时候就需要把整个块的绿色读进缓存并更新操作系统发来的数据,之后擦除这整个块并把缓存里的整个更新完的块写回去,这样即使写入4KB的数据,其实也是大费周章的折腾,这就是早期SSD主控制器或者U盘写入放大高的道理,这些SSD的算法上不支持GC,也没有Trim,所以在随机写入的表现上非常的悲剧。
Trim是一条ATA的指令,当最新的操作系统删除文件的时候(包括格式化),同时把这个文件地址发送给SSD的主控制器,让主控制器知道这个地址的文件地址无效了,好了,到此结束,没有下文了。
Trim的完成需要几点:1.SSD的主控制器必须认识Trim指令,也就是固件要支持。2.操作系统必须会发送Trim指令,也就是删除时候会发送。3.操作系统下的控制器驱动必须要支持Trim指令的传输,也就是能够Pass Trim指令到SSD主控制器。
如果SSD的主控制器支持Trim并且有开启的话,他看到的图就会是这样:
是的,基本和操作系统看到的差不多,那些不一样的地址是因为并非删除操作造成的“无效”,而是由于覆盖等原因造成的,所以操作系统并没有发送Trim指令告诉SSD主控这个地址。
那么相比之前的SSD主控制器,我们有了Trim,带来了提升是啥道理哪。
如果光有Trim,提升并不大,因为数据的写入还是需要读取进入缓存并更改整个块,只是Trim后红色的page就不需要读取进入缓存更新了,因为SSD主控已经知道那个地址的数据无效了,只省下来了红色page的读取写入时间,写入放大一样很高,如何才能解决这个问题?
那就是GC,垃圾回收技术:
垃圾回收类似于硬件级的整理,不受制于文件系统和操作系统,而由SSD主控制器全权负责的合并有效文件,擦除无效文件。
我们知道每个SSD至少都有7.37%容量的第一层OP(预留空间),GC技术就可以利用那个空间来作为垃圾回收处理厂。
如图:
前面说过了,SSD有备用空间,那么合理应用那个空间作为垃圾回收,我们可以把颗粒1的Block1和颗粒2的Block1里的绿色有效page合并到颗粒N的block1里面,并删除掉颗粒1的Block1和颗粒2的Block1.这样我们就用了1个空白Block(颗粒N的Block1换到了2个空白Block) ,并把2个空白Block转到备用区去,这就是垃圾回收操作。
操作后就像下图:
这样接下的写入就可以直接写入没写入过的颗粒N的Block1里的page和颗粒N+1的Block1。达到写入的性能提升,也避免了写入放大的大幅度增加。
如果没有Trim的支持,而光有GC垃圾回收的话又会如何?(很多人没有开Trim,或者组了RAID开不了Trim的就会像下面这样,如图:
由于没有Trim,操作系统在删除文件的时候并不会告诉SSD主控这个文件地址为无效,那么只有在更新操作的时候SSD主控才知道这个地址为无效(新数据写入新page,旧page地址被主控映射表标记为无效)。由于红色的page很少,这样就给垃圾回收带来了效率低下的问题,按照这个图中的情况做垃圾回收后会如下图:
是的,垃圾回收用2个空白Block换来了几个page的空白,这样低下的垃圾回收就类似于基本上Copy了整个Block数据到空白Block,花费的时间很多。所以这里我们知道,Trim提升速度的奥秘是产生了大量的红色page(无效数据),造成垃圾回收的效率提高,类似以1换N的效率。
垃圾回收分为闲置垃圾回收和被动垃圾回收。
所谓闲置垃圾回收就是在机器闲置的时候做提前垃圾回收,保证一定数量的空白Block来保证接下来的写入可以顺利进行。而被动垃圾回收就是到了不能不做垃圾回收的时候了,边写入边垃圾回收。(这时候的性能一般是比较低下的,但是肯定不会增加多余的写入放大)
闲置垃圾回收会增加写入放大的道理是这样的,比如前面图中颗粒3的Block1和颗粒4的Block1内部红色page还是比较少的情况下在闲置时被垃圾回收了,如果我们接下来删除的数据(有Trim)原本是颗粒3的Block1和颗粒4的Block1内部绿色page里的话,就等于做了多余的垃圾回收,因为如果我们可以等到删除的时候,这几个绿色的page变红色后就不用Copy到新的block里了,所以等于说写入放大被增加了。
很多人会问垃圾回收何时做?为啥我明明开Trim了,但是还是没感觉到性能的提升?
一般在全盘的物理地址被写满一次后做,由于主控设计上为了尽量减少没必要的写入放大,所以闲置垃圾回收被限制了一定的容量,也就是说并非所有包含无效page的Block都会被垃圾回收,主控会尽量取其中效率最高的先做掉,还有一点就是,Trim后不一定马上做垃圾回收,而是等待到不得不做的时候做来做。比如镁光C300的0002固件的Trim指令发送完后就会马上做垃圾回收,但是到了0006固件,Trim指令发送完后垃圾回收并没有马上做,而是要等待到最佳时机,所以我们说0006的固件写入放大会低于0002固件,但是性能的恢复会慢一点。这是在耐久度和写入性能之间需要取得的平衡。
你们也知道,SSD的读取很快,但是写入相对较慢,其实影响SSD写性能的并不是很多人认为的擦除操作(一般1.5ms),而是写入(每个page/SLC 250us,MLC 900us)。对于相同平台相同的2块SSD在使用环境不同的情况下,写入性能的差距是很明显的,为何会造成了这么明显的差距?这是因为同样的写入操作,需要花费的时间是不同的。
下面2张图我来告诉你
这是2块一摸一样的SSD,一样的平台甚至操作系统驱动,但是唯一的不同是环境,前面个SSD作为系统盘,后面个SSD偏向于视频编辑,所以在上面2个图中我们得到了完全2个情况,我可以这样说,下图中的SSD写入会强于上图的SSD,因为对下图的SSD来说,要得到2个空Block只要直接擦除掉颗粒1的Block1和颗粒2的Block1就行了,而上面的图里就需要做完整的垃圾回收操作,同样的写入操作由于后台垃圾回收的关系会造成性能上的差距也就不言而喻了,为啥下图会有全红块的情况?因为视频文件一般都偏大,当删除的时候地址是连续的,一整块都变无效(红page)了,所以在垃圾回收的时候效率是极高的,这也是为啥持续写入并不会对SSD耐久度造成太大伤害的道理。说句直接了当的话,SSD在每个时间段的写入性能都会不同,因为性能取决于当前内部碎片的程度。
企业级产品大多都有很高的OP容量,一般为20%以上,这是为啥哪?
最简单一个道理,看图吧:
有谁认为下图的垃圾回收效率会低于上图的?我相信没人吧,更多的备用空间意味着啥?更高的效率,更多的写入空间,磁盘碎片整理程序也是空白空间越大效率越高吧,在企业级这类极限情况下,靠着被动GC来拉开性能的话,备用空间就显得尤为重要了。
没有Trim的时代:OP的容量越大,代表用户的可用空间越小,当写满整个LBA的时候,用户就需要删除文件以得到空闲容量,LBA里文件占的地址page变红了,而在SSD看来还是全绿(无Trim),删除文件后用户可以继续写入(LBA地址覆盖),在SSD主控内的FTL帮助下,操作系统LBA的红色在慢慢变绿,而SSD实际把数据更新到之后没写入过的PBA(物理地址)里,在SSD里看来,PBA—LBA越大,在LBA里红色出现的概率越高,需要复制进缓存的绿色page越少,性能越好。在没有Trim甚至GC的年代,提升OP容量是唯一保证SSD写入性能的方法,在极端情况下OP是非常重要的,如今虽然SSD性能大大增强了,但是OP被大多数企业级SSD产品沿用了下来。
OP不能提升SSD的最高性能,但是却能明显提升SSD的最低性能,越是极端情况下,OP越显得重要,OP还能让SSD的性能下降更慢,恢复更快,减少写入放大来大大提升颗粒耐久度。