前言

磁盘分为软盘和硬盘将布满磁性粒子的一片圆形软片包裹在一个塑料壳中,中间开孔,以便电机夹住这张软片来旋转,这就是软盘。软盘和录音带是双胞胎,软盘记录的是数字信号,录音带记录的是模拟信号。软盘被设计为块式而不是流式(只能定位到磁带上某首歌曲的前后,不能直接定位到中间某句歌词)的,所以需要进行扇区划分等操作。

3.1 硬盘结构

1.结构图

硬盘大致由盘片、读写头、马达、底座、电路板等几大项组合而成。

主板bios磁盘控制器在哪 磁盘的控制器bios_磁道

2.盘片

盘片的基板由金属或玻璃材质制成,为达到高密度、高稳定性的要求,基板要求表面光滑平整,不可有任何瑕疵。然后将磁粉溅镀到基板表面上,最后再涂上保护润滑层。用到两项高科技,一是要制造出不含杂质的极细微的磁粉,二是将磁粉均匀地溅镀上去。

盘片每面粗计密度为39201120000 b,密度相当高,不可有任何污染。磁头是利用气流漂浮在盘片上的,太高读取的信号就会减弱,太低可能磨到盘片表面。

3.磁头

硬盘的存储原理是将数据用其控制电路通过硬盘读写头去改变磁盘表面上极细微的磁性粒子簇的N、S极性来加以储存。

飞行高度(Flying Height)非常小(可比喻成要求一架波音747客机,其飞行高度需保持在1m的距离二部可坠毁)。实现这种技术,完全是靠磁盘旋转时,在盘片上空产生气流,利用空气动力学使磁头悬浮于磁片上空。几微米 -> 0.1~0.5μm -> 0.005~0.01μm

早期的硬盘在每次关机之前需运行Parking程序,让磁头回到盘片最内圈的一个不含磁性粒子的区域,叫做启停区。当盘片转速达到额定速度时,磁头就会因为盘片旋转产生的气流抬起来,这时磁头才向盘片中存放数据的区域移动。

4.步进电机

为了让磁头精确定位到每个磁道,用普通的电机达不到这样的精度,必须使用步进电机,利用精确的齿轮组或者音圈,每次旋转可以仅仅使磁头进行微米级的位移。音圈电机则是使用精密缠绕的铜丝,置于磁场之中,通过控制电流的流向和强度,使得磁头臂在磁场作用下作精确的步进。音圈:最开始用在喇叭的纸盆上,通过控制电流来控制纸盆的精确震动。

3.1.1 盘片上的数据组织

每个盘片的每个面都有一个读写磁头,磁头起初停在盘片的最内圈,即线速度最小的地方。这个区域不存放任何数据,称为启停区或着落区。启停区外就是数据区,在最外圈,离主轴最远的地方就是0磁道,硬盘数据的存放就是从最外圈开始的。

主板bios磁盘控制器在哪 磁盘的控制器bios_数据_02

1.盘面

硬盘的每一个盘片都有上、下两个盘面,都可以存储数据。有效盘面按从上到下的顺序从0开始依次编号。在硬盘系统中,盘面又叫做磁头号,因为每一个有效盘面都有一个对应的读写磁头。

硬盘的盘片组在2~14片不等,通常有2~3个盘片,故盘面号/磁头号为0~3或0~5。

磁头传动装置是使磁头作径向移动的部件,有步进电机和音圈电机两种,以很小的等距离使磁头部件作径向移动,用以变换磁道。

2.磁道

磁盘在格式化时被划分成许多同心圆,即磁道,从最外圈向内圈从0开始顺序编号。每个盘面有300~1024个磁道,新式大容量硬盘盘面的磁道数更多。这些同心圆磁道不是连续记录数据,而是被划分成一段段的圆弧,这些圆弧的角速度一样。由于径向长度不一样,所以线速度也不一样,外圈的线速度较内圈的线速度大。在同样的转速下,外圈在相同的时间段里,划过的圆弧长度要比内圈大,因此外圈数据的读写要比内圈快。

每段圆弧叫做一个扇区,从1开始编号,每个扇区中的数据作为一个单元同时读出或写入,是读写的最小单位。扇区内部的数据是流式记录的。磁道肉眼不可见,只是盘面上以特殊形式磁化了的一些磁化区。

划分磁道和扇区的过程,即低级格式化,一般在硬盘出厂时已经格式化完毕了。高级格式化指的是对磁盘上所存储的数据进行文件系统的标记,而不是对扇区和磁道就行磁化标记。

3.柱面

所有盘面上的同一磁道,在竖直方向上构成一个圆柱,即柱面。每个圆柱上的磁头由上而下从0开始编号。数据的读写按柱面进行,磁头读写数据时首先在同一柱面内从0磁头开始今次那个操作,依次向下在同一柱面的不同盘面上进行操作。只有在同一柱面所有的磁头全部读写完毕后磁头才转移到下一柱面,因为选取磁头只需通过电子切换即可,而选取柱面则必须通过机械切换,即寻道。

4.扇区

(1)扇区头标

将每个环形磁道等距离切割,形成等长度的圆弧,每个圆弧就是一个扇区。划分扇区使数据存储更加条理化。每个扇区可以存放512B的数据和一些其他信息。有两个主要部分:存储数据地点的标识符和存储数据的数据段。

扇区头标包括组成扇区三级地址的三个数字:柱面/磁道 Cylinder、磁头编号 Header、扇区号 Sector,间称CHS;

主板bios磁盘控制器在哪 磁盘的控制器bios_磁道_03

CHS编址方式在早期的小容量盘中非常流行,目前的大容量硬盘的设计和低级格式化方式已经有所改变,转为LBA编址方式。不再划分柱面和磁头号,这些数据由硬盘自身保留,而磁盘对外提供全部为线性的地址,即LBA地址。

磁盘中的控制电路依然要找到LBA地址对应的磁道、磁头、扇区,这种对应关系保存在磁盘控制电路的ROM芯片中,磁盘初始化的时候载入缓存中以便随时查询。

头标中还包含一个字段,其中显示扇区是否能可靠存储数据,或者是已发现某个故障因而不宜使用的标记。有些硬盘控制器在扇区头标中还记录指示字,可在原扇区出错时指引磁头跳转到替换扇区或磁道。最后,扇区头标以循环冗余校验CRC值作为结束,以供控制器校验扇区头标的读出情况,确保准确无误。

基于CHS编址方式的磁盘最大容量:磁头数最大为255/8bit、柱面数最大为1023/10bit、扇区数最大为63/6bit,每个扇区一般为512B;255*1023*63*521/1024/1024=8024MB,即8GB。

(2)扇区编号和交叉因子

给扇区编号的最简单方法是采用1、2、3…顺序编号。如果扇区按顺序绕着磁道来编号,那么磁盘控制电路在处理一个扇区的数据期间,可能会因为磁盘旋转太快,没等磁头反应过来,已经超过扇区间的间隔而进入了下一个扇区的头标部分,想读取这个扇区的记录,就要再等一圈。

IBM的一位杰出工程师想出了一个绝妙的方法,即对扇区不使用顺序编号,而是使用一个交叉因子(Interleave)进行编号。交叉因子用比值的方式来表示,如3:1表示磁道上的第1个扇区为1号扇区,跳过两个扇区即第4个为2号扇区,这个过程持续下去直到给每个物理扇区编上逻辑号为止。

系统将文件存储到磁盘上时,是按柱面、磁头、扇区方式进行的,即最先是第1磁道的第1磁头所有的扇区,然后是同一柱面的下一磁头,直到整个柱面都存满。系统也是以相同的顺序去读出数据。

如果是读数据,控制电路会计算此数据的ECC码,然后把ECC码与已记录的ECC码相比较;如果是写数据,控制电路会计算出此数据的ECC码,存储到数据部分的末尾。在控制电路对此扇区中的数据进行必要的处理期间,磁盘会继续旋转。由于对信息的后处理需耗费一定的时间,在这段时间内磁盘可能已经旋转了相当的角度。

磁头扭斜:以原先磁道所在位置为基准,把新的磁道上全部扇区号移动约一个或几个扇区位置。可以理解为柱面与柱面间的交叉因子,只在文件很长、超过磁道结尾进行读出和写入时才发生作用。

扇区号存储在扇区头标中,扇区交叉因子和磁头扭斜的信息也存放在这里。

3.1.2 硬盘控制电路简介

只有存储介质还远远不够,要让数据可以被读写,还要有足够的速度和稳定性满足需求,这就需要配套的电路。

主板bios磁盘控制器在哪 磁盘的控制器bios_数据_04

  • Buffer Memory:缓冲区存储器
  • Interface Controller:接口控制器
  • Micro-processor:微控制器,缩写为MCU
  • PRML:Partial-Pesponse Maximum-Likelihood Read Cannel
  • Timing ASIC:时间控制专用集成电路
  • Servo Demodulator:伺服解调器
  • Digital Signal Processor(DSP):数字信号处理器
  • Preamp:预放大器
  • Positioning Driver:定位驱动器
  • VCM (Voice Coil Motor):音圈电动机
  • Magnetic Media Disk:磁介质盘片
  • Spindle Motor:主轴电机
  • Spindle Driver:主轴驱动器
  • Read/Write Head:读/写磁头
3.1.3 磁盘中的IO单位

磁盘读写的时候都是以扇区为读写单位进行寻址的。

对于磁盘来说,一次磁头的连续读或写叫做一次IO。

目前4KB大小扇区的硬盘已经发布。因为操作系统的Page、文件系统的Block一般都是4KB大小,所以硬盘扇区512B的容量一直为行业所诟病。将扇区容量与上层的单位匹配,可以大大提高效率。


3.3 磁盘相关高层技术

3.3.1 磁盘中的队列技术

假设3个人先后写数据,分别写到最内圈、最外圈、最内圈,此时机械臂在写完第1个数据后,会先写第2个数据,最后再写第2个数据。实现队列功能的程序控制代码是存放在磁盘控制电路芯片中的,而不是主板上的磁盘控制器上。由控制器发给磁盘指令,然后由磁盘自己的DSP固化电路或微处理器载入代码从而执行指令排队功能。

要实现排队技术,仅仅有磁盘驱动器自身是不够的,还必须在磁盘控制器(主板上的磁盘控制)电路中固化代码处理排队,和磁盘达成一致。或者不使用固化代码方式,而是修改磁盘控制器驱动程序,加入处理排队的功能从而配合磁盘驱动器。

Intel在WinHEC 2003会议上发布了高级主机控制器接口0.95版规范(Advanced Host Controller Interface,AHCI),为驱动程序和系统软件提供了发现并实施命令队列、热插拔及电源管理等高级SATA功能的标准接口。这个接口是在新的控制器硬件之上的驱动层面提供一层接口,解决了磁盘控制器不支持硬盘驱动器自身的排队这个问题。

3.3.2 无序传输技术

一种提高磁盘性能的技术,控制器发出一条指令要求读取某些扇区中的内容,磁盘可以不从数据所在的初始扇区开始读,而使采取就近原则。

