第二章基本存储设备.docx
《第二章基本存储设备.docx》由会员分享,可在线阅读,更多相关《第二章基本存储设备.docx(33页珍藏版)》请在冰豆网上搜索。
第二章基本存储设备
第2章基本存储设备
基本存储设备是用来存放数据的实际物理载体,不同的存储设备具有不同的物理存储机理,从而导致存取过程的差异。
作为存储系统的设计者虽然不必深入了解存储物理过程的细节,但必须理解各种存储设备的具体数据存取过程,以及相应的存取特性,进而能够建立合理的数据布局和请求调度机制提高存储过程的实际性能。
本章首先介绍当前主流的存储设备:
磁盘、固态盘、磁带和光盘,然后对于几种新型存储设备的原理和特性进行介绍。
2.1磁盘
磁盘驱动器(magneticdiskdriver)是以磁盘为存储介质的存储设备。
它利用磁记录技术在涂有磁记录介质的旋转圆盘上进行数据存储的外部存储设备,具有存储容量大、数据传输率高、数据可长期保存等特点,是计算机系统和存储系统的主要存储设备。
2.1.1发展历史
1956年IBM推出的IBM305RAMAC系统包含首个具有商业用途的IBMModel350硬盘驱动器,这个驱动器有50个24英寸的盘片,有两个磁头同时存取所有的盘片,能够保存5MB数据,平均存取时间为1秒。
此后很多年磁盘驱动器一直具有庞大的体积和重量。
1961年IBM在其1301磁盘中引入了在磁介质表面使用飞行磁头的技术,这项技术一直沿用至今。
1973年IBM推出了IBM3340Winchester磁盘驱动器。
温彻斯特技术主要包括:
①密封的头盘组件。
即将磁头、盘组和定位机构等密封在一个盘腔内,后来发展到连主轴电机等全部都装入盘腔,可进行整体更换。
②采用小尺寸和小浮力的接触起停式浮动磁头。
藉以得到超小的头盘间隙(亚微米级),以提高记录密度。
③采用具有润滑性能的薄膜磁记录介质。
④采用磁性流体密封技术。
可防止尘埃、油、气侵入盘腔,从而保持盘腔的高度净化。
⑤采用集成度高的前置放大器等。
后来的磁盘盘驱动器均采用了温彻斯特技术。
最近十几年以来,磁盘容量基本上是指数增加,这主要得益于磁盘磁密度的增加。
磁密度的提高和磁盘转速的增加,使磁盘存储设备具有更高的容量/价格比。
与此同时,新的技术不断发展和应用以改善磁盘的性能。
在1980年,IBM推出了首个GB级容量的磁盘IBM3380,它有一个冰箱大的体积,重约250公斤,价格大约是4万美元。
1986年,面向块设备的SCSI协议成为磁盘驱动器的标准接口协议。
1989年,朱建刚和NealBertram针对磁介质薄面提出了交换微粒度结构(exchangedecoupledgranularmicrostructure)提高了磁密度。
1991年,针对磁盘读通道提出的最大似然率算法,降低了高速数据传输过程中的误码率。
1995年,希捷开发出液态轴承马达,减轻了硬盘噪声和热量。
1996年,IBM使用了基于巨磁阻的磁头技术,提高磁头的灵敏度。
1999年,IBM推出了170MB和340MB的微硬盘;2005年,制定了3G接口的SATA标准,同年日立和希捷开始使用垂直磁记录技术。
2007年,1TB的磁盘驱动器开始推向市场。
在上个世纪80年代以前,大多数磁盘驱动器使用8英寸或者12英寸的盘片,需要机架和较大的空间。
在很多配置中,这种磁盘驱动器需要三相电源和大电流驱动马达。
因此磁盘驱动器作为内部存储设备并不适用于微型计算机。
直到当Seagate推出第一个5.25英寸,具有5MB容量的ST506后,磁盘才开始在微机中使用,并在80年代中后期开始成为个人计算机和服务器内置存储设备的标准配置。
磁盘容量一直保持指数的增长,早期个人计算机,20MB容量的磁盘已经被认为是很大的;上个世纪90年代中期,个人计算机中不仅存放文档,还包括各种多媒体数据,这个时候其内部的磁盘容量已有8到20GB。
在2009年早期,桌面硬盘的典型容量是320GB到500GB,而最大的单盘容量为2TB。
从磁盘的发展来看,磁盘的物理存储密度平均每年增加一倍,但是平均延迟时间和持续数据传率提升的程度较小,只是通过提高接口速度和驱动器cache大小来增加磁盘的整体性能。
传统上,磁盘一般分为用于服务器和桌面计算机的3.5英寸磁盘和用于笔记本的2.5英寸磁盘。
磁盘容量性能提高的同时,磁盘尺寸也在不断的减小,以适应消费电子类设备对大容量存储的需要。
目前1英寸微磁盘设备的出现使得磁盘日益成为一种主要的可移动、大容量、低价格的存储设备,广泛应用于数字摄像机、数字照相机、MP3设备和各种手持电子类设备。
2.1.2原理和结构
图2.1硬盘内部结构图
典型的磁盘驱动器包括盘片主轴旋转机构、驱动电机、头臂、头臂支架、头臂驱动电机、净化盘腔、空气净化机构、写入读出电路、伺服定位电路和控制逻辑电路等。
磁盘以恒定转速旋转,悬挂在头臂上具有浮动面的头块(浮动磁头),靠加载弹簧的力量压向盘面,盘片表面带动的气流将头块浮起。
磁头非常轻,在现在磁盘中,磁头的加速能够达到250Gs。
头块与盘片间保持稳定的微小间隙,经滤尘器过滤的空气不断送入盘腔,保持盘片和头块处于高度净化的环境内,以防头块与盘面划伤。
根据控制器送来的磁道地址(即圆柱面地址)和寻道命令,定位电路驱动直线电机将头臂移至目标磁道上。
伺服磁头读出伺服磁道信号并反馈到定位电路,使头臂跟随伺服磁道稳定在目标磁道上。
读写与选头电路根据控制器送来的磁头地址接通应选的磁头,将控制器送来的数据以串行方式逐位记录在目标磁道上;或反之,从选定的磁道读出数据并送往控制器。
头臂装在梳形架小车上,在寻道时所有头臂一同移动。
所有数据面上相同直径的同心圆磁道总称圆柱面,即头臂定位一次所能存取的全部磁道。
每个磁道都按固定的格式记录。
在标志磁道起始位置的索引之后,记录该道的地址(圆柱面号和头号)、磁道的状况和其他参考信息。
在每一记录段的尾部附记有该段的纠错码,对连续少数几位的永久缺陷所造成的错误靠纠错码纠正,对有多位永久缺陷的磁道须用备分磁道代替。
写读操作是以记录段为单位进行的。
记录段的长度有固定段长和可变段长两种。
图2.2显示了现代硬盘驱动器SOC主控芯片的主要功能模块。
其中读写通道已经与ARM9内核、伺服控制器、内存控制器等一起集成到一个SOC芯片中了。
图2.2.2现代硬盘驱动器SOC控制器的内部结构图
2.1.3物理特性
磁盘是两面涂有可磁化介质的平面圆片,数据按闭合同心圆轨道记录在磁性介质上,这种同心圆轨道称磁道。
磁盘的主要技术参数记录密度包括位密度、道密度和面密度。
位密度指盘片同心圆轨道上单位长度上记录多少位单元,用位/毫米表示;道密度是指记录面径向每单位长度上所能容纳的磁道数,常用道/毫米表示;面密度是指记录面上单位面积所记录的位单元,常用位/毫米2表示。
磁盘的存储容量是磁盘上所能记录二进制数码的总量,常用千字节(KB)或兆字节(MB)来表示。
存取时间包括磁头从一道移到另一道所需的时间、磁头移动后的稳定时间、盘片旋转等待时间。
磁头加载时间常用毫秒(ms)表示。
每个扇区可以被ECC校验的保护。
误码率指在向设备写入一批数据并回读后,所检出的错误位数与这一批数据总位数的比值。
每个磁道上包含若干扇区。
每个扇区存储的数据容量是一致的。
磁道的周长与同心圆的直径成正比。
在早期的硬盘驱动器中,所有的磁道包含的扇区数目都是一样的,按照固定的圆心角辐射出去,就可以简单的将各磁道的扇区数进行统一。
这样,在磁道边缘的扇区弧长就要大于内部的扇区弧长,其存储数据的密度也要比内部磁道的密度要小。
最终,导致外部磁道的空间浪费。
Zoned-bitrecording(ZBR区位记录)是一种物理优化硬盘存储空间的方法,此方法通过将更多的扇区放到磁盘的外部磁道而获取更多存储空间,也称为zone-binrecording,zonerecording,zone-densityrecording或者multiple-zonerecording。
为了有效利用外部磁道空间,让所有的磁道扇区存储数据密度一致,就需要保证所有扇区的弧长一致。
这样就要根据磁道的半径来重新分配扇区数目。
Zoned0bitrecording方法通过将磁道分组(这种磁道组称为zone)实现了这一目标。
内部磁道的扇区数目较少,外部磁道的扇区数目较多。
这样,外部磁道和内部磁道的存储空间利用率都相等,充分利用了整个硬盘的空间。
最早的硬盘接口是希捷开发的ST-506/412接口,这种接口使用简便,不需要任何特殊的电缆及接头,但是传输速度很低,采用该接口的老硬盘容量多数都低于200MB,到1987年左右这种接口就基本上被淘汰了。
早期IBMPC/XT和PC/AT机器使用的硬盘就是ST-506/412接口的硬盘。
在ST-506/412接口后发布的是迈拓公司于1983年开发的ESDI(EnhancedSmallDriveInterface)接口,它将编解码器内置在硬盘中,而不是在控制卡上,理论传输速度是ST-506的2~4倍,可达10Mbps。
因其成本较高,与后来的IDE接口相比无优势可言,九十年代后就被淘汰了。
IDE(IntegratedDriveElectronics)的本意实际上是指把控制器与盘体集成在一起的硬盘驱动器,IDE/EIDE接口的硬盘只需用一根电缆将它们与主板连起来就可以了。
把盘体与控制器集成在一起的做法减少了硬盘接口的电缆数目与长度,数据传输的可靠性得到了增强。
对硬盘厂商而言,这种接口解决了自家硬盘与其它厂商生产的控制器的兼容问题,使硬盘制造更容易。
对用户而言,这种接口使硬盘安装起来也更为方便。
IDE接口标准后来根据需要又派生出四种ATA(AdvancedTechnologyAttachment)接口,并经过多次改进,发展到ATA133规范。
但是传统的PATA传输方式性能提高的并不是很大,而且实际上已经接近并行传输的极限了。
2001年英特尔公司发布了革命性的串行接口(SerialAdvancedTechnologyAttachment,SATA)标准,将硬盘接口的数据传输方式由并行改为串行,大大减小了接口的针脚数目。
由于串行信号不易受到电磁干扰的影响,它可以高枕无忧地依靠提升频率来达到传输率的提高。
经过几次修改,该接口已公布了SATA1.0/2.0/2.5等标准,数传率可达3Gbps,而IntelIDF最近还披露了两种新的SATA标准:
XSATA和SATA6G,支持数传率高达6Gbps,这么高的速率已能满足未来若干年的硬盘发展需要。
2005年后主流硬盘的接口已经在逐渐过渡为SATA方式。
随着硬盘的发展,各种硬盘的附加技术也在不断更新。
在硬盘的数据缓存方面,早期IDE硬盘的数据缓存只有128KB甚至更小,而目前主流的IDE硬盘数据缓存则为2~8MB。
在硬盘数据保护技术和防震技术方面,有IBM公司的DFT(DriveFitnessTest)技术;原昆腾公司的DPS(DataProtectionSystem)和SPS(ShockProtectionSystem)技术;希捷的Seashield、DST(DriveSelfTest)技术;迈拓公司的数据保护系统MaxSafeI/II、震动保护系统ShockBlock;西部数据公司的数据保护系统DataSafeGuide(数据卫士)等等。
还有像希捷的全磁盘加密技术(FDE)这样的新功能,它通过对笔记本硬盘的全部内容进行加密来保护用户数据,在硬盘丢失的情况下,硬盘获得者将无法访问硬盘上的数据。
这些技术为越来越快、越转越热的高速硬盘提供了越来越强的数据保护能力。
2.1.4存取特性
磁头的定位时间是指从发出读写命令后,磁头从某一起始位置移动至记录位置,到开始从盘片表面读出或写入信息所需要的时间。
这段时间由执行两个基本动作:
一个是将磁头定位至所要求的磁道上所需的时间,称为定位时间或寻道时间;另一个是寻道完成后至磁道上需要访问的扇区到达磁头下的时间,称为旋转等待时间或者旋转延迟,这两个时间都是随机变化的,因此往往使用平均值来表示。
平均定位时间等于平均寻道时间与平均旋转等待时间之和。
对于平均寻道时间的计算一个简化的方法是最大寻道时间与最小寻道时间的平均值。
平均寻道时间为2―20ms,平均旋转等待时间和磁盘转速有关,它用磁盘旋转一周所需时间的一半来表示,如果固定头盘转速为6000RPM,故平均等待时间大约为5ms。
因此磁头的平均定位时间为7-25ms。
事实上上述计算方法比较初略,因此定位时间必须依赖于上一个任务完成时磁头的位置,如果两个请求所在的位置在一个磁道上,则无需额外的寻道时间。
当前磁盘寻道的时间从高端服务器磁盘的2ms到微硬盘的15ms,通常的桌面磁盘为8ms。
事实上寻道时间在这么多年来提高不大,原因在于这种机械运动的性能很难得到改进,例如在微距离内的高度加减速对材料和电机将提出极大的挑战。
除了磁头的定位时间,另一个磁盘访问参数是数据传输率,即传输一个位块,通常为磁头读写一个扇区所需的时间,它与块大小、旋转速度、磁道记录密度和磁盘的外部接口带宽有关。
从主机接口逻辑考虑,应有足够快的传送速度向设备接收/发送信息。
2008年,典型7200RPM桌面磁盘驱动器从disktobuffer的传输率是70MB/s。
这个速度依赖于磁道的位置。
因此外道的扇区数比内道多,而且盘片旋转是等角速度的,所以外道的传输率比内道的要高。
现在的接口普遍采用3Gbit/s的SATA接口,可以实现300MB/s的数据传输率。
事实上,一般讨论磁盘对于单个请求的响应时间可以用下述公式计算:
Tres=Tseek+Trotation+Ttransfer=Tseek+1/(2*RPM)+Sdata/Wtransfer(2-1)
其中Tseek为定位时间,Trotation为旋转延迟时间,可以用每秒旋转速的倒数的一半计算,Ttransfer为传输时间,用请求数据大小除以数据传输率。
在上述公式中,可以看到仅仅第三项和请求大小有关,而前面两项和请求大小无关,因此对于大块数据传输,磁盘有较好的传输效率。
在本地磁盘控制器和内存之间,还包括主机控制器和数据通道两个物理层次,事实上在引入DMA机制后,主机内存和磁盘交换数据不再需要CPU的全程参与,大大提高了磁盘传输效率。
2.1.5磁盘调度
正是由于磁盘的物理存取特性决定了磁盘对于单个请求的响应时间受限于机械部件移动的延迟。
为了提高磁盘的性能,通常使用增加缓冲区和I/O优化调度的方法。
由于磁盘在I/O路径的最底端,所以在此之上,都可以通过增加和有效管理Buffer减少对于盘片的实际读写。
事实上当前文件系统维护一个很大的缓冲区用于存放数据页,当应用发出读写请求时,首先要检查缓冲区里是否有请求的页,如果有则返回;如果没有再向块设备发出I/O请求,但在很多文件系统中不仅仅对于磁盘请求所缺的那页,而是把相邻的页一起读进缓冲区(也是一种预取策略,认为相邻的页具有空间相关性)。
因此合理的buffer调度算法可以有效的增加请求在buffer中的命中率,大大的提高实际I/O的性能。
事实上磁盘自身也通过增加cache改善其读写性能,当前磁盘内的cache就有16MB。
除了使用缓冲区提高系统整体I/O性能之外,有效减少请求的磁头定位时间也是改善磁盘性能的主要手段。
而这种设计依赖于对于磁盘请求队列的高效管理。
事实上当前对于I/O调度算法有以下几个方面的要求:
1.减少磁头寻道的时间。
这是I/O调度算法的基本目标,也是在I/O密集型应用中最为有效改善磁盘性能的方法。
2.增加I/O的优先级。
由于当前磁盘为多个程序服务,不同的程序具有不同的优先级,因此必须通过设计I/O调度程序满足应用对于磁盘请求的优先级要求。
3.同优先级并发的程序具有同样的带宽。
I/O调度程序应该公平为同级应用程序提供同样质量的服务,避免有些程序一直得不到响应。
4.保证特定程序I/O的实时要求。
有些应用具有实时性要求,因此I/O调度算法应该能保证每个请求的最长服务时间小于事先定义的阀值。
事实上,I/O调度算法主要就是对于I/O队列的管理,下面列出主要的I/O调度算法:
FCFS(先进先出)按照顺序执行操作,请求队列不会重排序,每个请求都会服务,不会产生饥饿,性能较差。
SSTF(最短寻道时间有限)寻找离当前完成请求最近的位置的请求执行,而不管方向如何。
和FCFS相比,SSTF减少了整体的寻道时间。
但是SSTF存在饥饿的可能,如果请求比较多,有可能一直停在磁盘的一个部分;另外需要变换方向,磁头有可能在小区域内来回摆动,导致降低性能。
SCAN(电梯算法)磁头按照一个方面移动,服务队列中的请求,直到请求队列中同方向没有请求,随后再反方向移动,服务队列里的请求。
相对于SSTF都有每个请求都有服务机会。
在实现方面有N-step-SCAN和FSCAN,前者把队列中N个请求分为一组,组内使用SCAN算法,而后者把所有请求分为两个独立的队列,新来的请求放到一个独立的队列中,单个队列内采用SCAN算法。
C-SCAN从外道到内道服务请求队列中的请求,到达最内道后磁头反向运动直到最外道,但不服务任何请求,然后再从外道到内道执行请求。
事实上后续很多算法都是在上面算法的基础上进行改进,例如把一个队列按照优先级的不同分为多个独立队列,优先调度高优先级队列,但设置一个计时器,把长期等待的低优先级请求升级到高优先级队列,避免低优先级请求无限等待。
图2.3I/O调度层所在系统中的位置
LinuxI/O调度程序是块设备I/O子系统的主要组件,它介于通用块层和块设备驱动程序之间,所图2.3所示。
当Linux内核组件要读写一些数据时,并不是请求一发出,内核便立即执行该请求,而是把它放到设备的I/O等待队列中。
并通过算法在队列中合并多个相邻的请求,然后发到块设备驱动程序中。
在数据返回后,把数据分别返回给相应的请求。
在2.6内核中,内核中实现了四种IO调度算法,分别为预期(Anticipatory)算法、最后期限(Deadline)算法、完全公平队列(CFQ,CompletelyFairQueuing)算法以及NOOP算法(NoOperation)。
可以在内核引导时指定一种I/O调度算法,也可以在运行时通过sysfs文件系统/sys/block/sda/queue/scheduler来为块设备定制一个特定的I/O调度算法或查看块设备目前所使用的何种I/O调度算法。
CFQ(CompletelyFairQueuing完全公平的排队)(elevator=cfq):
这是默认算法,它试图在多个应用程序间均匀地分布对I/O带宽的访问。
为了实现这种目标,算法为每一个应用程序维护一个排序的请求队列,并且周期性使用轮询的方法扫描这些队列。
一旦发现一个非空的进程请求队列则把这个队列的一批请求放入发送队列的尾部。
Deadline(elevator=deadline):
deadline算法的核心就是在传统的电梯算法中加入了请求超时的机制,该机制主要体现在两点:
(1)请求超时时,优先响应超时请求。
(2)没有请求超时,顺序服务排序队列。
这个算法试图把每次请求的延迟降至最低。
该算法重排了请求的顺序来提高性能。
Deadline算法维护5个队列,除了请求发送队列以外,算法还使用了四个队列。
其中两个排序队列分别包含读请求和写请求,这个队列是按照起始扇区数来排序的。
另外两个最后期限队列包含相同的读和写请求,只不过它们是根据其“最后期限”排序的。
这两个队列的目的是为了避免请求饿死。
因为电梯策略优先处理与上一个处理请求最近的请求,因而就会对某个请求忽略很长一段时间,这时就会发生这个情况。
请求的最后期限本质上就是超时定时器,当请求被传给电梯算法时开始计时。
缺省情况下,Deadline算法读请求的超时时间为500ms,而写请求的超时时间为5s。
也就是说,Deadline算法读请求优先于写请求,因为读请求通常阻塞发出请求的进程。
而最后期限保证了调度程序照顾等待很长一段时间的那个请求,即使它位于排序队列的末尾。
NOOP(elevator=noop):
这个算法实现了一个简单FIFO队列。
假定I/O请求由驱动程序或者设备做了优化或者重排了顺序(就像一个智能控制器完成的工作那样)。
在有些SAN环境下,这个选择可能是最好选择。
Anticipatory(elevator=as):
相对Linux其他的调度算法,这个算法是最为复杂的。
它是deadline算法的一个改进。
和deadline算法一样有两个deadline队列和两个排序队列,I/O调度程序扫描排序队列,在读和写请求间交替执行,但倾向于执行读请求。
通过没有请求过期,则扫描过程是顺序的。
缺省的读失效时间是125毫秒,而写失效时间为250毫秒。
除此之外,Anticipatory算法使用一些启发式方法。
在一些情况下,电梯算法可以选择响应在当前磁头位置后面的请求,它强制磁头回头。
这种情况发生在磁头的向前寻道距离是向后距离的一半以上。
另一个方面,算法收集关于每个进程队列的I/O操作的统计信息,在发送一个来自于进程P的读请求之后,算法检测是否有来自于同一个进程的下一个请求,如果有就立即发送,否则算法搜集来之这个进程的统计信息,如果P有可能很快发送一个请求,那么算法等待一小段时间(缺省的是7毫秒)。
因此算法可以预测来之于进程P的读请求是否“接近”当前发送的请求。
一般而言对于桌面工作站来说,这个算法可能是一个不错的选择,但对服务器则没有理想的作用。
2.2固态盘(SolidStateDisk)
铁酸盐存储设备是第一种固态存储器在真空管计算机时代就已经出现,但是磁鼓的出现,使得它们不在计算机系统中使用。
在上个世纪七八十年代,固态盘被应用于早期的超级计算机中,但由于其昂贵的价格,因此很少被使用。
在1978年storageTek公司开发了第一个现代固态盘。
在80年代中期,SantaClara系统公司研发了BatRam,使用1MB的RAM芯片和定制的控制卡模拟一个硬盘,这个系统包含一个可充电的电池去保护内容在断电后不丢失。
而SharpPC-500于1983年开发了128KB采用磁泡存储的固态盘。
1995年M-Systems公司开发了具有flash的固态盘,从此之后,SSD在空间、军事领域取代磁盘成为主要的存储设备。
这些应用需要在极端震动、真空和温度范围内保证存储系统设备的可靠性。
消费电子市场上面,USB的flash存储卡或者数码相机里面的存储卡有中等的顺序操作和随机读性能,但表现出很差的随机写性能。
而在笔记本市场中,SSD有可能成为磁盘的替换品。
虽然SSD已经出现在笔记本硬盘中,但同等容量下其价格是移动硬盘的10倍以上。
在企业和数据库领域,SSD有非常好的顺序存取和随机读性能。
企业级的固态盘为高性能、高可靠性和节能应用所设计。
OCZ在Cebit2009上展示了1TB的SSD驱动器,它使用PCI-Express的接口,能够达到最小654MB/s和最大712MB/s的数传率。
基于NANDflash的固态存储器(Solid-statestoragedevice)的发展很有可能导致计算机存储系统结构的巨大变化。
相对于磁盘驱动器,SSD不仅在带宽上占有优势,而且在随机读过程比磁盘有数量级的提高。
2.2.1原理和结构
闪存(flash)的存储单元为三端器件,与场效应管有相同的结构:
源极、漏极和栅极。
栅极与硅衬底之间有二氧化硅绝缘层,用来保护浮置栅极中的电荷不会泄漏。
采用这种结构,使得存储单元具有了电荷保持能力,所以闪存具有记忆能力。
闪存是一种电压控制型器件。
NAND型闪存的擦和写均是基于隧道效应,电流穿过浮置栅极与硅基层之间的绝缘层,对浮置栅极进行充电(写数据)或放电(擦除数据)。
而NOR型闪存擦除数据仍是基于隧道效应(电流从浮置栅极到硅基层),但在写入数据时则是采用热电子注入方式(电流从浮置栅极到源极)。
SLC全称为单层单元闪存(Single-Lev