本帖最后由 ranqin520 于 2012-6-7 13:40 编辑
继续WA(Write amplification)写入放大 - 闪存和固态硬盘之间相关联的一个重要属性。
因为闪存必须先擦除才能写入(我们也叫“编程”),在执行这些操作的时候,移动(或覆盖)用户数据和元数据(metadata)不止一次。这些重复的操作,不但增加了写入数据量,减少了SSD的使用寿命,而且还吃光了闪存的带宽(间接影响了随机写入性能)。 早在2008年,Intel公司和SiliconSystems公司(于2009 年被西部数据收购)第一次提出了写入放大并在公开稿件里使用到这个术语。他们当时的说法是,写入放大不可能低于1,但是这种说法在2009年被 SandForce打破,SandForce说他们的写入放大是0.55。 举个最简单的例子:我要写入一个4KB的数据,最坏的情况就是,一个块里已经没有干净空间了,但是有无效的数据可以擦除,所以主控就把所有的数据读到缓存,擦除块,缓存里更新整个块的数据,再把新数据写回去,这个操作带来的写入放大就是: 我实际写4K的数据,造成了整个块(共1024KB)的写入操作,那就是放大了256倍。同时还带来了原本只需要简单一步写入4KB的操作变成:闪存读取 (1024KB)→缓存改(4KB)→闪存擦除(1024KB)→闪存写入(1024KB),共四步操作,造成了延迟大大增加,速度变慢是当然的。所以说写入放大是影响 SSD随机写入性能和寿命的关键因素。 用100%随机4KB来写入SSD,目前的大多数SSD主控制器,在最坏的情况下写入放大可以达到100以上。如果是100%持续的从低LBA写入到高LBA的话,写入放大可以做到1,实际使用中写入放大会介于这两者之间。用户还可以设置一定的预留空间来减少写入放大,假设你有个128G的SSD,你只分了64G 的容量使用,那最坏情况下的写入放大就能减少约3倍。
影响写入放大的因素
许多因素影响SSD的写入放大。下面我列出了主要因素,以及它们如何影响写放大。
1. 垃圾回收(GC)--- 虽然增加了写入放大,但是速度有提升。
这个比较特殊的算法用来移动,合并,擦除闪存块来提升效率。(详见GC章节)
2. 预留空间(OP)--- 减少写入放大,好。(预留空间越大,写入放大越低)
在SSD上划出部分空间留给主控做优化,是用户不能操作的空间。(详见OP章节)
3. Trim 开启后可以减少写入放大,好。
一个ATA指令,由操作系统发送给SSD主控,告诉主控哪些数据是无效的并且可以不用做垃圾回收操作。(详见Trim章节)
4. 可用容量 减少写入放大,好。(可用空间越大,写入放大越低)
用户使用中没有用到的空间。(需要有Trim支持,不然不会影响写入放大。)
5. 安全擦除 Secure Erase 减少写入放大,好
ATA安全擦除命令用来清除在磁盘上的所有用户数据,这个指令会让SSD回到出厂时的性能(最优性能,最少写入放大),但是随着使用时间变长,GC操作恢复后,写入放大又会慢慢增加回来。许多软件使用ATA安全擦除指令来重置磁盘,最著名的为HDDErase。对SSD来说,重置就是(除了OP区域内的部分私有区域外的)全盘擦除操作(逻辑1),瞬间即可完成清除所有数据让SSD回到初始状态。
6. 持续写入(Sequential writes) 减少写入放大,好
理论上来说,持续写入的写入放大为1,但是某些因素还是会影响这个数值。
7. 静态/动态数据分离(Separating Static and Dynamic Data)减少写入放大,好
高端SSD主控制器支持静态和动态数据的分离处理,此操作要求SSD主控制器对LBA里经常写入(动态数据,热数据)和不经常写入(静态数据,冷数据)的数据块进行归类,因为如果块里同时包含了静态和动态数据,在做GC操作的时候会为了改写其实没必要的静态数据而增加写入放大,所以把包含静态数据的块归类后,因为不常改写,写入放大就减少了。但是迟早SSD主控会把这些静态的数据转移到别的地方来进行磨损平衡。(因为静态数据占着的数据块一直不改写,编程次数低于平均值的话,会造成颗粒磨损不平衡,违背了磨损平衡,真够矛盾的。)
8. 随机写入(Random writes)提高写入放大,不好
随机写入会写入很多非连续的LBA,将会大大提升写入放大。
9. 磨损平衡(WL)直接提高写入放大,不好
确保闪存的每个块被写入的次数相等的一种机制。(详见WL章节)
BBM(Bad block management)坏块管理
不管磨损平衡算法如何高明,在运作中都会碰到一个头痛的问题,那就是坏块,所以一个SSD必须要有坏块管理机制。何谓坏块?一个闪存块里包含有不稳定的地址,不能保证读/写/擦的时候数据的准确性。
坏块分出厂坏块和使用过程中出现的坏块,和机械盘的坏块表一样(P表和G表),SSD也有坏块表。出厂坏块的话,在坏块上会有标记,所以很容易就能被识别,后期使用中出现的坏块就要靠主控制器的能力了,一般来说,越到闪存生命的后期(P/E数开始接近理论最大值),坏块就会开始大量出现了。 一般来说闪存出厂都包含坏块,不过厂商有个最小有效块值(NvB-minimum number of valid blocks),以Intel的34nm MLC L63B来说,1个裸晶(die解释详见备注)上4,096个块里至少要有3,936个块是好的,从这上面可以知道,虽然出厂的闪存可能有坏块,但是厂商保证在正常的生命周期里,好块数量不会低于3936个块。而且每个裸晶的第一个块地址(00h)在出厂时是必须保证完好的。(ECC后,这个块必须有效,ECC解释详见备注)。闪存出厂前都会被执行擦除操作,厂商会在出货前会把坏块标记出来(厂商会在坏块的第一个页的SA区打上标记,SA区解释详见备注。) 这样坏块管理软件就能靠监测SA区标记来制作坏块表。由于在使用中会产生坏块,所以SSD的主控制器在每次编程/擦除/复制等操作后都要检查块的状态。对颗粒的ECC要求也要达到厂商的标准以上(主控强不强,看ECC能力也是一个参考)。坏块管理算法是必须的,坏块并不会影响好块的性能。
坏块的标记和管理:
刚出厂的颗粒内部已经被完全擦除过(FFh),坏块在出厂时也被标记上了。 以MLC来说,颗粒内任何的块里最后那页的SA区首个字节数据非FFh的话,那就是坏块。 主控制器必须在每次擦除前读取一下坏块信息,因为坏块信息是可以被擦除的并且不能在擦除后恢复,所以建议不要去擦除原始的坏块信息。在读取闪存内所有的SA区域后,坏块表就被建立了。纯靠自己的坏块识别方法而不使用原厂提供的SA区域坏块信息创建的坏块表是不严谨的,因为在原厂测试中,坏块可能是在某些特定环境下才会出现,所以有可能在自行的检测中被遗漏掉。 当坏块表创建后,主控会把坏块表保存在某个好的块里,每次重启后,主控会从那个块里把表调用进缓存(RAM)里。坏块表中定义的地址是不能被访问的,所以当系统想去访问这个块的地址时,FTL会重新把它映射到好的块地址上去。
块的替换:
在闪存的生命周期中,坏块会逐渐增多。闪存设备上有个状态寄存器,它用来检测操作是否正确完成。当进行写入或擦除操作,状态寄存器检测到错误时,即可判定当前的块为坏块。 鉴于闪存的写入是以页为单位操作的,操作时可能影响到整个块里其它页的数据,所以当状态寄存器发现写入出现错误时,坏块管理程序就能够用好的块替换这个坏块,重新在新的好块里写入这个数据,并把检测到的坏块里其余的有效页数据全部复制到新的块里去,标记老的块为坏块,更新坏块表里的地址,把原本坏块的地址重新映射到新的好块里。
ECC- Error Checking and Correction 校验和纠错
ECC的全称是 Error Checking and Correction or Error correction Coding,是一种用于Nand的差错检测和修正算法。由于NAND Flash的工艺不能保证NAND在其生命周期中保持性稳定可靠,因此,在NAND的生产中及使用过程中会产生坏块。为了检测数据的可靠性,在应用 NAND Flash的系统中一般都会采用一定的坏区管理机制,而管理坏区的前提是能比较可靠的进行坏区检测。如果操作时序和电路稳定性不存在问题的话,NANDFlash出错的时候一般不会造成整个Block或是Page不能读取或是全部出错,而是整个Page中只有一个或几个bit出错,这时候 ECC就能发挥作用了。不同颗粒有不同的基本ECC要求,不同主控制器支持的ECC能力也不同,理论上来说ECC能力也是够用就行。 一般来说NAND 闪存设备使用线性分组码。当前SSD内最普遍的ECC码是BCH码。当数据写入的时候,控制器内部的ECC模块计算数据并生成ECC签名,一般来说这个步骤非常快,因此并不会影响整个SSD太多性能。ECC的签名一般来说都保存在NAND页后部的SA区域,当数据从NAND读取的时候ECC模块回去读取 ECC签名,并对照相同与否来发现出现的错误。 相比发现错误,修复接收到的数据错误更复杂。第一步是检测收到的数据是否出错,这个和上面生成ECC签名的操作一样非常快。如果检测到接收到的数据包含错误比特,就需要去生成独特的ECC算法(比如BCH),这部分会造成性能损失,但是只有在检测到错误时候才做。用生成的ECC算法来修复之前检测到的错误。 必须强调的是,ECC解码过程是可能出现失败的,所以ECC系统架构必须合理的设计才能保证ECC不出错,而ECC能够修复的错误比特数取决于ECC算法设计。拿SandForce 2xxx系列主控来说,最大支持修复每512字节上的55比特错误。(BCH55) 如果ECC纠不过来, 一般会报ECC Fail, 用户表现为Read Fail,有时候ECC甚至诊测不到出错, 就会导致数据错误。 NAND的稳定性需要有多方面保障,ECC只能用来保证部分比特出错时的修复,如果整个页甚至块出现大面积错误,那么只有RAID这类的冗余保护才能修复了。 企业级中甚至还有更苛刻的要求,数据完整性检查,SSD内部所有的总线, 先进先出数据缓存器部分都要查,可以检测数据在进入NAND之前的错误。
如图是个4KB页的NAND闪存。(SA区128字节) 1.每当一个page写入NAND Flash,数据会通过ECC引擎,创造独特的ECC签名。 2.数据和对应的ECC签名存都存放在NAND Flash里,数据放在数据区,ECC签名放在 SA区。 3.当需要读取数据时,数据和ECC签名一起被送往主控制器,此时新的ECC签名被生成。 4.此时主控把2个签名对照,如果签名相同,说明数据没有错误,数据就会被送往主机。如果签名不同,数据就会先放在主控里,而不是直接送往主机。
某些主控会把改正后的数据再次写回闪存,另一些则不会,因为谁也不知道下次读取会不会再出错。 ECC的能力也影响到NAND Flash的耐久度,数据保存期。当NAND Flash的P/E数到了之后,错误数会越来越多,ECC弱的直接就报坏块并标记退休,如果ECC能力足够强,能挖掘出Flash更多潜力,只是效果比较有限。
典型固态硬盘架构介绍:
操作系统:我们使用的操作系统一般为WINDOWS,MAC OS,LINUX之类。 文件系统:每个操作系统都有自己的文件系统,比如WINDOWS的NTFS,FAT32等。 底层驱动:没有驱动程序,硬件是不能和软件交流的。 ATA接口:ATA数据通道接口标准。(这部分后面会详细介绍) 外置缓存:目前很多SSD都带了一定容量的DRAM作为缓存的。缓存里面可以存放用户数据,也可以存放映射表之类的。
NAND控制器里包含的东西: A.主机接口:用来和主机交流用的控制数据传输的部分。 B.FTL闪存转换层:内部包含许多模块,例如坏块管理,磨损平衡,ECC纠错,交叉读写算法和最主要的逻辑物理地址转换功能,请参考之前的章节。 C.NAND接口:主控制器和闪存交流用的控制数据传输的部分。
Legacy/ONFI/Toggly:闪存数据通道接口标准。(这部分后面会详细介绍) NAND闪存:我们平日看到的SLC,MLC闪存颗粒。 ATA数据接口通道标准
ATA技术是一个关于IDE(Integrated Device Electronics)的技术规范。它最早由Texan和Compaq公司提出,目的是把硬盘控制器嵌入到驱动器中。 随着IDE/EIDE得到的日益广泛的应用,INCITS(国际信息技术标准委员会)将该接口自诞生以来使用的技术规范归纳成为全球硬盘标准,这样就产生了ATA(Advanced Technology Attachment)。 ATA发展至今经过多次修改和升级,每新一代的接口都建立在前一代标准之上,并保持着向后兼容性。 第一代是ATA-1,就是用于康柏桌面386 系列的最初的标准规范。它被制定为“主/从”结构。ATA-1是建立在ISA96-pin标准连接器上的附属设备,使用40或44pin的连接器和电缆。在44pin方案里 ,额外多出的4个引脚用来向那些没有单独电源接口的设备提供电力支持。另外,ATA-1同时提供DMA和PIO两种方式传送信号。 ATA-2常被称为EIDE (Enhanced IDE)、Fast ATA 或 Fast ATA-2,此时DMA已经完全执行于这个版本里了,标准DMA传输速度已经由ATA-1里的4.16MBps提升到16.67MBps了。ATA-2还提供对电源管理、PCMCIA卡和可移动设备的支持,通过标准寻址方法CHS(柱面、磁头、扇区)支持最高8.4GB的硬盘容量。此外,ATA-2还引入LBA方式,这一方法突破了硬盘按照CHS方式访问磁盘的老观念,为适应以后硬盘容量的快速增长打下了的良好基础。同时通过不断升级的BIOS版本或者第三方软件,能够达到支持最大137.4GB的容量。只要你的电脑支持EIDE,就可以在CMOS设置中找到LBA(LBA,Logical Block Address)或(CHS,Cylinder、Head、Sector)的设置选项。EIDE支持的硬盘数目也有增加,它允许主板上具有两个插口,每个插口可以分别连接一个主设备和一个从设备,从而可以支持四个IDE设备。随着自我监控检测和SMART等技术的介入,IDE驱动器被设计制造得更加可靠。 ATA-3没有引入更高速度的传输模式,在传输速度上并没有任何的提升,最高速度仍旧为16.6MB/s。只在电源管理方案方面进行了修改,引入了了简单的密码保护的安全方案。但引入了一个划时代的技术,那就是S.M.A.R.T(Self-Monitoring Analysis and Reporting Technology,自监测、分析和报告技术)。 ATA-4融合的最大两个特点就是支持Ultra DMA和整合了ATAPI(AT Attachment Program Interface)标准。ATAPI为CD-ROM、磁带备份机和其它可移动存储设备提供了通用接口。而在此之前,ATAPI是一个完全独立的标准。伴着ATAPI的入盟,ATA-4对可移动介质的支持得到了立竿见影的改善效果,同时Ultra DMA也将DMA的数据传输率从原有的16.67MB/s提高到了33.33MB/s。除此之外,在原有的40pin的接口和线缆基础上,ATA-4外加了40个引脚,总共80个,其中的40根是地线,分散于标准的40根线缆之间用于增强信号质量。ATA-4也被叫做Ultra DMA、Ultra ATA或Ultra ATA-33。 ATA-5主要升级了自动侦测设备使用的是何种线缆,40pin还是 80pin?在使用80pin线缆时,Ultra DMA传输率上升为更高的66.67MB/s。所以ATA-5也被称为Ultra ATA-66。 ATA-6也叫Ultra ATA-100,接口和数据线与ATA66一样,也是使用40针80芯的数据传输电缆,接口完全向下兼容,支持ATA33、ATA66接口的设备完全可以继续在ATA100接口中使用,它提高了硬盘数据的完整性与数据传输率。 ATA-7也叫ATA133。只有迈拓公司(被希捷收购)推出一系列采用ATA133标准的硬盘,这是第一种在接口速度上超过 100MB/s的IDE硬盘。在ATA-7协议的最后卷,加入了对SATA 接口的内容,但是由于初期SATA接口是靠着转接芯片实现,传输率时钟突破不了ATA 133的133MB/s,后期原生SATA芯片开发出后,终于实现了SATA接口达到了SATA 1.5Gbit/s的理论传输率。第二代SATA标准SATA 3Gbit/s在2004出现,符合ATA-7规范,主要改进是在传输率翻倍的同时,线长相比SATA 1.5Gbit/s的1米支持到最大2米。之后英特尔提出了AHCI标准,让SATA支持NCQ技术,提高了多任务多深度环境下的磁盘性能,并支持了热插拔。 ATA协议最新的版本是ATA-8,经过了几次修订强化了许多对现今闪存类形态硬盘的支持,例如ATA8-ACS规范增加了对混合硬盘的支持度。ATA8-ACS2规范增强了固态硬盘Trim指令的部分高级功能。而SATA 6Gbit/s也符合ATA-8规范,增强了NCQ的优先级处理方式和演算法,提升了影音传输方面的质量,并为了解决高传输率芯片增加功耗的问题,增强了电源管理功能。
Legacy/ONFI/Toggly闪存数据通道接口标准
早期的闪存产品每个厂家的设计标准各有不同,会碰到各种各样的问题,特别是到了06年之后,闪存产业市场需求开始发力,造成了迫切需要一个统一的标准来改变这个问题。 2007年1月,以英特尔,镁光,海力士,意法半导体,力晶为首的NAND闪存厂商和控制芯片开发商台湾群联电子以及产品厂商索尼等宣布统一制定连接NAND闪存和控制芯片的接口标准“ONFI 1.0”。 ONFI 1.0制定的是包括:闪存指令,寄存器集,引脚排列,电气参数以及封装等有关标准。主要是从包括东芝和三星在内各NAND闪存厂商的自主标准中,将通用的部分抽出进行了标准化。这样便使控制芯片和中间件不依赖于NAND芯片厂商而可实现通用,由此可减轻产品厂商的开发负担。 由于传统的Legacy接口每通道传输带宽为40MT/s,已经不能满足现今高速发展的SSD产品需求。ONFI 1.0标准把传统Legacy接口每通道传输带宽提升到了50MT/s,可以说ONFI 1.0的目的主要是想着统一接口的设计。 2008年2月,ONFI 2.0宣布了,ONFI 2.0的标准使NAND闪存的通道传输带宽从50MT/s提高到了133MT/s,并保持了老版本接口的兼容性。ONFI 2.0主要是通过下面2项技术来缩短数据在缓存区中的交换传输时间。第一,在DRAM里常用的双倍数据流信号技术。第二,ONFI使用了源同步时钟来精确控制锁存信号,使闪存设备达到了更高的工作频率。 2009年2月,ONFI 2.1宣布了,相比ONFI 2.0更加简化了闪存控制器设计,并将传输性能提升到166MT/s ~ 200MT/s附近。ONFI 2.1特别针对上网本等低消费产品应用做了调整,加入了新的Small Data Move指令,解放低端消费产品在纠错功能上的限制,增强ECC纠错能力,新增交错读取支持,允许主机向NAND闪存写入数据时停止时钟来节省用电,新增Change Row Address指令来解决某些情况下NAND闪存操作负担,并同时向下兼容老的ONFI标准并和老NAND界面兼容。 2009年10月,ONFI 2.2宣布了,在ONFI 2.1的基础上,ONFI 2.2加入了独立LUN重置,增强页编程寄存器的清除,新的ICC测量和规范。前两个功能主要增强了多NAND环境下处理的效率,而规范的电流ICC测试和定义将简化供应商的测试和改进数据的一致性。 2011年3月,ONFI 3.0宣布了,提升接口带宽到400MT/s,降低CE针脚需求来提升PCB的布局能力,支持EZ-NAND(闪存内集成ECC)接口。
另一方面,老牌NAND制造厂商三星的接口标准为OneNAND,而东芝的接口标准为LBA-NAND,由于这两家全球份额加起来接近70%,不可能让IM(英特尔/镁光新加坡合资NAND厂)这个后起之秀那么嚣张,所以在2007年底,2家老牌NAND制造厂商进行了技术上交互式授权,将共享三星的OneNAND和东芝的LBA-NAND闪存专利技术和品牌的生产、市场和销售权。 根据这一互惠协议,在有效期内,三星的ONENANA和FLEX-ONENAND两种混合(FUSION)存储器芯片规格,东芝的单片封装LBA-NAND和MOBILELBA-NAND芯片规格都将互相授权给对方使用。同时两家公司还将共同开发和经营基于兼容各项原创技术的产品。 三星的OneNAND和Flex OneNAND均为在一颗芯片上集成NAND核心、SRAM、错误纠正引擎和逻辑电路的混合存储器,接口为NOR。Flex-OneNAND可划分为SLC和MLC两部分,为消费电子及其他应用提供高度灵活性与高性价比闪存存储方案,同时能有效减少开发时间。 东芝LBA-NAND和mobileLBA-NAND均为在单片封装内集成了控制器和NAND闪存的非易失性存储器,针脚和指令序列均与传统的NAND闪存存储器兼容,但采用了逻辑地址访问方法。LBA-NAND面向于移动消费产品,例如数字音频播放器和个人媒体播放器,mobileLBA-NAND则是为手机应用而设计。两者均可减少开发成本和缩短开发周期。 2010年6月,三星和东芝宣布了他们的新的NAND数据通道接口标准。DDR Toggle Mode模式,相比传统的异步NAND闪存,其接口带宽可从40MT/s提升到133MT/s,DDR Toggle Mode NAND闪存使用双向DQS生成输入/输出信号,在信号上升沿和下降沿都能进行资料的传输,所以速度可以翻倍。由于还是异步设计,没有改变特定的时钟信号,相对同步设计上会更省电,设计上会也相对简单。目前DDR Toggle Mode 2.0版也已经宣布,接口带宽增加到了400MT/s。
|