例如,磁头恰好处于待读取数据的尾部,此时如果等待磁盘旋转到磁头位于这块数据的头部时才开始读,就要等一圈时间,也就是“旋转延迟”。磁头按照能读多少先读多少的原则,然后立即发送给控制器,控制器立即通过DMA将数据放到内存,等磁盘转到数据块头部时再读出剩余的部分发给控制器,这样就避免了时间的浪费。这种技术同样也要由磁盘控制器来支持,或是通过控制器硬件,或是通过驱动程序。

通过指令排队和无序传输可以最大化利用磁盘资源。把麻烦留给控制器,把简单留给磁盘,因为控制器的处理速度永远比磁盘的机械运动快。

3.3.3 几种可控磁头扫描方式

假设目前磁盘控制器的队列中存在如下的一些IO,这些IO所需查找的磁道号按照先后排列顺序为98、183、37、122、14、124、65、67,而当前磁头处于53号磁道,磁头执行寻道操作有以下几种模式:

1. FCFS(First Come First Serve)

磁头完全按照IO进入的先后顺序执行寻道操作。 此模式下磁头滑过的磁道总数为640,如图3-8。

2. SSTF(Shortest Seek Time First)

控制器会优先让磁头跳到离当前磁头位置最近的一个IO磁盘去读写,再跳到离刚度写完的这个磁道最近的一个IO磁道去读写,依此类推。

本例中,如果此时IO队列中不断有位于53号磁道周围磁道的IO进入,如50、50、51,那么诸如183号这种离53号磁道较远的IO将会被饿死,永远也轮不到183号磁道的IO。所以SSFT模式的限制也是很大的。

主板bios磁盘控制器在哪 磁盘的控制器bios_数据_05

3. SCAN(回旋扫描模式)

最传统、最经典的扫描方式。类似于电梯模型,从一到到另一端,然后折返,再折返,循环下去。磁头从最内侧的磁道依次向外圈磁道寻道。如果当前队列中没有某个磁道的IO在等待,那么磁头就不会跳到这个磁道上,而是直接略过去。在SCAN模型中,即使最内圈或者最外圈的磁道没有IO,磁头也要触及到之后才能折返。

SCAN模式不会饿死任何IO,同样也会带来不必要的开销,因为磁头不会中途折返。如果磁头正从中间磁道向外圈移动,此时队列中进入一个内圈磁道的IO,那么此时磁头并不会折返,这个IO只能等待磁头触及最外圈之后折返回来被执行。

主板bios磁盘控制器在哪 磁盘的控制器bios_数据_06

4. C-SCAN(单向扫描模式)

磁头总是从内圈向外圈扫描,达到外圈之后迅速返回内圈,返回途中不接受任何IO,然后再从内圈向外圈扫描。

5. LOOK和C-LOOK(智能监察单向扫描模式)

相对于SCAN模式的区别在于,磁头不必达到终点之后再折返,而只要完成最两端的IO即可折返。

主板bios磁盘控制器在哪 磁盘的控制器bios_磁道_07

关于几种扫描模式的选择,总的来说,在负载不高的情况下,SSTF模式可以获得最佳的性能。但是鉴于可能造成某些的IO饿死的问题,所以在高负载条件下,SCAN或者C-SCAN、C-LOOK模式更为合适。

在大量随机IO的情况下,磁盘的磁头臂会像蜜蜂翅膀一样振动。

3.3.4 关于磁盘缓存

磁盘上必须有缓存,用来接收指令和数据,还被用来进行预读。磁盘缓存时刻处于打开状态。缓存在磁盘上表现为一块电路板上的RAM芯片,目前有2、8、16、32、64MB等容量规格。所谓“禁用”磁盘缓存指的其实是Write Through模式,即磁盘收到写入指令和数据后,必须先将其写入盘片,然后才向控制器返回成功信号,相对于“禁用”缓存。实际上,指令和数据首先到达的一定是缓存。

SCSI指令中有两个参数可以控制对磁盘缓存的使用:

  • DPO(Disable Page Out):禁止缓存中的数据页(缓存中的数据以页为单位存在)被换出。不管是读还是写,被置了这个参数位的数据在缓存空间不够的时候不能覆盖缓存中的其他数据,也就是不能将其他数据换出。
  • FUA(Force Unit Access):强制盘片访问。对于写操作,磁盘必须将受到的数据写入盘片才返回成功信号,也就是进行Write Through。对于读操作,磁盘受到指令后,直接去盘片上读取数据,而不搜索缓存。

所以,当某个SCSI指令的DPO和FUA都被设置为1时,相当于完全不使用缓存的提速功能了,但是指令和数据依然会先到达缓存中,这一点需要分清和理解。

目前基于SCSI指令的磁盘比如SCSI/FC/SAS等都支持FUA和DPO。对于基于ATA指令的IDE/SATA/USB-SATA/USB-IDE等,尚不支持这两个功能位,有另外的函数来绕过缓存。

一次性禁用磁盘写缓存也是可以的,通过调用操作系统提供的一些借口即可实现,操作系统会利用对应磁盘的驱动程序来讲磁盘的写缓存一次性关闭,直到下次磁盘掉电火之歌Reset为止,禁用效果会一直保持。对于用于磁盘阵列中的磁盘,写缓存一律禁用。

3.3.5 影响磁盘性能的因素

磁盘每个时刻只允许一个磁头来读写数据,不管盘以内盘片和磁头再多,也只能提高容量,不可能提高硬盘的吞吐量和IO性能。

影响硬盘性能的因素包括以下几种:

  • 转速:影响硬盘连续IO时吞吐量性能的首要因素。读写数据时,磁头不会动,全靠盘片的转动来将对应扇区中的数据感应给磁头,所以盘片转的越快,数据传输时间就越短。在连续IO情况下,磁头臂寻道次数很少,所以要提高吞吐量或者IOPS的值,转速就是首要影响因素。目前中高端硬盘一般都为10000转每分或者15000转每分。也有厂家要实现20000转每分的硬盘,已经有了成行的产品,最终是否会被广泛应用,还尚待观察。
  • 寻道速度:影响磁盘随机IO性能的首要因素。随机IO时,磁头臂需要频繁更换磁道,用于数据传输的时间相对于换道消耗的时间来说是很少的,根本不在一个数量级上。如果磁头臂能够以更高的速度更换磁道,就能提升随机IOPS值。目前高端磁盘的平均寻道速度都在10ms以下。
  • 单碟容量:影响磁盘性能的一个间接因素。单碟容量越高,证明相同空间内的数据量越大,数据密度越大。在相同的转速和寻道速度下,具有高数据密度的硬盘会显示出更高的性能。在相同的开销下,单碟容量高德硬盘会读出更多的数据。目前已有厂家研发出单碟容量超过300GB的硬盘,但是还没有投入使用。
  • 接口速度:影响磁盘性能的一个最不重要的因素。目前的接口速度在理论上都已经满足了磁盘所能达到的最高外部传输带宽。在随机IO环境下,接口速度显得更加不重要,因为此时瓶颈几乎全部都在寻道速度上。不过,高端硬盘都用高速接口,这是普遍做法。

3.4 磁盘接口技术

硬盘制造是一项复杂的技术,到目前为止也只有欧洲、美国等发达国家和地区掌握了关键技术。但不管硬盘内部多么复杂,它必定要给使用者一个简单的接口,用来对其访问读取数据,而不必关心这串数据到底改什么时候写入,写入到哪个盘片,用哪个磁头,等等。

下文所说的接口是包括物理、逻辑在内的抽象出来的接口。也就是说,一个事物面向外部的时候,为达到被人使用的目的而向外提供的一种打开的、抽象的协议,类似于说明书。

3.4.1 IDE硬盘接口

IDE:Integrated Drive Electronics,电子集成驱动器,本意是指把控制电路和盘片、磁头等放在一个容器中的硬盘驱动器。1)减少硬盘接口的电缆数目和长度,数据传输的可靠性得到增强。2)硬盘制造起来更加容易,不再担心自己的硬盘是否与其他厂商生产的控制器兼容。3)对用户而言,硬盘安装也更加方便。IDE这一接口技术从诞生至今就一直在不断发展,性能也不断提高;其拥有价格低廉、兼容性强的特点,至今仍然有很多用户,但是正在不短减少。

IDE接口,也成为PATA接口,即Parallel ATA(并行传输ATA)。ATA,Advanced Technology Attachment,即高级技术附加。最早1986年开发,最初使用40芯电缆与主板上的ATA接口连接;最后一代的ATA规范使用80芯的线缆,其中一部分是屏蔽线,屏蔽其他数据线间的相互干扰,不传输数据。

1. 7种ATA物理接口规范

ATA-1:主板上有一个插口,支持一个主设备和一个从设备,每个设备最大容量504MB,支持的PIO-0模式传输速率只有3.3MB/s。硬盘大小为5英寸。还支持PIO-1、PIO-2,另外支持4中DMA模式(未实际应用)。

ATA-2:对ATA1的扩展,也称为EIDE(Enhanced IED)或Fast ATA。增加了两种PIO和两种DMA模式,将最高传输速率提升到16.6MB/s,引进了LBA地址转换方式,容量最高达8.1GB。1个IDE有2个EIDE,一个EIDE接两块盘,最大支持4个EIDE设备。

ATA-3:传输速度仍为16.6MB/s。修改了电源管理方案,引入了简单的密码保护安全方案。同时引入了一项划时代的技术,S.M.A.R.T(Self-Monitoring Analysis and Reporting Technology,自监测、分析和报告技术),可以对磁头、盘片、电机、电路等硬盘部件进行监测,通过检测电路和主机的监测软件对磁盘进行检测,把其运行状况和历史记录同预设的安全值进行比较分析。超出安全值范围时,自动向用户发送警告,进而对硬盘潜在故障做出有效预测,提高了数据存储的安全性。

ATA-4:开始正式支持Ultra DMA数据传输模式,也称为Ultra DMA 33 或ATA33,数据传输速率为33MB/s。并首次在ATA接口中采用了Double Data Rate(双倍数据传输)技术,让接口在一个时钟周期内传输数据两次。还引入了冗余校验技术(CRC)。该技术的设计原理是系统与硬盘在进行传输的过程中,随数据一起发送循环的冗余校验码,对方在收取的时候对该校验码进行校验,只有在校验完全正确的情况下才接收并处理得到的数据,这对于高速传输数据的安全性提供了极其有利的保障。

ATA-5:也称为Ultra DMA 66 或ATA66,在ATA33的基础上将接口传输电路的频率提高为原来的两倍,所以收发数据的速率达到66.6MB/s。在工作频率提升的同时,电磁干扰问题开始出现,为保障数据传输的准确性,防止电磁干扰,开始使用40针脚80芯的线缆。

ATA-6:ATA100,线缆与ATA66一样,将电路的频率又提升了一个等级,可以让硬盘的外部传输速率达到100MB/s。提高了硬盘数据的完整性和数据传输速率,对桌面系统的磁盘子系统性能有较大的提升作用,而CRC技术更有效保证了在高速传输中数据的完整性和可靠性。

ATA-7:ATA接口的最后一个版本,也称为ATA133,是第一种在接口速度上超过了100MB/s的IDE硬盘,迈拓是目前唯一一家推出这种接口标准硬盘的制造商。由于并行传输随着电路频率的提升,传输线缆上的信号干扰问题越来越难以解决,已经达到了当前技术的瓶颈,所以其他IDE硬盘厂商停止了对IDE接口的开发,转而生产Serial ATA接口标准的硬盘。

