2024年1月7日发(作者:)
固态硬盘分析
1 固态硬盘名词解释(来源网络)
1.1 垃圾回收 Garbage collection
一旦SSD的所有块都已经写入了一次,SSD主控制器将会初始化那些包含无效数据的块。(陈旧数据,这些块里的数据已经被更新的数据替换,已经无效了,没了LBA地址),现在他们正在等待被删除,以便新的数据可以写入其中,如何优化并整理这些个等待被删除的无效数据,这个算法被称为垃圾收集(GC)。我们可以看出这个操作是要有前提的,就是SSD必须要支持Trim技术,不然GC就显不出他的优势了(这也是为啥目前只有支持Trim的SSD才会有GC功能),而GC的本质区别是它们何时处理?效率多少?
数据的最小写入单位是页,然而擦除的最小单位是块(大小取决于闪存,自己查资料,一般128~256页)。如果在块上的某些页中的数据不再需要,与在该块内好的数据的其他所有页必须全部读取并重新写入到新的已擦除的块内。这个操作叫做Copy Block,每个主控都会带。(包括U盘主控,这也是为了磨损平衡考虑)然后主控制器再删除掉这个块,用来给下一次写入数据用。这种操作一切指令
来自主控而非用户的叫做GC,将会影响写入放大。请记住,GC有点像整理硬盘,所以要保证有一定的可用容量,可用容量越大,GC效率越高。
1.2 预留空间 Over-provisioning
预留空间一般是指用户不可操作的容量,为实际物理闪存容量减去用户可用容量。这块取用一般被用来做优化,包括磨损均衡,GC,Trim和坏块映射。
预留空间分为3层:
第一层为固定的7.37%,这个数字是如何得出的哪?我们知道机械硬盘和SSD的厂商容量是这样算的,1GB是1,000,000,000字节(10的9次方),但是闪存的实际容量是每GB=1,073,741,824,(2的30次方) ,2者相差7.37%。所以说假设1块128GB的SSD,用户得到的容量是128,000,000,000字节,多出来的那个7.37%就被主控固件用做OP了。
第二层来自制造商的设置,通常为0%,7%和28%等,打个比方,对于128G颗粒的SandForce主控SSD,市场上会有120G和100G两种型号卖,这个取决于厂商的固件设置,这个容量不包括之前的第一层7.37%。第三层是用户在日常使用中可以分配的预留空间,像Fusion-IO公司还给用户工具自己调节大小来满足不同的耐用度和性能,而用户也可以自己在分区的时候,不分到完全的SSD容量来达到同样的目的。(要有Trim支持)
预留空间虽然让SSD的可用容量小了,但是带来了减少写入放大,提高耐久,提高性能的效果。
1.3 TRIM
Trim是一种SATA命令,他能让操作系统在删除某个文件或者格式化后告诉SSD主控这个数据块不再需要了。
一般情况下,当LBA被操作系统更新后,只有随着之后的每次数据写入(其实等于覆盖),SSD主控制器才知道这个地址原来早已经失效了。(之前认为每个数据都是有效的)在Win7里,由于Trim的引入解决了这个问题,当某些文件被删除或者格式化了整个分区,操作系统把Trim指令和在操作中更新的LBA一起发给SSD主控制器(其中包含了无效数据地址),这样在之后的GC操作中,无效数据就能被清空了,减少了写入放大同时也提升了性能。
Trim的依赖性和局限性
1. Trim命令需要SSD的支持,某些老型号的SSD可以靠刷新固件得到Trim支持(G2,barefoot,YK40),或者用一些独特的工具(barefoot wiper)提取出系统里所有无效的LBA告诉SSD主控并清除。
2. Trim命令之后,速度并不一定是立马就能提升的,因为Trim后的干净空间可能随机的包含在每个块里,只有等着多次的copy block操作和主控的GC操作才能明显感觉到速度的提升。
3. 就算操作系统,驱动,SSD主控固件都满足Trim命令了,也不代表在某些特定环境下能工作,比如RAID阵列和数据库(至少到目前为止)。
1.4 可用空间
SSD控制器会使用所有的可用空间做垃圾回收和磨损均衡。保证一定的可用空间可以提升SSD效率,减少写入放大。(前提是支持Trim)
1.5 安全擦除 Secure erase
ATA安全擦除命令用来清除在磁盘上的所有用户数据,这个指令会让SSD回到出厂性能(最优性能,最少写入放大),但是随着之后的使用,GC,写入放大又会慢慢增加回来。
许多软件使用ATA安全擦除指令来重置磁盘,最著名的为HDDErase。对SSD来说,重置就是全盘加电(逻辑1),瞬间即可完成清除所有数据让SSD回到初始状态。
1.6 静动数据分离 Separating Static and Dynamic Data
高端SSD主控制器支持静态和动态数据的分离处理,此操作要求SSD主控制器对LBA里经常写入(动态数据,热数据)和不经常写入(静态数据,冷数据)的数据块进行归类,因为如果块里包含了静态和动态数据,在做GC操作的时候会为了改写其实没必要改写的静态数据而增加了写入放大,所以把包含静态数据的块归类后,因为不常改写,减少了写入放大。但是迟早SSD主控会把这块静态的数据转移到别的地方来弥补平衡磨损。(因为静态数据占着的数据块一直不改写,编程次数低于平均值的话,会造成颗粒磨损不平衡,违背了WL,真够矛盾的。)
1.7 持续写入
当SSD持续的写入数据时,写入放大一般为1,原因是随着数据写入,整个块都是持续的填充着同一个文件,如果系统确认这个文件需要改写或者删除,整个块都可以被标记为无效(需要Trim支持),自然就不需要之后的GC操作了。(读取整个块并写入新的块)这个块只需要擦除,比读,改,写更快速有效。
1.8 随机写入
一个SSD主控的随机写入峰值速度一般发生在安全擦除后,完全GC,全盘Trim,或新安装的状态下。
而随机写入的能力取决于主控制器的1.通道数。2.固件效率。3.闪存颗粒写入页面的性能。
然后就是写入放大的多少,越接近于1越好,小于1更那好。
当全盘颗粒都被写过后,GC功能就将被启用,速度就会受到影响,之后的写入放大就会达到SSD主控制器的最大倍数。大量的随机小文件的写入是“闪存杀手”。
1.9 磨损平衡(WL) Wear Leveling
假设一个特定的块被持续的编程写入而不编程写入到别的块,那么这个块将很快被消耗掉编程寿命,造成整个SSD的报废。处于这个原因,SSD主控制器要平均分配每个块的编程次数,这个技术叫做磨损平衡。在最乐观的情况下,这个技术会让全盘的颗粒磨损程度接近并同时报废。可惜的是这个技术要牺牲写入放大,假设对于冷数据,必须经常的移动到别的块,再把热数据移过来,保证2边的块都是一样的磨损度,无谓的增加了写入次数。关键就是要找一个最优化的算法来尽可能的同时最佳化这2个矛盾的条件。
1.10 NCQ技术
NCQ技术让硬盘用第三方DMA协议把一批传输过来的数据放在一个特别的地方,并对他们进行排序优化,如果是机械硬盘,自然会按照逻辑块地址和盘片上的对应位置做出最优化磁头移动操作。对于没有碟片的固态硬盘来说,由于固态硬盘
对所有块一视同仁,操作速度都相同,那么就要对NCQ的操作模式稍加改动,比如改变数据位置,处理顺序来充分利用多通道提升性能。
打个比方说,如果有一个20KB的数据要求写入,接下来又传过来24KB,8KB,12KB的文件要求写入,也就是说是4个数据请求,5,6,2,3pages的写入,对于8通道的SSD主控来说,如果用NCQ技术,把这几个数据排序成5和3pages,6和2pages写入(一次每个通道写1个page),这样只需要2个周期就能搞定这本应该4个周期的数据传输。
1.11
2 SSD性能分析
2.1 SLC比MLC性能高:写性能每个page/SLC 250us,MLC 900us。
2.2 控制器通道越多性能越高:每个通道下都有NAND FLASH,可以并发操作,类似多磁盘并发操作。所以性能与通道数成正比,前提是IOSIZE要越大越好,要大于page大小。
2.3 预留空间/可用空间要大,否则性能会很差。这个影响到写入放大倍数和垃圾回收,所以对性能影响大。
以下为intel的官方文档,可见预留空间对IOPS的影响很大(Firmware:
2G9 measured with 8KB transfer size with a 2:1 Read:Write mix 100%
Random)。
2.4 文件系统要支持并发IO,否则性能会很差,厂家的测试数据通常为队列深度32下的测试性能。
2.5 控制器支持NCQ对性能有好处,但具体性能有多大改善不确定。
2.6 文件系统要支持Trim,否则性能会很差。
2.7 SATA 6G比SATA 3G性能应该影响不大,SATA 3G也可达到280MB/s左右。
2.8 不同型号的SSD性能相差很大,跟所用的主控方案、通道数、内部缓存、NAND颗粒等有关。具体见厂家给出的数据,一般随机写能力越强性能越好。目前看主要是因不同主控芯片表现而不同:
(1) INTEL主控的SSD不出色:如INTEL SSD X25-V 40GB官方数据为Random 4 KB Writes up to 2,500 IOPS,只有读性能的十分之一。见《DRE瓶颈分析(基础数据)》的IOMETER测试数据为7381 IOPS,参考网上非官方IOZONE测试INTEL SSD X25-E数据为6800左右(官方3,300IOPS),目前无法理解。
(2) SandForce和Marvell主控比较出色:如OCZ Vertex 2 40GB采用SandForce1222,官方数据为Random 4 KB Writes up to 45,000 IOPS;如Crucial C300 64GB采用Marvell主控,官方数据为Random 4 KB Writes up to
15,000 IOPS(1208GB的为30,000 IOPS)。
(3) 但官方性能数据有些很虚,不可全信
Intel或者镁光的34nm颗粒,读取性能为:SLC = 34MB/s or MLC = 30MB/s
而写入性能为:SLC 17MB/s or MLC 7MB/s。有些厂家标称很离谱,如写达到250MB/s,但die才8个,除非用了32个DIE*8MB/s才能达到。


发布评论