diskgenius

SSD固态硬盘数据存储的秘密NAND数据

2011-3-13 23:36| 发布者: 蝴蝶| 查看: 3656| 评论: 0

摘要: 逻辑页的概念和NAND闪存物理层的抽象概念,听不懂?觉得很搞?那么就开始吧。看左边,这个是软件看到的存储图形(逻辑块地址).每个格子代表一个逻辑页(512B)看右边,这个是NAND闪存存储数据的图形,每个格子代表一 ...
逻辑页的概念和NANDSSD/" target="_blank" class="relatedlink">闪存物理层的抽象概念,听不懂?觉得很搞?那么就开始吧。

SSD固态硬盘数据存储的秘密NAND数据

看左边,这个是软件看到的存储图形(逻辑块地址).每个格子代表一个逻辑页(512B)看右边,这个是NAND闪存存储数据的图形,每个格子代表一个物理页。(目前的普遍为4KB,可以查NAND颗粒参数)在这2者之间起到互相交流作用的就是主控制器了,所以主控制器的好坏是SSD性能至关重要的一个部分。

SSD固态硬盘数据存储的秘密NAND数据


从上面所看到的,控制器的最直截了当的方式写入到闪存是由页大小写入。在这种情况下,逻辑页大小等于物理页的大小。

不幸的是,这种做法有个很大的缺陷:Tracking(跟踪)的开销。如果你的逻辑页尺寸是4KB,那么一个80GB的SSD至少有20,000,000条逻辑页需要被Tracking.(确切的说是20,971,520)。你需要一个非常强大的控制器去分类和处理这些page,并且需要非常多的空间去保存这些表,当然非常大的高速缓存也是逃不掉的。这种方法的好处是能够带来非常高的4KB的写入性能,如果你写的大多数是4KB大小的数据,这种方法能产生最佳的性能。

如果主控设计者不具备特强的专业技术能力,没有足够时间或更详细的NAND结构来使用非常强大的控制器用来处理页级映射,那么可以使用一个更大的逻辑页尺寸。其中一个例子就是把你的逻辑页尺寸变为一个最小可擦写块尺寸(128X4KB页)为512KB。这样做会大大减少需要跟踪和优化的负担,一下子从原本需要映射管理的整盘20971520个页的表降低到只需要映射管理16.3万个块的表。可以大大减小主控制器内部结构的复杂程度和规模,并减轻负担,好处是非常高的大文件持续写入性能。如果用户的需求是大数据流(视频)类应用,这种具有大逻辑页的表管理会起到最佳效果。大家会发现类似数码照相机存储领域的应用里,大部分都是2MB~12MB的图片,这类大逻辑页尺寸的管理往往会起到最佳化性能。不幸的是,持续写入强大性能的背后带来了小文件写入上的低能。请记住,对MLC来说,写入速度原本就比读取速度慢了至少3倍,加上实际写入小文件但是主控却会写入大文件后,这种结果让速度更急剧恶化。比如你想写入一个8KB的文件,主控制器将会写入512KB(在这种情况下),因为最小的可知的写入尺寸为512KB(表映射大小),这无疑会大大增加写入放大。

记得当初barefoot还没发布前,内部预览版的逻辑页就是512KB的块,结果随机4KB很低能,然后新固件开启了页映射才提升了4KB写入性能。

2.这里我就稍微带过下了,设想你正在运行一个自助餐厅。你的餐厅有200个碟子,你的自助餐厅一晚上一共会有1000个客人吃饭,那么我们知道你需要招呼的客人是整个餐厅200个碟子的5倍,谢天谢地还好他们不是一起来。 ^_^你有一个洗碟工负责洗碗,等一桌的碟洗完后再一叠子拿出去给新到的客人用。非常简单不是吗?这就是SSD如何工作的。

记住规则:你可以读取写入一个页,但是你必须擦除一个块。如果一个块的页全部为无效的,这个块必须被擦除才能写入新的页。所有的SSD都会有一个等待洗碟子的“洗碟工”,他的工作就是清洗碟子让新的客人用。当碟子是全新的时候,洗碟工不需要洗碟,但是随着碟子一个个被用过了,这个洗碟子工作就变成日常的一部分了。

SSD固态硬盘数据存储的秘密NAND数据


现实中的写入往往像图中这样,一个新的空白的块被分配出来,把原块里有效的数据和你新写入的数据一起复制过去,然后原块被完全清空。然后旧数据块被重新放到空白块备用区。因为主控需要他们,被清空的块被送到这个备用区等待下次的分配写入,这样来回循环着。
下面我们来看下平均潜伏期和最大潜伏期:

SSD固态硬盘数据存储的秘密NAND数据

SSD固态硬盘数据存储的秘密NAND数据

虽然平均潜伏期异常的低,但是最大潜伏期却大了至少350倍。这个相对机械硬盘来说还是低的,但是为啥会相差那么多?这其中到底发生了啥事?这就是写入放大造成的结果。

SSD固态硬盘数据存储的秘密NAND数据


从上图中,我们看到当一个数据写入进来后,一个空的块被用掉。(当还有空白块的时候)。为了一直有一定量的空白块可以写入,必须定时做垃圾回收。在一块拥有最多“无效数据”的块将会被优先进行复制到新空白块,并清空旧块的操作,然后这个块被送进“空白块”备用区。在这个图中,我们看到了我们请求写入的尺寸(左边),但实际上我们写入了更多数据。(右边,写入中包含了垃圾回收操作留下的有效数据)。这种情况就被叫做写入放大。
写入放大是SSD主控制器实际写入的数据和主控制器想要写入的数据之比。写入放大1是最完美的,意味着你写入1MB数据,主控制器实际写入1MB数据。但是实际运行中,写入放大往往大于1。写入放大越高,SSD挂的越快,性能越低。 (最新的SandForce主控官方称写入放大是平均0.55压缩算法,Intel的主控官方称小于1.1。早期的JMF602之流在5以上。)

3.SSD写入的2个关键点:文件碎片和写入合并。
SSD内部多通道技术让写入大文件时候得到类似RAID 0阵列一样并行写入的能力。 (分解文件并行写入)

SSD固态硬盘数据存储的秘密NAND数据

这个就是当写入1个128K文件时候,经过主控处理后写进NAND的图片。当我们读取这个文件的时候,经过主控处理多通道技术读取出来速度也是非常可观。

还记得前面说过:小文件随机读写性能是硬盘上最慢的吗?

SSD固态硬盘数据存储的秘密NAND数据


假设我们要写一个4KB的文件,但是这个是NAND闪存写入的最小单位页大小,所以只能用一个通道的速度写入。
SSD固态硬盘数据存储的秘密NAND数据
Intel和其他厂商结合许多小的随机写入,再同一时间一起写入。 在一开始,我们写入了1个128KB的文件,现在来看看当我们删除的时候发生了啥情况:
SSD固态硬盘数据存储的秘密NAND数据
整个块都是无效数据,所有的块都能被快速擦除。

SSD固态硬盘数据存储的秘密NAND数据


许多4KB不规则的碎片布满了整个Block,(因为当我们删除其中一个4KB文件的时候,别的文件并不需要被标记删除,经过几轮删除后,就变成了图中这个情况了。)

唉。这些支离破碎的块是最麻烦的。。几乎每一个写入到这些块将需要读,改,写操作,将大大增加写入放大,这就是写结合的缺点。(除非Trim)
英特尔的控制器能尽力恢复这些情况,这就是为什么它随机写性能仍然不错,三星的控制器不是很善于从这些情况下恢复。 (Trim对三星更重要)现在你可以明白为什么在执行该SSD的大跨度连续写能够修复一个支离破碎的SSD速度的道理了吧。它把一个全是碎片的Block变成一个容易对付的的持续文件Block状况。这也是为啥随着时间的推移,你感觉你的SSD越来越慢,因为你写入的不是一个持续的大文件,而是一个个混合的有大有小的持续或者随机的文件

4.为何我的SSD格式化后容量小了?何为SA区域?

Intel 80G X25-M 有80GB NAND闪存,那就是85,899,345,920字节。(80X1024^3字节)。
机械硬盘制造商用80GB代表80,000,000,000字节表示,它们定义为1GB=1,000,000,000字节。SSD供应商利用了相同的定义,所以80,000,000,000字节等于74.5GB,所以这就是用户能使用的空间。

SSD固态硬盘数据存储的秘密NAND数据

SSD驱动器上到底有多少容量?80G。 Windows格式化后让你使用多少空间?74.5G。 那余下来的5.5G容量到哪里去了?主控制器拿来做备用区。
Intel主控制器的表是动态的。(会随着LBA地址越多而增大,存放的地方也是随机变动的)除非你把整个SSD的LBA填满一次,不然它会使用到整个SSD驱动器上的容量(包括SA区的5.5G)。如果你把整个SSD的LBA填满了,那么他就只能用5.5G的SA区做存放表的空间,这也就是为啥新盘性能那么好的道理。