2. IDE数据传输模式

PIO模式:Programming Input/Output,一种通过CPU执行I/O端口指令来进行数据读写的数据交换模式,是最早的硬盘数据传输模式。数据传输速率低下,CPU占用率也很高,传输大量数据时会因为占用过多的CPU资源而导致系统停顿,无法进行其他的操作。在PIO模式下,硬盘控制器接收到硬盘驱动器传来的数据之后,必须由CPU发送信号将这些数据复制到内存中,这就是高CPU占用率的原因。受限于传输速率低下和极高的CPU占用率,这种数据传输模式很快就被淘汰了。

DMA模式:Direct Memory Access,直接内存访问,是一种不经过CPU而直接从内存存取数据的数据交换模式。CPU只需向DMA控制器下达指令,让DMA控制器来处理数据的传送。DMA控制器直接将数据复制到内存的相应地址上,数据传输完毕后再把信息反馈给CPU,很大程度上减轻了CPU资源的占用率。分为单字节DMA和多字节DMA。DMA所能达到的最大传输速率也只有16.6MB/s,和PIO差异不大。

Ultra DMA模式UDMA,高级直接内存访问。采用16-bit Mutli-Word DMA(16位多字节DMA)模式为基准,在包含了DMA模式的优点的基础上,又增加了CRC(Cyclic Redundancy Check,循环冗余码校验)技术,提高了数据传输过程中的准备性,保障数据传输的安全性。在以往的硬盘数据传输模式下,一个时钟周期只传输一次数据,而在UDMA模式中组建应用了Double Data rate(双倍数据传输)技术,数据传输速率有了极大的提高。就是在时钟的上升期和下降期各自进行一次数据的传输。

小结:在UDMA模式发展到UDMA133之后,受限于IDE接口的技术规范,无论是连接器、连接电缆还是信号协议都表现了很大的技术瓶颈,而且其支持的最高传输速率也有限。在IDE接口传输速率提高的同时,也就是工作频率提供的同时,IDE接口交叉干扰、地线增多、信号混乱等缺陷也给其发展带来了很大的制约,被新一代的SATA接口取代也就在所难免了。

3.4.2 SATA硬盘接口

SATA的全称是Serial ATA,即串行传输ATA。相对于PATA模式的IDE接口来说,SATA是用串行线路传输数据,但是指令集不变,仍然是ATA指令集。SATA标准是由Intel、IBM、Dell、APT、Maxtor和Seagte公司共同提出的硬盘接口规范。SATA与IDE结构在硬件上有着本质区别,其数据接口、电源接口以及接口实物图下:

主板bios磁盘控制器在哪 磁盘的控制器bios_主板bios磁盘控制器在哪_08

1. SATA规范的发展历程

SATA技术是Intel公司在IDF 2000大会上推出的,其最大的优势是传输速率高。工作原理非常简单:采用连续串行的方式来实现数据传输从而获得较高的传输速率。2003年发布的SATA 1.0规范提供的传输速率已经达到了150MB/s,超过了IDE最高传输速率133MB/s。

SATA在数据可靠性方面有了大幅度提高。可同时对指令及数据封包进行循环冗余校验(CRC),不仅可以检测出所有单比特和双比特的错误,而且根据统计学的原理还能够检测出99.998%可能出现的错误。相比之下,PATA只能对来回传输的数据进行校验,加上高频率下干扰甚大,因此数据传输稳定性很差。

除了传输速率更高、数据传输更可靠外,节省空间是SATA最具吸引力的地方。线缆精简更有利于机箱内部的散热,线缆间的串扰也得到了有效地限制。不过SATA 1.0规范存在不少缺点,特别是缺乏对于服务器和网络存储应用所需的一些先进特性的支持。比如多任务、多请求的典型服务器环境里面,硬盘性能大幅度下降,还有可维护性不强、可连续性不好等缺点。这时,SATA 2.0的出现使这方面得到了很好的补充。

2. SATA 2.0规范中的新特性

新特性:

  • 3GB/s的传输速率:在SATA 2.0扩展规范中,3GB/s的速率是最大的亮点。由于SATA使用8bit/10bit编码,所以3GB/s等同于300MB/s的接口速率。不过,从性能角度看,3GB/s并不能带来多大的提升,即便是RAID应用的场合,性能提升也没有想象中大。因为硬盘内部传输速率还达不到与接口速率等同的程度。在大多数应用中,硬盘是将更多的时间花在了寻道上,而不是传输。接口速率的提高直接影响的是从缓存进行读写的操作,理论上大缓存的产品会从3GB/s的传输速率中得到更大的好处。
  • 支持NCQ技术:Native Command Queuing,自身命令队列。硬盘是机电设备,容易受内部机械部件惯性的影响,其中旋转等待时间和寻道等待时间就大大限制了硬盘对数据访问和检索的效率。
  • 如果对磁头寻道这个机械动作的执行过程实施智能化的内部管理,就可以大大地提高整个工作流程的效率。即取出队列中的命令,重新排序,以便有效地获取和发送主机请求的数据。有效地排序算法既要考虑目标数据的线性位置,又要考虑其角度位置,并进行优化,以使总线的服务时间最小,这个过程也称做“基于寻道和旋转优化的命令重新排序”。
  • 台式SATA硬盘队列一直被严格地限制深度不得超过32级。如果增加队列深度,可能会起到反作用——增加命令堆积的风险。通常SATA硬盘接收命令时有两种选择,立即执行命令或延迟执行。对于后者,硬盘必须通过设置注意标志和Service位来通知主机何时开始执行命令。然而硬盘不能主动与主机通信,这就需要主机定期轮回查询,发现Service位后将发出一条Service命令,然后才能从硬盘处获得将执行哪一条待执行命令的信息。而且Service位不包含任何对即将执行命令的识别信息,所必须的命令识别信息是以标记值的形式与数据请求一同传输的,并仅供主机用于设置DMA引擎和接收数据缓冲区。这样主机就不能预先掌握硬盘所设置的辅助位是哪条命令设置的,数据传输周期开始前也无法设置DMA引擎,这最终导致了SATA硬盘效率低下。

NCQ包含如下两部分内容:

  • 1、硬盘本身必须有能力针对实体数据的扇区分布对命令缓冲区中的读写命令进行排序。同时硬盘内部队列中的命令可以随着必要的跟踪机制动态地重新调整或排序,其中跟踪机制用于掌握待执行和已完成作业的情况,而命令排队功能还可以使主机在设备对命令进行排队的时候,断开与硬盘间的连接已释放总线。一旦硬盘准备就绪,就重新连接到主机,尽可能以最快的速率传输数据,从而消除占用总线的现象。
  • 2、通信协议的支持也相当重要。以前的PATA硬盘在传输数据时很容易造成中断,这会降低主控器的效率,所以NCQ规范中定义了中断聚集机制。相当于一次执行完数个命令后,再对主控器回传执行完毕的信息,改善处理队列命令的效能。

目前NCQ对个人桌面应用并没有带来多大的性能提升,在某些情况下还会引起副作用。而且不同硬盘厂商的NCQ方案存在差异,带来的效果也不同。

  • 端口选择器(Port Selector):一种数据冗余保护方案,可增加冗余度,具有Port Selector功能的的SATA硬盘,外部有两个SATA接口,同时连接这两个接口道控制器上,一旦某个接口坏掉或连线故障,立即切换到另一个接口,不会影响数据传输。
  • 端口复用器(Port Multiplier):SATA 1.0的缺点就是可连接性不好,即连接多个硬盘的扩展性不好,因为一个SATA接口只能连接一个设备。SATA 2.0中引入了Port Multiplier的概念,是一种可在一个控制器上扩展多个SATA设备的技术,它采用4位(bit)宽度的Port Multiplier端口字段,其中控制器端口占用一个字节,最多支持15个设备连接,这与并行SCSI相当。上行端口只有一个,在带宽为150MB/s的时候容易成为瓶颈,如果上行端口执行300MS/s的带宽,就与Ultra320 SCSI的320MB/s十分接近了。该技术对需要多硬盘的客户很有用,不过目前能提供这种功能的芯片组极少。
  • 服务器特性:比如防止开机时多硬盘同时启动带来太大电流负荷的交错启动功能;强大的温度控制、风扇控制和环境管理;背板互联和热插拔功能等。这些功能更侧重于低端服务器方面的发展。
  • 接口和连线的强化:作为一个还在不断添加内容的标准集合,SATA 2.0最新的热点是eSATA,即外置设备的SATA接口标准,采用了屏蔽性能更好的2m长连接线,目标是最终取代USB和IEEE 1394。在内部接口方面,Click Connect加强了连接的可靠性,在接上时有提示声,拔下时需要先按下卡口。

3.5 SCSI硬盘接口

  • SCSI与ATA是目前现行的两大主机与外设通信的协议规范,而且它们各自都有自己的物理接口定义,分别是SCSI接口、IDE接口。凡是作为一个通信协议,就可以按照OSI模型划分层次,尽管有些层次可能是合并的或者是确实的。划分了层次之后,就可以把这个协议进行分解,提取每个层次的功能和各个层次之间的接口,从而可以把这个协议融合到其他协议之中,形成一种“杂交”协议来适应各种不同的环境。
  • SCSI:Small Computer System Interface,小型计算机系统接口,是一种较为特殊的接口总线,具备与多种类型的外设进行通信的能力,如硬盘、CD-ROM、磁带机和扫描仪等。SCSI采用ASPI(高级SCSI编程接口)的标准软件接口使驱动器和计算机内部安装的SCSI适配器进行通信。SCSI接口是一种广泛应用于小型机上的高速数据传输技术,具有应用范围广、多任务、带宽大、CPU占用率低以及热插拔等优点。
  • SCSI接口为存储产品提供了强大、灵活的连接方式,以及很高的性能,可以有8个或更多(最多16个)的SCSI设备连接在一个SCSI通道上,其缺点是价格过于昂贵。一般需要配合价格不菲的SCSI卡一起使用,而且SCSI接口的设备在安装、设置时比较麻烦,所以远远不如IDE设备使用广泛。虽然从2007年开始,IDE硬盘就被SATA硬盘彻底逐出了市场。
  • 在系统中应用SCSI必须要有专门的SCSI控制器。上面的CPU芯片对SCSI设备就行控制,能处理大部分的工作,减少了CPU占用率。在同时期的硬盘中,SCSI硬盘的转速、缓存容量、数据传输速率都高于IDE硬盘,因此更多应用于商业领域。
  • LVD传输模式:Low Voltage Differential,低电平微分。可以使用更低的电压,因此可以将差动驱动程序和接收程序集成到硬盘的板载SXSI控制器中,不再需要单独的高成本外部高电压差动组件。LVD硬盘带宽的增加对于服务器环境来说意味着更理想的性能,服务器环境都有快速响应、必须能够进行随机访问和大工作量的队列操作等要求。
  • 其他关键技术:双转换时钟控制、循环冗余码校验、域名确认,同步、异步、调步传输模式(320MB/s)。

1. SCSI协议的物理层

  • SCSI接口的各个规范,全部限于物理电气层,即描述传输速率、电气技术性能等。

