本帖最后由 neeyuese 于 2010-12-10 11:45 编辑
机械硬盘 vs. 固态硬盘 :连续传输 vs. 并行传输
我们知道,机械硬盘是在旋转的盘片上连续传输的,不管一个硬盘里包含了多少个盘片,同一时间只有一个磁头可以读写数据。因此,不管如何复杂的数据结构,都不能做到并行传输,除非许多的机械硬盘组成一个阵列。固态硬盘完全改变了这种传输架构,当前主流的固态硬盘主控制器拥有8~10通道NAND接口,每个接口一般都是8bit(1字节),这对性能的影响是巨大的。而机械硬盘的传输率则取决于盘片上的扇区和密度,所以外圈的传输率高于内圈。
而在固态硬盘上,理论传输率取决于数据总线的频率和颗粒的时钟速率。目前典型的频率在40~50MHz范围,8bit的话就是峰值带宽40~50MB/s。这些只是理论值,因为实际使用不可能有程序能完全的利用到所有的带宽,不过这样解释的话应该很清楚的明白4通道的8bit主控和NAND间的带宽就是接近于200MB/s,而8通道的就是400MB/s了。目前最新的同步NAND颗粒,例如三星的Toggle模式颗粒或者某些IM的ONFI 2.x颗粒,频率从原本的50MHz提高到66MHz,83MHz甚至100MHz,并且同步模式可以一个时钟周期处理2次信息(DDR),这样的话4通道就有533MB/s~800MB/s的带宽,而8通道更有最大1600MB/s带宽。
固态硬盘上没有机械硬盘的外圈传输率大于内圈传输率的说法,事实上主控制器对每个块都一视同仁(速度相等),但是还有些别的因素影响着。
扇区(sectors) vs. 页(pages)
典型的机械硬盘在盘片上分成一个个扇区,每个512B,扇区是最小的物理存储单元。可以想象以512B为单位的扇区来管理,是极其不方便的,特别是对于那些非常大的文件。因此把扇区组起来变成一个新的分配单位“簇”,而“簇”的尺寸取决于文件系统的和盘的容量。
而NAND闪存,应该说是由块(blocks),页(pages)组成的。一个典型的page大小为4KB,一个典型的块包含256个pages,也就是1MB大小。(L63B) 块为最小可擦除单位,页为最小读写单位。
最小可擦除数据尺寸和写入放大(Host Write vs. NAND Write)
一些早期的SSD主控制器使用固定的通道系统,也就是说,如果控制器采用8通道的话,那就是一直使用8通道操作。因此,每次传输都是发送4KB X 8的地址,也就是最小32KB一次的写入。针对这个情况,写入空数据就是写入"FF"到所有地址,也就是啥都不会被改变,"FF"在NAND里是默认“已擦除”的值。这种操作方法的后果是啥?即使我只想擦除一个块,固定8通道操作意味着一次要擦除8MB的容量。这样就造成工作量大增,严重消耗了主控的带宽/性能,而且也严重影响了整个固态硬盘的耐久度。目前更先进的主控制器可以把8个通道独立开来各自执行读写命令。
这个所谓最小可擦除尺寸会影响写入放大。写入放大指的是主机写入量和实际NAND写入量之比。从另个角度上来说,如果主控制器足够聪明的利用多通道操作优势(独立的合理分配每个通道工作),写入1KB数据意味着实际占用1/4 page容量,写入放大是4倍。当然这要比总是以8通道固定操作的好多了,那个就是1/32了,写入放大32倍。
重新定义写入缓存的作用
大多数情况下主机传输到控制器的数据为随机的大小,也就是无法匹配4KB page单位大小。为了简单操作,当前大多主控制器定义了写入只能以page为单位写入。很常见的情况,打个比方,主机要求写入几个字节的数据(log之类),需要很快的写入NAND里,如果之间缺少缓存,会很快造成系统堵塞。由于主控制器不能保持这样的写入一直持续下去,当排队的请求过多,主机总线控制器就会让系统暂时停止响应等待操作以防止造成操作系统损坏。这个典型的问题多发生在初代固态硬盘上。如果这里有写入缓存的帮助,那么小文件或者文件碎片就可以合并成4KB大小写入NAND颗粒。当然,即使用上当前最好的策略,装满pages的效率也只是在90-95%附近,造成内部还有到处有0.5KB和3.5KB之类的碎片。
一些缓存可能来自系统,比如Win7的系统文件缓存。那是操作系统用一个特定区域的系统缓存来合并处理后间隙的写入主控制器,这样就可以避免直接向主控发送很多碎小的文件,靠着主控上的缓存处理并合并写入。从系统文件缓存往主控制器传输叫做cache flushing“缓存转储”(这里指从系统文件缓存 -》主控制器缓存),它的基本原则为“lazy writer”策略。“lazy writer”策略有平衡负载的作用,并会动态调节速率。
磨损平衡,预留空间和块的改组
磨损平衡可以让所有的NAND颗粒块都达到最大使用率,不造成“资源浪费”,是保证固态硬盘耐久度的最关键技术,可以这么说,没磨损平衡的固态硬盘是不能买的。磨损平衡会产生一些有趣的现象。在普通机械硬盘上,逻辑扇区和物理扇区映射是固定的,不会随着数据的存储发生改变。而在固态硬盘上,页和文件系统的逻辑块没有固定的映射关系,所有的映射都是逻辑和抽象层面上的。这样就代表了,对固态硬盘分区,并不会影响磨损平衡,因为磨损平衡机制是对整个固态硬盘的机制,而非某一分区,因此固态硬盘里的块使用分布不会受到系统分区影响,也就是说前面分区的块和后面分区的块相互关联。说的通俗点就是:如果你的固态硬盘分有2个区,系统区和数据区,即使系统区数据更新比数据区频繁的多(读写次数多),应该来说如果磨损平衡算法是成熟的话,2个区的磨损度还是应该接近的。由于这个特性,就产生了一种技术叫“预留空间”,简单来说就是预留空间越大,用户可访问区域越小。打个比方,120G的固态硬盘可以在固件里设置预留空间为60G。预留空间的用处主要有这2点:
1.用来替换磨损度高的NAND块地址。(提升磨损平衡效率)
2.提升垃圾回收的效率。(保持性能和减少写入放大)
可以看下面2张图:
用户使用空间为96G的时候,160G的X25-M有8300IOPS,当用户用满160G的时候,IOPS就跌到1400了。(官标)
用户使用空间为96G的时候,160G的X25-M可以写入耐久度150TB,当用户使用空间为全部160G时候,写入耐久度只有29TB。(官标)
也就是说如果买回个160G的X25-M,分区只分96G使用的话,性能理论就能达到图上最高值。
原生命令行队列(NCQ)
NCQ技术让硬盘用第三方DMA协议把一批传输过来的数据放在一个特别的地方,并对他们进行排序优化,如果是机械硬盘,自然会按照逻辑块地址和盘片上的对应位置做出最优化磁头移动操作。对于没有碟片的固态硬盘来说,由于固态硬盘对所有块一视同仁,操作速度都相同,那么就要对NCQ的操作模式稍加改动,比如改变数据位置,处理顺序来充分利用多通道提升性能。
打个比方说,如果有一个20KB的数据要求写入,接下来又传过来24KB,8KB,12KB的文件要求写入,也就是说是4个数据请求,5,6,2,3pages的写入,对于8通道的SSD主控来说,如果用NCQ技术,把这几个数据排序成5和3pages,6和2pages写入(一次每个通道写1个page),这样只需要2个周期就能搞定这本应该4个周期的数据传输。
错误检查和纠正技术(ECC)
和SRAM和DRAM那种拥有几乎完美的数据完整性不同,NAND的数据完整性和80年代的DRAM差不多(需要校验模块来保证工作稳定)。当前的NAND架构,造成了几乎30%的读取都可能有缺陷,如果没有ECC技术的帮助,那么很可能造成1bit甚至更多bit的错误,后果不堪设想。目前最典型的ECC算法为-所罗门算法。Solomon algorithms,然而随着工艺的更新,错误率越来越高,需要使用更高级的算法-BCH算法。而随着同步颗粒的出现,传输率更高,对算法的要求又提出了新的要求,这个就让专家们去搞定吧,我是不懂了。 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
评分
-
查看全部评分
|