其它主控例如Barefoot的主控制器存放的表是静态的,它永远用相同容量的表来存放映射地址,这个表存放在它的SA区里。这样的好处是当全盘填满后,性能下降不是显得那么明显。至于为啥Intel要花那么大精力这样做么,(这样来回移动表也会减低NAND耐久度)你们"都懂的"。(新盘用HDtune跑IOPS成绩出奇的好,都没跑在NAND上。

5.Trim是一条ATA新标准里的命令,Trim不是动作,Trim不执行任何东西,Trim的目地只是要告诉SSD主控制器操作系统看到的东西。如果你有仔细看帖,你应该“懂的”。Trim把"逻辑页"现在删除掉的文件状况告诉了SSD主控制器。打个比方:我(操作系统)把你(SSD主控)房间里的东西丢了,但是你不知道,我现在告诉你,我丢了你的东西,你知道了,这个“我告诉你,你知道了"就是Trim成功了。

既然如此,Trim的三要素就能理解了:
1.主控能接收: SSD的主控制器要“明白”Trim命令,就像我和你说话,你听不懂也白搭。这就要有固件的支持。Intel Gen1的SSD由于Rom尺寸太少,不够放入Trim解析,“不明白”啥叫Trim,所以永远也不能支持Trim了。

2.系统会发送:Win7,Win2008R2系统支持Trim命令发送。命令行里输入:fsutil behavior query DisableDeleteNotify,返回DisableDeleteNotify=0就是说Trim命令发送被开启了,DisableDeleteNotify=1就是说Trim命令发送被关闭了。

3.驱动能传输:不是所有的驱动都能传输Trim指令的,对驱动也是有要求的,就像给你一批货,你没一辆货车是运不走的一样。
                         msahci.sys --> Working TRIM   微软AHCI驱动
                         pciide.sys --> Working TRIM    微软IDE驱动
                         intelide.sys --> Working TRIM  Intel IDE驱动
                         iaStor.sys --> (v9.6.1014 以上) Working TRIM  Intel RST RAID/AHCI驱动。RAID MEMBER不支持Trim传输。
只有同时满足上面3个要素,Trim才能完成。

6.实用的Indilinx Wiper工具。
我们知道只有Win7和Win2008R2支持Trim指令发送,所以就算你的SSD支持Trim,在Xp或者Vista下也是白搭。如果你用的是Barefoot的主控SSD的话,恭喜你,这个小工具能解救你。原理么:

SSD固态硬盘数据存储的秘密NAND数据

SSD固态硬盘数据存储的秘密NAND数据


这个程序会去像操作系统要一个所有未使用容量的LBA地址文件,然后把这些地址送给SSD主控,告诉它去trim这些地址。(优先清洗这部分的“碟子”)。应该来说它不会去碰任何有效的数据(当然如果你文件系统有问题,LBA出错么。。),当清理完成后,那些不包含有效数据的块就将恢复出厂性能(清空了)。这个工具就是这样一个,不需要操作系统支持Trim就能达到效果的小东西。(它代替了OS发送trim指令给SSD主控,当然有些时候会碰到些驱动兼容问题。

7.IGC(闲置垃圾回收)

固件里加入了自动整理碎片的技术,不需要用户和系统的干预,支持RAID阵列。Barefoot,Sumsung RBB,C300/P300支持这个技术。(具体操作算法没有标准,每个厂家都是不同的)

仔细看帖子的朋友应该“懂的”,主控制器会在机器闲置的时候,把NAND里支离破碎的文件状况整理成比较整齐的状况。这样做的效果和Trim有点区别,Trim提升的主要是删除后被清空的数据块的速度,而GC在这基础上更提升了包含数据的数据块速度。如果没有Trim的支持,这个提升是有限的,如果Trim加上GC,那么就起到了事半功倍的作用了。

垃圾回收操作会带来写入放大,会影响寿命,增加笔记本待机负担,在闲置时硬盘会狂闪,所以主控厂适当限制了垃圾回收块的数量,可惜目前还没有程序能关闭这个功能

8.HDtune。这里我再分析下Intel的主控制器分别对比Barefoot和SandForce。
Intel的测试成绩就拿这里的数据说话吧。

SSD固态硬盘数据存储的秘密NAND数据


SSD固态硬盘数据存储的秘密NAND数据


这2个是Intel的SSD数据填满整个SSD和清空SSD的跑分成绩,如果看过我上面说的第4条,那么就应该看得出,Intel的映射表应该是动态的,随着数据越来越多,表也越来越大。这里成绩相差那么多,是因为当盘里没数据的时候,HDtune跑的是目标速度,看过上面我那个帖子就应该知道,所谓的目标速度,在这里也就成了“主控能力”,这不是真实的用户体验速度,是不真实的。日常使用中,我们在SSD里填入用户数据,用户数据占的位置在表映射看来就成了真实NAND速度,对于HDtune这类随机抽查地址上分布点速度的软件来说(这类软件不要求一定有分区),用户数据占的位置越分散,越多(包括无效,也就是已删除但没被Trim的数据),那么被抽查到的几率也越高,平均起来IOPS就会低,不如空盘的速度了。这里全盘填满的X25-M速度是比较悲剧的,IOPS不但低,最要命的是随机那项最大潜伏期竟然到了56547.850ms,天知道他抽查到了哪个悲剧的NAND地址,然后由于没地方释放做GC,造成数据不能被读改写,只能靠着主控里的数据缓存跑,可惜那里容量实在不大,经不起折腾。当然了,这里的成绩是2个极端,只是想证明一点,Intel的表是动态的,而且是随机分布在整个SSD容量范围内的,而HDtune测试IOPS不严谨,导致很多评测网站跑出的IOPS高,误导了很多消费者。另外就是大家看2个图4KB的IOPS,一个是60MB/s(空盘),一个是21MB/s(满盘),那么自己心里想想,自己跑CDM测试的时候4KB读取时是多少?我估计都在20~30MB/s之间吧,我要表达的意思你们"懂了"吧。

看完了Intel我们来看下SandForce吧:数据取自上面我的评测贴.

SSD固态硬盘数据存储的秘密NAND数据

SSD固态硬盘数据存储的秘密NAND数据



也是空盘爆高,有数据的时候又低很多的吧,那么这个表示啥?我们知道SandForce是靠压缩来提升性能的。

那么,SandForce里有个技术,这个叫做DuraClass的技术会自动接管主控的读写能力,所谓有得必有失,压缩能提高传输率,数据能被压缩1倍,意味着传输时间少1倍,速度也就提升了1倍,但是压缩是要花代价的,那就是编码时间,这个就造成了一定的延迟,而延迟对SSD是很关键的.SandForce的主控能力大家有目共睹了(这里的空盘数据),它的映射表是由DuraClass生成的,DuraClass操纵着整个盘的读写能力,映射表是当你第一次在SSD的用户区写入数据时候就一下子生成的,这个表应该是放在SA区的固定位置,但是却对应整个SSD的NAND地址(包括有数据和无数据的),也就是说当表被生成了,跑的HDtune测试就都是在NAND上跑了,不管今后你把SSD填满还是咋的,这个IOPS永远就那样了。(当然你的数据太分散,太随机还是会有小幅影响的,之前几条我有说明理由)。

最后我们来看看Barefoot主控。测试数据拿我帖子里的。 

SSD固态硬盘数据存储的秘密NAND数据

Barefoot的主控,我之前有说过,映射表是固定的,所谓固定的就是放在了某一个地方一直存在的,静态的,放在SA区里,对应了NAND上的每个地址,不管你如何测试,这个IOPS都是差不多的,和SandForce生成表后的意思是一样的。

不同的软件测试的方法不同,带来的数据误差自然是有的,但是不应该会差很大。不会出现HDtune 4KB跑60MB/s跑进CDM只跑30MB/s的事,那肯定是哪里有问题了,上面就是我的解释。

开心

鄙视
1

鼓掌

愤怒

可怜

刚表态过的朋友 (1 人)

最新评论

寻好东西

解决叠瓦SMR硬盘及SSD固态致命缺陷 Zonefs文件系统西数正在开发

解决叠瓦SMR硬盘及SSD固

针对SMR叠瓦式硬盘存在的问题,西数正在用更先进的技术解决,他们开

固态硬盘不认盘了能做数据恢复吗?数据恢复方法

固态硬盘不认盘了能做数

固态硬盘不认盘了能做数据恢复吗?从专业数据恢复层面来讲,当前有一

为什么好多服务器还使用机械硬盘,而不选固态硬盘呢?

为什么好多服务器还使用

如今固态硬盘基本成为了标配,机械硬盘相比固态硬盘在读写速度在存在

返回顶部