2. SCSI协议的链路层

  • OSI模型中链路层的功能就是用来将数据帧成功地发送到这条线路的对端。SCSI协议中,利用CRC检验码来校验每个指令或者数据的帧,如果发现不一样,就丢弃这个帧,发送方便会重传这个帧。

3. SCSI协议的网络层

  • 1) SCSI总线编址机制
  • OSI模型中网络层的功能就是用来寻址的,SCSI协议利用SCSI ID来区分每个节点。在Ultra 320 SCSI协议中,一条SCSI总线上可以利用16个节点,其中SCSI控制器占用一个,SCSI ID被恒定设置为7。其他15个节点的SCSI ID可以随便设置但不能重复,7占有最高的优先级。
  • 总线是一种共享的线路,其上的每个节点都会同时感应到这条线路上的电位信号,同一时刻只能由一个节点向这条总线上放数据,也就是给这条线路加一个高电位或低电位。其他所有节点都能感知到这个电位的增降,但是只有接收方节点才会将感知到的电位增降信号保存到自己的缓存中,这些保存下来的信号就是数据。
  • 了解当前线路上是不是自己在通信,或想争夺线路的使用权而通告其他节点,这个过程叫做仲裁。有总线的地方就有仲裁,因为总线是共享的,各个节点都有申请使用,必须有一个仲裁机制。SCSI接口并不是只有8或16条数据总线,还有很多控制信号线。
  • SCSI卡一端接入主机的PCI总线,另一端用一个SCSI控制器接入SCSI总线。卡上有自己的CPU(频率很低,一般为RISC架构),通过执行ROM中的代码来控制整个SCSI卡的工作。经过这样的架构,SCSI卡将SCSI总线上的所有设备经过PCI总线传递给内存中运行着的SCSI卡的驱动程序,这样操作系统便会指导SCSI总线上的所有设备了。一块卡可能不止一个SCSI控制器。
  • 2) SCSI总线寻址机制和几个阶段
  • (1)空闲阶段
    总线一开始是处于一种空闲状态,没有节点要发起通信。总线空闲的时候,BSY和SEL这两条控制信号线都为False状态(用一个持续的电位表示),任何节点都可以发起通信。
  • (2)仲裁阶段
  • 节点都是通过在8或16条数据总线上提升自己对应那条线的电位来申请总线使用权的,同时也提升BSY线路的电位。SCSI设备上都有跳线来设置这个设备的ID号。如果同时有多个节点提升了各自线路上的电位,那么所有发起申请的节点均判断总线上的这些信号,如果自己是最高优先级的,即持续保留这个信号,否则立即撤销自身的信号,回到初始状态等待下轮仲裁。最高优先级的ID就在这轮仲裁中获胜,取得总线的使用权,同时将SEL信号线提升电位。
  • SCSI总线的寻址方式,按照控制器-通道-SCSI ID-LUN ID来寻址。(LUN,Logical Unit Number)
  • SCSI ID并不是SCSI总线网格中的最后一层地址,还有一个LUN ID,再划分就是逻辑层面了。每个SCSI ID下面可以再区分出来若干个LUN ID。控制器初始化时,对每个SCSI ID上的设备发出一条Report LUN指令,用来收集LUN信息。如果一个物理设备上没有再划分的逻辑单元,就必须向控制器报告一个LUN0,代表物理设备本身。
  • (3)选择阶段
  • 仲裁阶段之后,获胜的节点会将BSY和SEL信号线置位,然后将自身ID对应的线路和对应它要通信的目标ID的线路的电位提升,这样目的节点就能感知到它自己的线路上来了信号,开始做接收准备。
  • 总线上最常发生的是控制器向其他节点发送和接收数据,而除控制器之外的其他节点之间交互数据,一般是不会发生的。如果要从总线上的一块硬盘复制数据到另一块硬盘,也必须先将数据发送到控制器,控制器再复制到内存,经过CPU运算后再次发给控制器,然后控制器再发给另外一块硬盘。经过这么长的路径而不直接让这两块硬盘建立通信。是因为硬盘本身是不能感知文件这个感念的,硬盘只能理解SCSI语言,而SCSI语言是处理硬盘LBA块的,即告诉硬盘读/写某些LBA地址上的扇区/块,而不能告诉硬盘读写某个文件。文件这个层次的功能是由运行在主机上的文件系统代码实现的,所以硬盘必须将数据先传送到主机内存由文件系统处理,然后再发向另外的硬盘。
  • 这就是SCSI的网络层,每个节点都在有条不紊地和控制器交互着数据。

4. SCSI协议的传输层

  • OSI模型中的传输层的功能就是保障此端的数据成功地传送到彼端。与链路层不同的是,链路层只是保障线路两端数据的传送,而且一旦某个帧出错,链路层本身不会重新传送这个帧。所以,需要有一个端到端的机制来保障传输,这个机制运行在通信双方最终的两端,而不是某个链路的两端。
  • 发起方在获得总线仲裁之后,会发送一个SCSI Commond写命令帧,其中包含对应的LUN号以及LBA地址段。接收端接收后,就知道下一步对方要传输数据了,做好准备后,向发起方发送一个XFER_RDY帧,表示已经做好接收准备,可以随时发送数据。
  • 发送方收到XFER_RDY帧之后,会立即发送数据。每发送一帧数据,接收方就回送一个XFER_RDY帧,表示上一帧成功收到且无错误,可以立即发送下一帧,直到数据发送结束。
  • 发起方在获得总线仲裁之后,会发送一个SCSI Commond读命令帧。接收端接收后,立即将该命令中给出的LUN以及LBA地址段的所有扇区的数据读出,传送给发起端。
  • 所有数据传输结束后,目标端发送一个RESPONSE帧来表示这条SCSI命令执行完毕。
  • SCSI协议语言就是利用这种两端节点之间相互传送一些控制帧,来达到保障数据成功传输的目的。

5. SCSI协议的会话层、表示层和应用层

  • 会话层、表示层和应用层是OSI模型的最上面的三层,是与底层网络通信语言无关的,底层语言没有必要了解上层语言的含义。有没有会话层,完全取决于利用这个协议进行通信的应用程序。

3.6 磁盘控制器、驱动器控制电路和磁盘控制器驱动程序

3.6.1 磁盘控制器
  • 磁盘的接口包括物理接口,即硬盘接入到磁盘控制器上需要用的接口,具体的针数、某个针的作用等。除了物理接口规范之外,还定义了一套指令系统,叫做逻辑接口。指令集定义了“怎样向磁盘发送数据和从磁盘读取数据以及怎样控制其他行为,比如SCSI和ATA指令”。
  • 逻辑接口,也就是SCSI或者ATA的指令集部分,指令实体内容是需要由运行于操作系统内核的驱动程序来生成的,而物理接口的连接,就是磁盘控制器芯片需要负责的,比如ATA控制器或SCSI控制器。
  • 磁盘控制器的作用是参与底层的总线初始化、仲裁等过程以及指令传输过程、指令传输状态机、重传、ACK确认等,将这些太过底层的机制过滤掉,从而向驱动程序提供一种简洁的接口。驱动程序只要将要读写的设备号、起始地址等信息,也就是指令描述块(Command Description Block,CDB)传递给控制器即可,控制器接收指令并做相应动作,将执行后的结果信号返回给驱动程序。
3.6.2 驱动器控制电路
  • 应将磁盘控制器和驱动控制电路区分开来,二者是作用于不同物理位置的。磁盘驱动器控制电路位于磁盘驱动器上,专门负责直接驱动磁头臂做运动来读写数据。由磁盘控制器对磁盘驱动器发出指令,进而操作磁盘,CPU做的仅仅是操作控制器就可以了。CPU通过主板上的导线发送SCSI或ATA指令(CDB)给同样处于主板上的磁盘控制器,控制器通过线缆将指令发送给磁盘驱动器并维护底层指令交互状态机,由磁盘驱动器解析收到的指令从而根据指令的要求来控制磁头臂。
  • SCSI或者ATA指令CDB是由OS内核的磁盘控制器驱动程序生成并发送的。CPU通过执行磁盘控制器驱动程序,生成指令发送给磁盘控制器,控制器收到这些CDB后,会做一定程度的翻译映射工作,生成最底层的磁盘可接受的纯SCSI指令,然后通过底层的物理操作,比如总线仲裁,然后编码,再在线缆上将指令发给对应的磁盘。
3.6.3 磁盘控制器驱动程序
  • 那么机器刚通电,操作系统还没有启动起来并加载磁盘控制器驱动的时候,是怎么访问磁盘的呢?CPU必须执行磁盘通道控制器驱动程序才能与控制器交互,读写数据。所以,系统BIOS中存放了初始化系统所必需的基本代码。系统BIOS初始化过程中有这么一步,就是去发现并执行磁盘控制器的Optional ROM(保存在磁盘通道控制器中或单独的Flash芯片内),该ROM内包含了该控制器的最原始的、可在主BIOS下执行的驱动程序,主BIOS载入并执行该ROM,从而加载了其驱动程序,也就可以与控制器进行交互了。最后主BIOS通过执行驱动程序而使得CPU可以发送对应的读指令,提取磁盘的0磁道的第一个扇区中的代码载入内存执行,从而加载OS。
  • 系统BIOS(主BIOS)中是包含常用的磁盘控制器驱动程序的,但是对于一些不太常用的较高端的板载控制器或者PCIE卡形式的控制卡,主BIOS一般不包含其驱动,所以必须主动加载其Option ROM才能在主BIOS下驱动。在OS内核启动过程中,会用高性能的驱动程序来接管BIOS中驻留的驱动程序。当然,BIOS中也要包含键盘驱动,如果支持USD移动设备启动,还要有USB驱动。
  • 安装操作系统时,安装程序要求必须加载完整的磁盘控制器驱动程序之后才可以识别到控制器后面的磁盘从而才可以继续安装。此时虽然系统BIOS里的解百纳简化驱动已经可以向磁盘进行读写操作,但是其性能是很差的,基本都是Int13调用方式;而现代操作系统都抛弃了这种方式,所以安装操作系统过程中必须加载完整驱动才可以获得较高的性能。至于系统安装后的启动过程,一开始必须由BIOS来将磁盘的O磁道代码读出执行以便加载操作系统,使用的是简化驱动,启动过程中,OS的完整驱动会替代掉BIOS的简化驱动被加载。

3.7 内部传输速率和外部传输速率

3.7.1 内部传输速率
  • 磁盘的内部传输速率指的是磁头读写磁盘时的最高速率。这个速率不包括寻道以及等待扇区旋转到磁头下所耗费时间的影响。是一种理想情况,假设只在一个磁道上连续地循环读写这个磁道的所有扇区时的速率。
  • 通常,每秒10000转的SCSI硬盘的内部传输速率的数量级在1000MB/s左右。但是为何实际使用硬盘的时候,比如复制一个文件,其传输速率充其量只是每秒几十兆字节?原因就是磁头需要不断换道。磁头滑过盘片一圈,只需要很短的时间,而换道所需的时间远远比盘片旋转一圈耗费的时间多,所以造成磁盘整体外部传输速率显著下降。换道是无法避免的,总则几十上百兆、甚至上GB的文件,一个磁道是放不下的。
  • 实际中一块10000转的SCSI硬盘的实际外部传输速率也只有80MB/s左右(最新的15000转的SAS硬盘外部传输速率最大已经可以达到200MB/s)。为了避免磁头被不断打断的问题,发明了RAID技术,让一个硬盘的磁头在换道时,另一个磁盘的磁头在读写。如果很多磁盘联合起来,同一时刻总是有某块磁盘的磁头在读写状态而不是都在换道状态,这就相当于一个大虚拟磁盘的磁头总是处于读写状态,所以RAID可以显著提升传输速率。不仅如此,如果将RAID阵列再次进行联合,就能将速率在RAID提速的基础上,再次成倍地增加。这种工作,就需要大型磁盘阵列设备来做了。
