PCEVA,PC绝对领域,探寻真正的电脑知识

标题: SSD工作原理傻瓜教程 [打印本页]

作者: 石头    时间: 2011-1-30 08:51
标题: SSD工作原理傻瓜教程
由于本人之前的C300测试贴中的部分原理解释不是最“傻瓜”式,造成很多朋友的困惑,在群里在论坛里讨论时,发现很多朋友的理解都还是有问题,故此特地开一个帖子解释的更“傻瓜”点。

首先我们来看下,作为L63B颗粒,Intel/Micron的34nm 4KB page的颗粒,内部结构是这样的。
[attach]19705[/attach]

我知道自己画图很烂。。。。意思意思就行。
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为最小的擦除/编程单位。 (我知道这些很多人都知道,重复重复再重复我也很烦)。

接下来,我来假设一个主控和颗粒环境:
[attach]19706[/attach]
1个8通道8位的主控连接到8个Die上,为了解释方便,我这里就画了每个Die里的第一个Block。(实际当然要复杂很多)

好了,接下来我们要进行读写了,看清楚,这下面的东西才是你们最想知道的。
1. 现在我先对主机发送一条命令,要求写入4KB。
[attach]19707[/attach]
主控接到主机发来的指令后,往颗粒1的Block1里写入了1个4KB(占1Page)。

2.继续写入8KB。
[attach]19708[/attach]
主控接到主机发来的指令后,往颗粒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都被填满了,就会产生如下图的情况:
[attach]19709[/attach]
这个图显示的是LBA(逻辑块地址),也就是我们的操作系统看到的文件系统结构,而非我们的SSD主控制器看到的结构。

图中红色的地方表示为这个地址里的数据已经“过期”或者“无效”,这些红色地址是如何产生的?在你删除文件的时候,这个地址就“无效”了,里面的文件还在,只不过不用了而已,等待下一次的数据更新并覆盖进去。

对于SSD的主控制器来说,它看到的并不是如图中这样,而是如下图:
[attach]19710[/attach]
是的,在SSD主控制器看来,这里的文件都是有效的,也就是不能擦除,那么接下来如何?在操作系统的要求下,继续写入数据的话就要在前面LBA红色的地方写入,对于SSD来说,这时候就需要把整个块的绿色读进缓存并更新操作系统发来的数据,之后擦除这整个块并把缓存里的整个更新完的块写回去,这样即使写入4KB的数据,其实也是大费周章的折腾,这就是早期SSD主控制器或者U盘写入放大高的道理,这些SSD的算法上不支持GC,也没有Trim,所以在随机写入的表现上非常的悲剧。
-------------------------------------------------------------------------------------------------------------------------

Trim是什么?他带来了什么好处?

Trim是一条ATA的指令,当最新的操作系统删除文件的时候(包括格式化),同时把这个文件地址发送给SSD的主控制器,让主控制器知道这个地址的文件地址无效了,好了,到此结束,没有下文了。

Trim的完成需要几点:1.SSD的主控制器必须认识Trim指令,也就是固件要支持。2.操作系统必须会发送Trim指令,也就是删除时候会发送。3.操作系统下的控制器驱动必须要支持Trim指令的传输,也就是能够Pass Trim指令到SSD主控制器。

如果SSD的主控制器支持Trim并且有开启的话,他看到的图就会是这样:

[attach]19724[/attach]

是的,基本和操作系统看到的差不多,那些不一样的地址是因为并非删除操作造成的“无效”,而是由于覆盖等原因造成的,所以操作系统并没有发送Trim指令告诉SSD主控这个地址。

那么相比之前的SSD主控制器,我们有了Trim,带来了提升是啥道理哪。

如果光有Trim,提升并不大,因为数据的写入还是需要读取进入缓存并更改整个块,只是Trim后红色的page就不需要读取进入缓存更新了,因为SSD主控已经知道那个地址的数据无效了,只省下来了红色page的读取写入时间,写入放大一样很高,如何才能解决这个问题?

那就是GC,垃圾回收技术:

垃圾回收类似于硬件级的整理,不受制于文件系统和操作系统,而由SSD主控制器全权负责的合并有效文件,擦除无效文件。

我们知道每个SSD至少都有7.37%容量的第一层OP(预留空间),GC技术就可以利用那个空间来作为垃圾回收处理厂。
如图:
[attach]19712[/attach]
前面说过了,SSD有备用空间,那么合理应用那个空间作为垃圾回收,我们可以把颗粒1的Block1和颗粒2的Block1里的绿色有效page合并到颗粒N的block1里面,并删除掉颗粒1的Block1和颗粒2的Block1.这样我们就用了1个空白Block(颗粒N的Block1换到了2个空白Block) ,并把2个空白Block转到备用区去,这就是垃圾回收操作。

操作后就像下图:
[attach]19713[/attach]
这样接下的写入就可以直接写入没写入过的颗粒N的Block1里的page和颗粒N+1的Block1。达到写入的性能提升,也避免了写入放大的大幅度增加。

如果没有Trim的支持,而光有GC垃圾回收的话又会如何?(很多人没有开Trim,或者组了RAID开不了Trim的就会像下面这样,如图:
[attach]19714[/attach]
由于没有Trim,操作系统在删除文件的时候并不会告诉SSD主控这个文件地址为无效,那么只有在更新操作的时候SSD主控才知道这个地址为无效(新数据写入新page,旧page地址被主控映射表标记为无效)。由于红色的page很少,这样就给垃圾回收带来了效率低下的问题,按照这个图中的情况做垃圾回收后会如下图:
[attach]19715[/attach]
是的,垃圾回收用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的读取很快,但是写入相对较慢,其实影响SSD写性能的并不是很多人认为的擦除操作(一般1.5ms),而是写入(每个page/SLC 250us,MLC 900us)。对于相同平台相同的2块SSD在使用环境不同的情况下,写入性能的差距是很明显的,为何会造成了这么明显的差距?这是因为同样的写入操作,需要花费的时间是不同的。

下面2张图我来告诉你
[attach]19717[/attach]
[attach]19716[/attach]

这是2块一摸一样的SSD,一样的平台甚至操作系统驱动,但是唯一的不同是环境,前面个SSD作为系统盘,后面个SSD偏向于视频编辑,所以在上面2个图中我们得到了完全2个情况,我可以这样说,下图中的SSD写入会强于上图的SSD,因为对下图的SSD来说,要得到2个空Block只要直接擦除掉颗粒1的Block1和颗粒2的Block1就行了,而上面的图里就需要做完整的垃圾回收操作,同样的写入操作由于后台垃圾回收的关系会造成性能上的差距也就不言而喻了,为啥下图会有全红块的情况?因为视频文件一般都偏大,当删除的时候地址是连续的,一整块都变无效(红page)了,所以在垃圾回收的时候效率是极高的,这也是为啥持续写入并不会对SSD耐久度造成太大伤害的道理。说句直接了当的话,SSD在每个时间段的写入性能都会不同,因为性能取决于当前内部碎片的程度。

--------------------------------------------------------------------------------------------------------------------------

提升垃圾回收效率的另一个方法,提升OP(备用空间)

企业级产品大多都有很高的OP容量,一般为20%以上,这是为啥哪?
最简单一个道理,看图吧:

[attach]19723[/attach]


[attach]19718[/attach]

有谁认为下图的垃圾回收效率会低于上图的?我相信没人吧,更多的备用空间意味着啥?更高的效率,更多的写入空间,磁盘碎片整理程序也是空白空间越大效率越高吧,在企业级这类极限情况下,靠着被动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的性能下降更慢,恢复更快,减少写入放大来大大提升颗粒耐久度。
作者: fox750916    时间: 2011-1-30 09:18
顶顶.........好东西呀
作者: 大D来了    时间: 2011-1-30 09:19
必须沙发学习
作者: bill5267    时间: 2011-1-30 09:34
揍喜欢傻瓜式的~~
作者: choco_dove    时间: 2011-1-30 10:32
这篇是好东东,我要好好研究下
作者: heroares    时间: 2011-1-30 10:37
学习了啊,还是觉得有够复杂
作者: heroares    时间: 2011-1-30 10:37
学习了啊,还是觉得有够复杂
作者: 世纪冰雷    时间: 2011-1-30 10:49
很用心很简洁易了的说明~蹭一个
作者: yszq    时间: 2011-1-30 10:57
学习了。
作者: 苹果树    时间: 2011-1-30 11:07
支持傻瓜式教学
作者: farng    时间: 2011-1-30 12:20
提示: 作者被禁止或删除 内容自动屏蔽
作者: rocketeer    时间: 2011-1-30 12:53
提示: 作者被禁止或删除 内容自动屏蔽
作者: mwk0314    时间: 2011-1-30 15:14
看完了  还是有点不明白

覆盖的文件 什么时候会被清除呢?有工具能解决么?  

INTEL的工具箱是属于手动GC么?
作者: liwenchao    时间: 2011-1-30 15:19
傻瓜式的好。
作者: neeyuese    时间: 2011-1-30 16:38
看完了  还是有点不明白

覆盖的文件 什么时候会被清除呢?有工具能解决么?  

INTEL的工具箱是属于手动 ...
mwk0314 发表于 30/1/2011 17:14


Intel属于主动GC,工具箱里的优化就是全盘Trim指令发送,然后主控制器就会主动去做GC了。
作者: mosess    时间: 2011-1-30 17:06
学习中!!!!!!!!
作者: NUMB    时间: 2011-1-30 22:27
觉得目前ssd还有发展的空间
作者: 无心飘落    时间: 2011-1-30 22:55
手持原稿,表示毫无鸭梨。。
作者: bill5267    时间: 2011-1-31 11:21
同样另存为原稿的撸过...
作者: keyhx    时间: 2011-1-31 13:11
学习了,真是简洁明了
作者: overthink    时间: 2011-2-1 07:54
好东东,好好研究下
作者: 无心飘落    时间: 2011-2-1 11:39
每日一顶,
作者: zxcv886    时间: 2011-2-2 13:09
支持傻瓜式教学
作者: 神话№亨利    时间: 2011-2-2 14:24
哈哈,多谢分享啦         
作者: smatk768    时间: 2011-2-2 16:40
回复 1# 石头


   非常优秀的科普帖子.  对于了解SSD工作原理大有裨益!  感谢浴室和师太.
作者: woailihjx    时间: 2011-2-6 21:53
用自己的HDD,
作者: j0rdanln    时间: 2011-2-8 09:46
块内PAGE应该顺序写
作者: kanon421    时间: 2011-2-9 12:54
写得很用心,很明了;学习了
作者: novespark    时间: 2011-2-9 16:10
文字加图示简单明了,基本看过一次就能明白了。:D
作者: scattered    时间: 2011-2-11 11:26
先顶后看,主要是太长了,一眼看不到头
作者: ach9999    时间: 2011-2-11 12:10
这个东东写的好  
作者: adamzjw    时间: 2011-2-11 14:55
刚来这个网站就发现了无数技术贴。。。
作者: scwww    时间: 2011-2-12 15:18
留名,顶楼主
作者: xiahait    时间: 2011-2-13 17:02
图太小了,看不到
作者: xmg117    时间: 2011-2-14 19:11
多谢科普
作者: xmg117    时间: 2011-2-14 19:11
多谢科普.强烈建议多些这样的内容
作者: xmg117    时间: 2011-2-14 19:12
多谢科普.强烈建议多些这样的内容
作者: boybao    时间: 2011-2-15 11:20
回复下看看~学习下知识!!!
作者: able0769    时间: 2011-2-18 10:47
留位学习,谢谢楼主
作者: joanslord    时间: 2011-2-21 10:44
写的真好啊,的确够复杂的,看得俺眼花花的:dizzy:
作者: qq372808434    时间: 2011-2-21 21:16
support!!!
作者: nigoleong    时间: 2011-3-1 11:19
实在是好文啊!
作者: 灵威谁仰    时间: 2011-3-6 12:53
学习了,谢谢
作者: scvg    时间: 2011-3-7 09:12
学习了。。。:lol
作者: wildwolf20    时间: 2011-3-13 19:14
感谢石头,懂了~
作者: promise415    时间: 2011-3-17 21:37
学习啦,支持傻瓜教程哈
作者: sev7eno    时间: 2011-4-6 14:36
强大,学习了~感谢作者
作者: xmas    时间: 2011-4-9 12:41
很详细的解释
作者: yj97595077    时间: 2011-4-9 18:21
画的这么帅!!!
作者: lhb1300    时间: 2011-6-15 22:15
受教了,感谢楼主!
作者: jerrium    时间: 2011-6-16 17:34
这个得坚决顶
作者: jier    时间: 2011-6-29 14:43
很是受用,谢谢楼主~~
作者: athrunz    时间: 2011-6-29 15:17
这个得慢慢看
作者: G3-120    时间: 2011-6-29 15:29
讲得简单易懂,看完不会傻瓜...
作者: wsppl23    时间: 2011-6-30 13:01
回复 13# mwk0314

有同样的疑问,

不知道主控在做GC的时候,有效数据是先被读进缓存做处理后再放进OP区域做整理

还是不经过缓存处理,直接由主控把有效数据迁移到OP区域做整理

如果是前者,估计在缓存里面就把覆盖文件删除了,

但如果是后者,那覆盖文件什么时候被清除呢?
作者: SzqZys    时间: 2011-7-2 10:33
写得太好了,深入浅出的典范,您是一个高明的科普作家!
作者: cdzyj    时间: 2012-1-31 22:26
小白学习了,感谢楼主分享
作者: sfcxb    时间: 2012-2-1 23:58
学习了。。。。。。
作者: lugirio    时间: 2012-2-2 02:46
观摩学习中~~
作者: xixim    时间: 2012-2-2 07:36
学习了,支持楼主这种普及式教学方法。
作者: ggxuelei    时间: 2012-2-2 09:41
学习了。。。。傻瓜教程不傻瓜啊。。
作者: sd1601788    时间: 2012-8-12 13:52
学习了。。。。
作者: btx36237729    时间: 2012-8-13 17:13
= =完全无法理解啊
作者: mickey99520    时间: 2012-8-13 22:42
好贴。。难得的技术好贴。。感谢后再看
作者: 固特异轮胎    时间: 2012-8-14 00:03
普及科学知识,提高全民素质
作者: xuweiweixu    时间: 2012-8-14 01:01
简单通俗的技术文,顶石头~~~~
作者: 讯极天度    时间: 2012-9-12 14:15
图文并茂,容易理解,学到了点
作者: sd100v    时间: 2012-9-12 14:53
浅显易懂,看完瞬间全明白了
作者: hanyi1900    时间: 2012-9-12 16:09
先顶再看了,不容易啊,写了那么多,要好好学习了
作者: john01179    时间: 2012-9-13 14:39
不错,了解~LZ的表达不是很好
作者: wind_night    时间: 2013-3-17 22:57
浅显易懂:)
作者: 璨璨璨璨    时间: 2013-3-19 03:24
wsppl23 发表于 2011-6-30 13:01
回复 13# mwk0314

有同样的疑问,


系统会在合适的时候执行清除操作,类似于后文提到的经常做视频渲染的那块固态,整个Block都塞满了等待清除的缓存文件,系统为了提高效率,马上执行垃圾回收了,如果你要问什么时候才是合适的时候,这个标准就要看固件的出厂设置了
作者: milin118    时间: 2013-3-21 19:50
知识编,楼主真能写.......看到我都有点累
作者: villagehead    时间: 2013-3-26 15:08
好东西,受教了。谢谢LZ




欢迎光临 PCEVA,PC绝对领域,探寻真正的电脑知识 (https://bbs.pceva.com.cn/) Powered by Discuz! X3.2