3.7.2 外部传输速率
  • 磁头从盘片上将数据读出,然后存放到硬盘驱动器电路板上的缓存芯片内,再将数据从缓存内取出,通过外部接口传送给主板上的硬盘控制器。从外部接口传送到硬盘控制器时的传输速率,就是硬盘的外部传输速率。这个动作是由硬盘的接口电路来发起和控制的。
  • 接口电路和磁头控制电路是不同的部分,磁头电路部分是超精密高成本的部件,可以保证磁头读写时的高速率。但是因为磁头要被不断地打断,所以外部接口传输速率无需和磁头传输速率一样,只要满足最终的实际速率即可。外部接口的速率通常大于实际使用中磁头读写数据的速率(计入换道的损失)。

3.8 并行传输和串行传输

3.8.1 并行传输
  • 并行传输要求通信双方之间的距离足够短,距离过长,会受导线电阻不均衡以及其他各种原因的影响,最终到达对方的速度就会显现出差距,从而造成接收方必须等所有线路的数据都到达之后,才能发起下一轮传送。
  • 并行传输应用到长距离的连接上就无优点可言了。首先,在长距离上使用多条线路比使用一条单独线路昂贵;其次,长距离的传输要求较粗的导线,以便降低信号的衰减,这是要把它们捆到一条单独电缆里相当困难。IDE硬盘使用的40或者80芯电缆就是典型的并行传输。40芯中32芯是数据线,8芯是承载其他控制信号用的。所以,这种接口一次可以同时传输32b的数据,也就是4B。
3.8.2 串行传输
  • 串行传输在效率上,显然比并行传输低得多。但也有其优势,凭借这种优势使得硬盘的外部接口已经彻底被串行传输所占领。USB接口、IEEE 1394接口和COM接口,这些都是串行传输的计算机外部接口。
  • 并行传输表面上看起来比串行传输效率高很多倍,但是并行传输有不可逾越的技术困难,就是他的传输频率不可太高。由于在电路高速振荡的时候,数据线之间会产生很大的干扰,造成数据出错,所以必须增加屏蔽线。即使加了屏蔽线,也不能保证屏蔽掉更高的频率干扰。所以并行传输效率高但是速度慢。而串行传输则刚好相反,效率是最低的,每次只能传输一位,但是它的速度非常高,现在已经可以达到10GB/s的传输速率,但传输导线不能太多。
  • 这样算来,串行传输反而比并行传输的总体速率更快。串行传输不仅仅用于远距离通信,现在就连PCI接口都转向了串行传输方式。PCIE接口就是典型的串行传输,其单条线路传输速率最高2.5GB/s,还可以在每个接口上将多条线路并行,从而将速率翻倍,比如4X的PCIE最高可到16X,也就是说将16条2.5GB/s的线路并行连接到对方。这仿佛又回到了并行时代,但是也只有在短距离传输上,比如主板上的各个部件之间,才能承受如此高速的并行连接,远距离传输是达不到的。

3.9 磁盘的IOPS和传输带宽(吞吐量)

3.9.1 IOPS
  • 磁盘的IOPS,也就是每秒能进行多少次IO,每次IO根据写入数据的大小,这个值也不是固定的。IOPS随着上层应用的不同而有很大变化。
  • 如果在不频繁换道的情况下,每次IO都写入很大的一块连续数据,则此时每秒所做的IO次数是比较低的;
  • 如果磁头频繁换道,每次写入数据还比较大的话,此时IOPS应该是这块硬盘的最低数值了;
  • 如果在不频繁换道的条件下,每次写入最小的数据块,比如512B,那么此时的IOPS将是最高的;
  • 如果使IO的payload长度为0,不包含开销,这样形成的IOPS则为理论最大极限值。
  • 对于磁盘来说,每次IO就是指一次SCSI指令交互回合。一个回合中可能包含了若干个SCSI指令,而这一个回合里却只能完成一次IO,比如”读取从LBA10000开始后128个扇区“。
  • 例如,写入10 000个大小为1KB的文件到系统上,耗费的时间要比写入一个10MB大小的文件大得多,虽然数据总量否是10MB。因为写入10 000个文件时,根据文件分布情况和大小情况,可能需要做好几万甚至十几万次IO才能实现。而写入一个10MB的大文件,如果这个文件在磁盘上时连续存放的,那么只需要几十个IO就可以实现。
  • 对于写入10 000个小文件的情况,因为每秒需要的IO非常高,此时如果用具有较高IOPS的磁盘,将会提速不少。而写入一个10MB文件的情况,就算用了有较高IOPS的硬盘来做,也不会有提升,因为只需要很少的IO就可以完成了,只有换具有较大传输带宽的硬盘,才能体现出优势。
  • 同一块磁盘在读写小数据的时候速度是比较高的;而读写大数据的时候速度比较低,因为读写花费的时间变长了。15000转的硬盘比10000转的硬盘性能要高。
3.9.2 传输带宽
  • 传输带宽指的是硬盘或设备在传输数据的时候数据流的速度。如果写入10 000个1KB的文件需要10s,此时的传输带宽还能达到每秒10MB;而写入一个10MB的文件用了0.1s,此时的传输带看就是100MB/s。所以,即使同一块硬盘在写入不同大小的数据时,表现出来的带宽也是不同的。具有高带宽规格的硬盘在传输大块连续数据时具有优势,而具有高IOPS的硬盘在传输小块不连续的数据时具有优势
  • 同样,对于一些磁盘阵列来说,也有这两个规格。一些高端产品同时具备较高的IOPS和带宽,这样就可以保证在任何应用下都能表现出高性能。

3.10 固态存储介质和固态硬盘

固态存储在这几年开始大行其道,其在性能方面相对于机械硬盘来讲有着无与伦比的优势,比如,没有机械寻道时间,对任何地址的访问耗时开销都相等,所以随机IO性能很好。关于SSD的一些性能指标,本节不再列出。

3.10.1 SSD固态硬盘的硬件组成
  • SSD:Solid State Driver,是一种利用Flash芯片或者DRAM芯片作为数据永久存储的硬盘,不可以再说磁盘了,因为Flash Driver不再使用磁技术来存储数据。利用DRAM作为永久存储介质的SSD,又可称为RAM-Dsk,其内部使用SDRAM内存条来存储数据,所以在外部电源断开后,需要使用电池来维持DRAM中的数据。现在比较常见的SSD为基于Flash介质的SSD。所有类型的ROM(EPROM、EEPROM)和Flash芯片使用一种叫做”浮动门场效应晶体管“的晶体管来保存数据。每个这样的晶体管叫做一个Cell,即单元。Cell有多种,如SLC、MLC、TLC、QLC,根据每个Cell可以保存几bit的数据而定,复杂度越高越易出错。不管哪种类型,都需要额外保存ECC校验信息来做数据的错误恢复。
  • 由于计算机的数据只有0和1两种形式,只要让某种物质的存在状态只有两种,并且可以随时检测其状态,这种物质就可以存储1bit数据。磁盘使用一块磁粒子区域来保存0或1。芯片使用电荷,比如充满电表示0,放电后表示1(指电子而非正电荷)。浮动门场效应晶体管就是利用这种方法。
  • 如下图,浮动门场效应管有Controller Gate(CG)、Floating Gate(FG)、半导体二氧化硅绝缘层以及输入端源极和输出端汲极粗点等逻辑元件组成。浮动门是一块氮氧化物,其四周被二氧化硅绝缘层包围着,其外部为另一个门电路(即控制门)。在Word Line(字线)上抬高电势,会在S和D之间区域感生出一个电场,从而导通S和D、S和D之间有电流通过,这会使一部分电子穿过绝缘层到达浮动门内的氮氧化物,而在这个充电过程中,电子电荷被存储在了浮动门中。随后Word Line恢复电势,控制门断开电场,但是此时电子仍然在被绝缘层包裹的浮动门电路中,所以此时浮动门被充电,而且这些电荷可以在外部电源消失之后依然可以保存一段时间。不同规格的Flash其保存时间不同,通常为数个月。这为系统设计带来了复杂性,Flash控制器必须确保每个Cell在电荷逐渐泄漏到无法感知之前,恢复其原先的状态,也就是重新充电。而且要逐渐调整感知时间,由于对Cell的读操作是通过预充电然后放点对比基准电压,进而判断1或0的,如果其中的电荷所剩不多,那么感知基准电压的变化就需要更长的等待时间,控制器需要精确的做预判才可以保证性能。
  • 浮动门的名称也就是由此而来的,即这块氮氧化物是被二氧化硅绝缘层包裹住而浮动在空中的。Cell是利用FG中的电势值与阈值对比从而判断其表示1或0,可以让1个Cell有多个阈值。MLC模式的SSD,其每个Cell具有4个电势阈值,每次充电用特定电路掌握住火候,就可分别表示00、01、10、11了。
  • 如图3-33(物理图)和3-34(抽象图)为Cell阵列的有序排列图。可以看到每个Cell串是由多个Cell串联而成的,每次只能读写其中一个Cell,多个Cell串并联则可以并行读写多位数据。通常一个Page中的所有位中的每个位均位于一个Cell串相同的位置上,那么对于一个使用2122B(含ECC)/Page的芯片来讲,就需要16896个Cell串,需要16896条串联导线。将每个Cell串上所有Cell串联起来的导线称为”位线“,也就是串联每个Cell的S极和D极的那根导线,同时也是电源线;将多个并联的Cell串中相同位置的Cell的CG金属片水平贯穿起来(并联)的那根导线组称为”字线“,这样就组成了一个二维Cell矩阵。
  • 将多个这样的Cell排列在一起形成阵列,就可以同时操作多个比特。NAND就是利用大量这种Cell有序排列而成的一种Flash芯片。如图3-35所示为一片16GB容量的Flash芯片的逻辑方框图。每4314*8=34512个Cell逻辑上形成一个Page,每个Page中可以存放4KB的内容和218B的ECC校验数据,Page也是Flash芯片IO的最小单位。每128个Page组成一个Block,每2048个Block组成一个区域(Plane),一整片Flash芯片由两个区域组成,一个区域存储奇数序号的Block,另一个区域存储偶数序号的Block,两个Plane可以并行操作。Flash芯片的Page大小可以为2122B(含ECC)或者4313B(含ECC),一般单片容量较大的Flash其Page Size也大。相应地,Block Size也会根据单片容量的不同而不同,一般有32KB、64KB、128KB、512KB(不含ECC)等规格,视不同设计而定。
  • 如图3-36所示为某固态硬盘的拆机图,它使用了10片NAND Flash芯片,左上方为SSD控制器,左下方为RAM Buffer。最左侧为SATA物理接口。
  • 如图3-37所示为某SSD控制芯片的方框图。其中包含多个逻辑模块,外围接口和底层供电部分暂不关注。右半边,其中8051CPU通过将ROM中的Firmware载入IRAM中执行来实现SSD的数据IO和管理功能。Flash Controller负责向所有连接的NAND Flash芯片执行读写任务,每个NAND芯片用8b并行总线与Flash Controller上的每个通道连接,每时钟周期并行传递8b数据。Flash Controller与Flash芯片之间也是通过指令的方式来运行的,地址信息与数据信息都在这8位总线上传送,由于总线位宽太窄,所以一个简单的寻址操作就需要多个时钟周期才能传送完毕。芯片容量越大,地址就越长,寻址时间也就越长,所以,对于小块随机IO,Flash会随着容量的增加而变得越来越低效。新的Flash芯片已经有16b总线的设计了。总线频率一般为33MHz,最新也有40MHz的。
    - 对于数据写入,待写入的数据必须经过ECC校验之后,将数据和ECC校验信息一并写入芯片;对于数据读取,数据会与其对应的ECC信息一起读出并作校验,校验正确后才会通过外部接口发送出去。ECC运算器位于Flash Controller中。整个SSD会有一片很大容量的RAM(相对于机械磁盘),通常是64MB甚至128MB,原因在下文讲述。CPU执行的代码相对于机械磁盘来讲也是比较复杂的。
3.10.2 从Flash芯片读取数据的过程
  • MOS的导通并不是非通即断的,就算截止状态,也会有电流漏过,只是非常弱而已。还需明确一点,向绝缘层内充电是指充入电子/负电荷,栅极电压越负,nMOS就越导不通,漏电电流就越弱。如果不充电,反而漏电电流还高一些。
  • 在这种前提下,可以检测出这种微弱电流的差别,通过SAMP来实现。首先强制导通未选中的所有Cell的MOS,要读取的MOS栅极不加电压,然后给位线预充电(充正电荷,拉高电平),然后让位线自己漏电,如果对应的Cell里面是充了电的(充的是电子负电荷),那么MOS截止性会加强(等效于开启电压升高),漏电很慢(电压相对维持在高位),如果没充电,则漏电很快,所以最终SAMP比较出这两种差别来,翻译成数字信号就是,充了电=电压下降的慢=电压比放了电的位线高=逻辑1,当然这么想就错了。忽略了一点,就是SAMP不是去对比充了电的Cell位线和没充电的Cell位线,而使把每一根位线与一个参考电压对比,每一种Flash颗粒会根据大量测试之后,最终确定一个参考电压。SAMP普遍都是按照参考电压>对比电压则为逻辑1,小于则为逻辑0的,所以最终的输出便是,充电Cell反而表示0,放了电的Cell表示1。NAND=N(NOT,非)+AND(与),表示Cell的S和D是串接起来的,相当于串联的开关,它们之间当然是AND逻辑了。
  • 如图3-38,当需要读出某个Page时,Flash Controller控制Flash芯片将相应这个Page的字线,也就是串接(实际上属于并联)同一个Page中所有Cell上的CG的那根导线,电势置为0,即不加电压,其他所有Page的字线的电势则升高到一个值,即加电压,而这个值有不至于把FG里的电子吸出来,之所以抬高电势,是为了让其他Page所有的Cell的S和D处于导通状态,而没被加电压的Cell(CG上的电势为0V),也就是我们要读取的Cell,其S和D的通断,完全取决于其FG中是否有电子。
  • SSD的IO最小单位为1个Page。所以,对于NAND Flash,通过”强制导通所有未被选中的Cell“AND”检测位线的通断状态“=”被选中的Cell的通断状态“,NOT”被选中的Cell的通断状态“=”位线的0/1值“。把这整个Page的1或者0传输到芯片外部,放置于SSD的RAM Buffer中保存,这就完成了一个Page内容的度出。
3.10.3 向Flash芯片中写入数据的过程。
  • 对Flash芯片的写入有一些特殊的步骤。Flash芯片要求在修改一个Cell中的位的时候,在修改之前,必须先Erase这个Cell。Erase动作其实就是将一大片连续地Cell一下子全部放电,这一片连续地Cell就是一个Block。即每次Erase只能一下擦除一整个Block或者多个Block,将其中所有的Cell变为1状态。不能单独擦除某个/某段Page,单个/多个Cell。这一点是造成后面将要叙述的SSD的致命缺点的一个根本原因。Erase完成后,Cell中全为1,此时可以向其中写入数据,数据位恰好为1则不做任何操作,如果待写入某个Cell的数据位为0,则电路将对应Cell的字线电压提高到足以让电子穿过绝缘体的高度,这个电压被加到Control Gate、上,然后使得FG从电源线(也就是位线上)汲取电子,从而对Cell中的FG进行充电,充电之后,Cell的状态从1变为1,完成了写入,这个写0的动作又叫做Programm,即对这个Cell进行了Programm。
  • 如图3-39,要写入某个Cell,首先也必须先选中其所在的Page,将这个Page的字线加高电压,对应这个Cell的位线加0V电压,同一个串里的所有其他Page的字线也加一个高电压但是不如待写入Page的高,同时不需要写入操作的那些串对应的位线加一个对应字线相同的电压,结果就是,不需要写入数据的Cell的字线和位线电压抵消,电子不动;需要写入数据的Cell,也就是需要充电的Cell,由电势差将电子从位线中汲取出来充电。仔细看这个过程可以发现,根本无法在这个二维矩阵中做到同时给一个Page里(一横行)的不同Cell既充电又放电,这也是Flash挥之不去的痛。能否把一个Page的写入分成两个周期,分别写0、1,呢?每个Cell都有一定的绝缘体击穿次数,会减少其寿命。有个办法就是让所有Cell轮流被写入,不写到原地,每次覆盖写要新写入其他位置,平衡整体寿命。所以设计者选择了先预先准备好大片已经写满了全1的Cell,每次写入都写到这些预先备好的地方,只写0,如果是覆盖写,就需要把之前的Page地址做一个重定向,所以Flash控制器还需要保存一张地址重定向表。另外将一个Page分成两个周期来写,写性能也会骤降,所以设计者不得不采用一下子擦除大片的Block,也就说不用写IO一次就放电一次,而是类似”批发“,然后写入的时候只需要1个周期即可,所付出的代价就是后台需要不断地”批发“,一旦断链,那么性能便会骤降。
  • SSD会以Page为单位进行写入操作。Flash领域里,写又被称为Programm。由于Flash的最常见表现形式——EPRROM一般是只读的,但是一旦要更改其中的程序,则需要重新写入,即Re-Programm,所以就顺便将写入Flash的过程叫做Programm了。一块崭新的SSD上所有Cell都是已经被Erase好的,也可以使用特殊的程序对整个SSD重新整盘Erase。
  • 为何字线并联了所有Cell的CG,而不是让每个Cell的CG可以被单独控制呢?实际是为了成本和芯片面积考虑,技术上其实都可以实现,关键是钱的问题。
3.10.4 Flash芯片的通病

Flash芯片在写入数据的时候有诸多效率低下的地方。包括现在常用的U盘以及SSD中的Flash芯片,或者BIOS常用的EEPROM,它们都不可避免
1. Erase Before Overwrite

  • 对于机械磁盘来说,磁盘可以直接用磁头将对应的区域磁化成任何信号。而Flash则不然,如果要向某个Block写入数据,必须先Erase整个Block为全1,然后才能写入新数据。这种额外的Erase操作大大增加了覆盖写的开销。
  • 更难办的是,如果仅仅需要更改某个Block中的某个Page,需要Erase整个Block,再写入这个Page。在Erase之前,将全部Block中的数据读入SSD的RAM Buffer,然后Erase整个Block,再将待写入的新Page中的数据在RAM中覆盖到Block中对应的Page,然后将整个更新后的Block写入Flash芯片中。这种机制加大了写开销,形成了大规模的写惩罚,这也是为何SSD的缓存通常很大的原因。SSD的这种写惩罚被称为Write Amplification(写扩大)。写惩罚有不同的惩罚倍数,小块随机IO会产生大倍数的写惩罚。
  • 当SSD向Flash中的Free Space中写入数据时,并没有写惩罚,Free Space自从上次被整盘Erase后是没有发生任何写入动作的。存储介质如何知道哪里是Free Space?一块刚被全部Erase的SSD,其上所有Block对于文件系统或者SSD本身来讲,都可以认为是Free Space。随着数据不断地写入,SSD会将曾经被写入块的位置记录下来,记录到一份Bitmap中,每一比特表示Flash中的一个Block。对于文件系统而言,删除文件的过程并不是向这个文件对应的存储介质空间内覆盖写入全0或全1的过程,而只是对元数据的更改,所以只会更改元数据对应的存储介质区域,因此,删除文件的过程并没有为存储介质自身制造Free Space。所以说,对于SSD本身来讲,Free Space只会越来越少,最后导致没有Free Space,导致每个写动作都产生写惩罚,类似Copy On Write,而且Copy和Write很有可能都是一些在文件系统层已经被删除的数据,做了很多无用功,写性能急剧下降。对于一块使用非常久的SSD来讲,就算它在被挂载到文件系统之后,其上没有检测到任何文件,文件系统层剩余空间为100%,这种情况下,对于SSD本身来讲,Free Space的比例很可能确是0,也就是说只要曾经用到过多少,那么那个水位线就永远被标记在哪里。
  • 每个Block中的Page必须被按照一个方向写入,比如每个Block为128个Page,共512KB,则当这个Block被擦除之后,SSD控制器可以向其中写入前32个Page,一段时间后,可以再向这个Block中追加写入剩余的Page而不需要再次擦除这个Page。SSD控制器会记录每个Block中的大段连续空余空间。但是不能够跳跃的追加,Page都是连续排布的。一般来讲,控制器都是尽量一次写满整个Block的从而可以避免很多额外的开销。

2. Wear Off

  • 随着FG充放电次数的增多,二氧化硅绝缘层的绝缘能力将遭到损耗,最后逐渐失去绝缘性,无法保证FG中保有足够的电荷。此时,这个Cell就被宣判为损坏,即Wear Off。
  • 损坏的Cell将拖累所在的整个Page被标记为损坏,因为SSD寻址和IO的最小单位为Page。损坏的Page对应的逻辑地址将被重定向映射到其他完好的预留Page,SSD将这些重定向表保存在ROM中,每次加电均被载入RAM以供随时查询。
  • MLC由于器件复杂,其可擦写的寿命比较低,小于10 000次。而SLC则高一些,十倍于MLC,小于100 000次。这个值是很惊人的,对于某些场合下,有可能一天就可以废掉一大堆Cell/Page,几个月之内当预留的Page都被耗尽后,就会废掉整个SSD。这是绝对不能接受的。
  • 写惩罚大大加速Wear Off,因为写惩罚做了很多无用功,增加了不必要的擦写。对于读操作,理论上每个Cell可以承受高数量级的次数而不会损耗,所以对于读来说,无需担心。
3.10.5 NAND与NOR
  • 当需要读出某个Page时,Flash Controller控制Flash芯片将相应这个Page的字线【也就是串联(实际上属于并联)同一个Page中所有Cell上的CG的那根导线】电势置为0,也就是不加电压,其他所有Page的字线的电势则升高到一个值,也就是加一个电压,而这个值又不至于把FG里的电子吸出来,之所以抬高电势,是为了让其他Page所有Cell的S和D处于导通状态,而没被加电压的Cell(CG上的电势为0V),也就是要读取的那些Cell,其S和D的通断状态完全取决于其FG中是否有电子。说白了,未被选中的所有Cell,均强制导通,被选中的Cell的FG里有电,那么串联这一串Cell的位线就会被导通,这是一种AND的关系;被选中的Cell的FG里如果没有电,那么其所处的Cell串的位线就不能导通,这也是AND的关系。也就是一串Cell必须全导通,其位线才能导通,有一个不导通,整条位线就不通。这就是NAND Flash中的AND的意义。N表示Not,非,NAND就是”非与“的意思。为什么加个非?很简单,导通反而表示为0,因为只有FG中有电才导通。
  • 还有一类NOR Flash,NOR就是”非或“。在NOR Flash里,同样一串Cell,但是这串Cell均引出独立的位线,然后并联到一根总位线上;另外一点很重要的是,每个Cell的S和D之间虽然物理上时串联,但是电路上不再是串联,而使各自有接地端,也就是每个Cell的S和D之间的通断不再取决于其他Cell里的S和D的通断了,值取决于自己。以上两点共同组成了”或“关系,同时每个Cell具有完全的独立性,此时只要通过控制对应的底地线端,将未被选中的Cell地线全部断开,这样他们的S和D极之间永远无法导通(逻辑0状态),由于每个Cell的位线并联上联到总位线,总位线的信号值取决于选中的Cell的导通与否,对于被选中的Cell,NOT{(”地线接通“AND”FG是否有电“)OR”未被选中Cell的输出“}=”总位线的1/0值“,这就是NOR与非门的逻辑。
  • 由于NOR Flash多了很多导线,包括独立地线(通过地址译码器与Cell的地线相连)和多余的上联位线,导致面积增大。其优点是Cell独立寻址,可以直接用地址线寻址,读取效率比NAND高,所以可以直接当做RAM用,但是由于擦除单位较小,擦除效率比NAND低,所以不利于写频繁的场景。
3.10.6 SSD给自己开的五剂良药

1. 透支体力,拆东墙补西墙

  • 为了避免同一个Cell被高频率擦写,SSD有这样一个方法:每次针对某个或某段逻辑LBA地址的写都写到SSD中的Free Space中,即上一次全盘Erase后从未被写过的Block/Page中,这些Free Space已经被放电,直接写入即可,无须再做Copy On Write的操作了。如果再次遇到针对这个/这段LBA地址的写操作,SSD会再次将待写入的数据重定向写到Free Space中,而将之前这个逻辑地址占用的Page标记为”Garbage“,可以回收再利用。等到Block中一定比例(大部分)的Page都被标记为”Garbage“时,并且存在大批满足条件的Block,SSD会批量回收这些Block,即执行Copy On Write过程,将尚未被标记为”Garbage“的Page复制到RAM Buffer,将所有Page汇集到一起,然后写入一个新Erase的Block,再将所有待回收的Block进行Erase操作,编程Free Space。SSD这样做就是为了将写操作平衡到所有可能的Block中,降低单位时间内每个Block的擦写次数,从而延长Cell的寿命。
  • 重定向写的设计可谓是一箭双雕,既解决了Wear Off过快问题,又解决了大倍数写惩罚问题(因为每次写都尽量重定向到Free Space中,无需CoW)。SSD自认为的纯Free Space只会越来越少,那么重定向写的几率也就会越来越少,最后降至0,此时大倍数写惩罚无可避免。
  • 由于Page的逻辑地址对应的物理地址是不断被重定向的,所以SSD内部需要维护一个地址映射表。这种设计是比较复杂的,需要SSD上的CPU具有一定的能力运行对应的算法程序。这种避免Wear Off过快的重定向算法称为Wear Leveling,即损耗平衡算法。
  • Wear Leveling的实现方法随不同厂商而不同,有些以一块大区域为一个平衡范围,有些则完全顺序地写完整个SSD的Free Space,然后再回来顺序地写完整个被回收的Free Space,无限循环指导Free空间为0为止。传统机械硬盘中,逻辑上连续LBA地址同样也是大范围物理连续地,但是对于SSD,二者映射随着使用时间的增长而越来越乱,好在SSD不需要机械寻址,映射关系乱只会影响CPU计算结果的时间而不会影响数据IO的速度,而CPU运算所耗费的时间与数据IO的时间相比可以忽略不计,所以映射关系再怎么乱也不会对IO的性能有多少影响。
  • 利用这种方式,SSD内部实现了垃圾回收清理以及新陈代谢,使得新擦除的Block源源不断地被准备好从而供应写操作。
  • Flash控制器的这种机制又可以被称为RoW,Redirect On Write,每遇到需要更新的页面,Flash控制器便将其缓存到RAM中,当缓存的待写入页面达到了一个Block容量的时候,便会直接将这些页面写入到一个已经擦好的Block中。如果待写入的页面未攒够一个Block的容量,必要时也可以写入一个擦好的Block,此时这个Block处于未写满状态,随后可以继续写入页面直到写满为止,要做到这一点,Flash控制器就需要为每个Block记录断点信息了。
  • 垃圾回收程序最喜欢的就是一个Block里全是垃圾的状态,如果里面还有数据,就需要先把非垃圾内容读出到RAM中存放,随后和新数据一起一视同仁地写入到擦好的Block中,此时产生的不必要的读写操作,都属于惩罚操作。惩罚越多,性能就会越差。

2. 定期清除体内垃圾,轻装上阵

  • 从上面可以知道,影响一块SSD寿命和写入性能的最终决定因素就是Free Space,而且是存储介质自身所看到的Free Space而不是文件系统级别的Free Space。但是SSD自身所认为的Free Space永远只会少于文件系统的,并且只会越来越趋于0。所以,要保持SSD认识到自身更多的Free Space,就必须让文件系统来通知SSD,告诉它哪些逻辑地址现在并未被任何文件或者元数据所占用,可以被擦除。
  • 所有SSD厂商均会提供一个工具,称为”Wiper“,在操作系统中运行这个工具时,此工具扫描文件系统内不用的逻辑地址,并将这些地址通知给SSD,SSD便可以将对应的Block做擦除并回收到Free Space空间内。如果用户曾将向SSD中写满了文件随后又删除了这些文件,那么请务必运行Wiper来让SSD回收这些空间,否则就会遭遇到大写惩罚。
  • Wiper并不是实时通知SSD的,这个工具只是一次性清理垃圾,清理完后可以再次手动清理。所以,这个工具需要手动或者设置成计划任务等每隔一段时间执行一次。
  • 这种垃圾回收与上文中的那种内部垃圾回收不在一个层面上,上文中所讲的是SSD内部自身的重定向管理所产生的垃圾,而本节中所述的则是文件系统层面可感知的垃圾,被映射到SSD内部,也就成了垃圾。

3. 扶正固本,调节新陈代谢使其持续清除体内垃圾

  • 定期执行垃圾清理确实可以解燃眉之急,也有一种方法让文件系统在删除某个文件之后实时通知SSD回收对应的空间。例如TRIM,TRIM是ATA指令标准中的一个功能指令,在Linux Kernal 2.6.28中已经囊括,但是并不完善。Windows7以及Windows Server 2008R2中已经提供了完善的TRIM支持。一些较早出现的SSD也可以通过升级Firmware来获得TRIM的支持。
  • TRIM可以是SSD起死回生,经过实际测试,开启了TRIM支持的SSD,在操作系统TRIM的支持下,可以成功地将性能提高到相对于SSD初始化使用时候的95%以上,写惩罚倍数维持在1.1倍左右。

4. 精神修炼法,提升内功

  • Delay Write是一种存储系统常用的IO优化措施。比如有先后两个针对同一地址的IO——Write1、Write2,先后被控制器收到,而在Write1尚未被写入永久存储之前,恰好Write2进入,此时控制器就可以直接在内存中将Write2覆盖Write1,在写入硬盘的时候只需要写入一次即可。这种机制为”写命中“的一种情况,它减少了不必要的写盘过程,对于SSD来讲,这是很划算的。
  • 如果一旦遇到这种IO顺序比如Write1、Read2、Write3,如此时控制器先将Write3覆盖到Write1,然后再处理Read2,那么Read2原本是应该读出Write1的内容,经过Delay Write覆盖之后,却读出了Write3的内容,这就造成了数据不一致。
  • 所以,控制器在处理Delay Write时要非常小心,一定要检测两个针对同一地址的写IO之间是否插有针对同一个地址的读IO,如果有,首先处理读,然后再覆盖。
  • Combine Write是另一种存储系统控制器常用的写IO优化方法。对于基于机械硬盘的存储系统,如果控制器在一段时间内收到了多个写IO而这些写IO的地址在逻辑上是连续地,则可以将这些小的写IO合并为针对整体连续地址段的一个大的IO,一次性写入对应的磁盘,节约了很多SCSI指令周期,提高了效率。由于SSD中的逻辑地址本来就是被杂乱地映射到可能不连续的物理地址上的,但是并不影响多少性能,所以,SSD控制器可以整合任何地址的小块写IO成一个大的写IO而不必在乎小块写IO针对的逻辑地址是否连续。整合之后的大写IO被直接写向一个Free的Block中,这样做大大提高了写效率。

5. 救命稻草,有备无患

  • 为了防止文件系统将数据写满的极端情况,SSD干脆自己预留一部分备用空间用于重定向。这部分空间并不通告给操作系统,只有SSD自己知道,也就是说文件系统永远也写不满SSD的全部实际物理空间,这样,就有了一个永远不会被占用的一份定额的Free Space用于重定向写。
  • 因为SSD需要对数据进行合并以及其他优化处理以适应Flash的这些劣势,所以SSD自身对接收的写IO数据使用Write Back模式,即接收到主机控制器的数据后立即返回成功,然后异步的后台处理和刷盘。一旦遇到突然停电,这些数据将会丢失,正因如此,SSD需要一种掉电保护机制,一般是使用一个超级电容来维持掉电之后的脏数据刷盘。
  • 为何用普通碎片整理程序在文件系统层整理碎片对于SSD来说是雪上加霜?SSD逻辑上连续地地址不一定在物理上也连续,使用普通碎片整理程序,不但不能达到效果,反而还回因为做了大量无用功而大大减少SSD的寿命。
3.10.7 SSD如何处理Cell损坏
  • 对于机械磁盘,如果出现被划伤的磁道或者损坏的扇区,也就意味着对应的磁道或者扇区中的磁粉出现问题,不能够被成功地磁化,磁头会感知到这个结果;因为磁化成功必定对应着电流的扰动,如果针对某块磁粉区域磁化不成功,磁头控制电路迟迟没感知到电流扰动,或者扰动没有达到一定程度,那么就证明这片区域已经损坏。
  • 对于Flash中的Cell,当Cell中的绝缘体被击穿一定次数(SLC 10w次,MLC 1w次)之后,损坏的几率会变得很高,有时候不见得非要到这个门限值,可能出厂就有一定量损坏的Cell,使用一段时间之后也可能是不是出现损坏。SSD使用ECC纠错码进行判断,每次读出某个Page之后,都需要进行ECC校验来纠错。
  • 每种Flash生产厂商都会在其Datasheet中给出一个最低要求,即使用这种颗粒起码需要配合使用何种力度的纠错码,比如8b@512B或者24b@1KB等。8b@512B意味着如果在512字节范围内出现8b的错误,则是可以纠错恢复的,如果超过了8吧,就无法纠错了,此时只能向上层报”不可恢复错误“。厂商给出的纠错码力度越低,就证明这种Flash颗粒的品质越好,损坏率越低。
  • KB、B、b:
  • KB(Kilobyte,千字节)是计算机存储容量的单位,1KB=1024B,通常用于表示比较小的数据存储量,如一个文本文件等。
  • B(Byte,字节)是计算机中最小的存储单位,是一个8位二进制数,通常用于表示一个字符或一个字节的数据,如一个ASCII字符等。
  • b(bit,位)是计算机中的最基本的存储单位,表示一个二进制数字0或1,通常用于表示网络传输速度、数据传输带宽等。
3.10.8 SSD的前景
  • 以上一切缓解SSD效率问题的办法,都是治标不治本。随着Cell的不断损坏,最后的救命稻草——SSD私自保留的空间也将被耗尽,加之文件系统空间已满的话,那么SSD的效率就会大大降低。但是所讨论的SSD写效率降低,不是与机械硬盘相比的。瘦死的骆驼比马大,SSD比起机械硬盘来讲其优势还是不在一个数量级上的。
  • 可以将多块SSD组成Raid阵列来达到更高的性能。但可惜的是,Raid卡目前尚未支持TRIM。
  • 为了适应Flash的存储方式,有多种Flash Aware FS被开发出来,这些Flash FS包括TrueFFS、ExtreneFFS等。这些能够感知Flash存储方式的FS,可以将大部分SSD内部所执行的逻辑拿到FS层来实现,这样就可以直接在上层解决很多问题。
  • SSD看似风光无限,但是其技术壁垒比较大,为了解决所产生的多个问题,设计了多种补救措施,需要靠TRIM维持,而且数据不能占空间太满,否则无药可救。基于目前NAND Flash的SSD很有可能是昙花一现,目前市场上已经出现SRAM、RROM等更快的永久存储介质,随着科技的发展,更多更优良的存储介质和存储方式必将替代机械硬盘的磁碟,SSD数据存储次世代即将到来。
  • 针对传统SSD使用时候的尴尬情况,Seagate等厂商也相继推出了SSD+HDD混合式存储硬盘。这种硬盘其实就是将Flash芯片用于磁盘的二级缓存,一级缓存是RAM,二级是Flash,三级则是磁盘片。利用这种多级缓存更大程度地降低了磁头寻道的影响。传统磁盘自身已经有了多达64MB的RAM缓存,还需要Flash再作为下一级的缓存么?需要的,64MB的容量还是太小,虽然速度高,但是很快就被充满,同时没有掉电保护机制,所以盘阵控制器不会让磁盘以WriteBack模式操作,充满了则一定要连续刷到盘片中,这样就不可避免地直接导致可见的性能骤降;而使用Flash芯片再加入一级缓存,比如用8GB甚至16GB的Flash芯片,数据从RAM缓存出来后先被存入Flash,不用寻道,同时可以掉电保护,Write Back之后,磁盘驱动器再在后台将数据从Flash中写入磁盘片保存并清空Flash中的内容。这样的做法,既比传统纯SSD便宜,还保证了性能,有效屏蔽了磁头寻道带来的高延迟。短期内尚无法取代传统纯SSD,因为其读取操作依然需要从磁盘片中读取几乎所有数据而不是从Flash中,无法与纯SSD抗衡,但是其取代传统磁盘的趋势是存在的,今后的磁盘如果都这么做,会大大增加单个磁盘的随机写性能,对磁盘阵列控制器的更新与设计也是一个挑战。

3.11 Memblaze闪存产品介绍

  • 机械磁盘由于其高复杂度的机械部件、芯片及部件,让人望而却步,其技术只被掌握在少数几家巨头手中。因为初期成本非常高,如果没有销量,那就是赔本。而近年出现越来越多的国产企业级固态存储产品,SSD相对于机械磁盘的门槛低很多。组成SSD的主要是Flash颗粒和控制器,都可以从各种渠道购买,只要有足够的集成力,能快速看懂这些部件提供商的手册,最整个存储系统有基本了解,那么只要具有一定水平和经验的硬件研发者,都可以进入这个领域。
  • 目前各种固态介质充斥市场,从TF卡、U盘到消费级SATA SSD,再到企业级SATA SSD,再到企业级PCIE闪存卡,每个档次要求很不一样。要做成企业级SSD,不但需要有技术能力,还得有充分的产品定制化能力。Memblaze就有这两种能力。
3.11.1 技术能力
  • 评判一个存储团队的技术能力,第一看他们是贴牌还是有自己的特色,第二看其产品设计采用应加速还是软加速。软加速,就是把原本由硬件芯片实现的功能,上提到由主机CPU运行代码来实现,也就是常说的”软件定义“概念里的一个意思。软件定义是好事,但是不能过分解读,否则会适得其反。比如一些硬加速DSP、底层特定协议编解码器,这些如果是用普通CPU来实现也可以,只要你能忍受性能的极度下降以及近100%的CPU负荷。
  • 处理Flash这堆烂摊子(不能对一个Page里的不同Cell同时充放电、Cell的低寿命高出错率)的角色,其学术名词叫做FTL(Flash Translation Layer),其意思一个是把Flash基于页面为最小IO单元映射成传统的块设备以512B扇区为最小IO单位,另一个是把逻辑IO地址映射为物理IO地址,因为每个Page的实际物理地址都会不断变化。当然,这只是地址方面的映射处理,FTL需要同时掌握映射处理和对Flash的磨损均衡、垃圾回收、纠错等等处理。
  • 我们继续分析这套架构都需要哪些数据结构。首先需要多张超大二维表来存储逻辑地址、物理地址的映射记录,后端挂载的Flash颗粒容量越大,这些表(数组)就越大;其次是为了加速查询所做的索引、位图之类的元数据结构;还有就是存储IO栈里常用的一种数据结构——链表,或者称其为”描述体“,用来跟踪分散在多个物理内存处但是逻辑上是一个整体的事物,比如逻辑联系空间,或者某个IO任务等;另外,状态机也非常复杂。
  • 我们分析一下,上面这套数据结构和状态机,如果完全将其运行在主机OS底层的设备驱动层,或者干脆运行在用户态(一般都会在用户态运行,因为驱动层不适合做复杂的逻辑处理),效率究竟有多高。这一点想象就可以大致判断,比如TCPIP协议栈就是个纯软协议栈,其不需要维护太多元数据,多数计算量位于状态机的判断和输出上,即便是这样,一个万兆网口之上承载iSCSI协议的场景,在IOPS跑盘之后,CPU利用率基本都超过50%了,何况是需要查询表映射的场景。另外,软加速方案需要设备传输更多的信息给驱动程序,这直接导致中断次数激增。还有,软加速方案需要在主机端保存大量的元数据,对内存的占用是不可小视的,通常1GB起步,量多加价,而硬加速方案只有主机端驱动运行耗费一部分内存,通常1MB起步。
  • 如果是使用硬加速方案,所有的元数据、状态机,都在Flash控制器内部维护和计算,就能大大降低主机端CPU的负荷,主机端CPU的负责只体现在响应外部设备的中断上了。硬加速的好处就是可以将一些专用逻辑直接做成硬逻辑电路,在一个或则几个时钟周期内就可以完成通用CPU需要耗费几百个或者几千个时钟周期才能完成的任务。例如,对ECC码的计算,就可以单独拿出来作为硬加速电路。有些逻辑不能完全被翻译成纯数字电路,比如地址映射查表等,一小部分逻辑必须依靠通用CPU来运行对应的固件来协调完成全部逻辑,当然那些重复运算还是交给数字电路,微码只是负责协调和总控,这一点如果是一些比较负责的逻辑的话,靠纯数字电路是无法完成的。这里的”通用CPU“并非指主机端CPU,而是指控制器内部的嵌入式CPU核心,一个控制其芯片内部集成的通用CPU核心数量可能在几个到几十个这种级别。
  • 我们可以看到,如果用硬加速方案,对设计者的要求,不仅仅是了解Flash FTL层的全部逻辑,还得有充分的技术实力把这些逻辑梳理成数据结构,然后判断哪些逻辑可以被硬加速,然后还得具备将软件翻译成硬件逻辑的技能,除此之外,还得具有熟练驾驭FPGA的技能。
  • 另外,一款固态存储产品,选择使用什么样的IO协议也是至关重要的。基于ATA协议的SATA接口,是无法发挥出Flash协议最优性能的,直接使用PCIE接口接入主机总线是目前离CPU最近的途径,但是这样就无法使用SATA协议的一切已有软硬件了,包括成熟的SATA控制器硬件,以及主机端OS系统内核对SATA的原生驱动支持。选择PCIE就意味着必须自己开发一套轻量级IO访问协议。
  • Memblaze很显然是充分掌握了这条线上的所有技能。如下图,其使用了成品FPGA,其中IP硬核部分为PCIE控制器及DDR3控制器;IP软核部分为DMA控制器、嵌入式通用CPU等等,可以任意生成,其他都是需要用户自定义设计的部分。其中纯硬逻辑包括Flash通道控制器、ECC计算电路等;需要嵌入式通用CPU辅助的有,地址映射器、磨损均衡和垃圾回收模块以及整个控制器的中央协调控制逻辑处理部分等。
  • 除了对硬件的掌控能力之外,Memblaze还拥有IO延时平滑的专利技术,可以针对个别超长延时的IO请求进行削峰滤波处理,当运行在较高IOPS情况下,控制器会自动调整垃圾回收算法和内部等待队列深度,并将IO延时进行平滑处理,从而避免产生超长延时的IO,减少对后端系统的影响,使得用户的应用运行得更加平稳顺滑。这项技术主要是采用排队论和现代控制理论对SSD的一些指标进行采样,根据采样结果去控制系统通络上的参数,用来优化IO的抖动和延迟。
  • 最后,对于固态存储厂商来讲,能够驾驭各Flash颗粒厂商的NAND Flash也显得至关重要。不同颗粒使用不同的规格,比如ECC位比例、页面大小、访问协议等等。这些都需要花上足够的时间去测试、调优。
  • 另外,NAND Flash的写放大是导致性能和寿命下降的主要原因,是否能够充分降低些放大效应,也是体现技术实力的地方。如下图,Memblaze对写放大的压制还是很不错的。
3.11.2 产品能力
  • 技术是技术,产品是产品,没有好技术一定出不了好产品。Memblaze对产品这个概念还是非常有感觉的,深知”个性“对于一款产品来说是多么重要。在我们的脑海里,PCIE闪存卡就是一锤子买卖,比如,卡上焊了多少容量的Flash颗粒,就是多大容量。这个问题谁都清楚,但是Memblaze是第一个提出方案并且成功商用的公司。
  • ”琴键“技术是他们对这个技术的命名,通过将Flash控制器与Flash颗粒之间的连接方式从完全PCB布线转为插槽的形式,然后通过生产不同容量的子卡(琴键)插在插槽上从而生成不同整体容量的闪存卡产品。