介绍存储技术当然要从存储技术最基本的组件磁盘开始介绍了。目前市面上我们见得最多的是3.5寸或者2.5寸的机械硬盘。虽然由于SSD硬盘的猛攻,机械磁盘的市场份额屡屡受挫,但老大地位并没有被动摇。
下面这个图是3.5寸机械硬盘的真容,想必大家都见过,其中左侧是外观,右侧是内部的结构。这个也是目前应用最多的硬盘类型。无论是在消费级市场,还是企业级市场都是这样。差异可能是消费级使用的大多是SATA接口的硬盘,而在企业级使用大多是SAS接口的硬盘。
通过上图可以看到,硬盘的内部的结构确实比较复杂的。在机械硬盘的内部,两个核心的组件是盘片和磁臂。其中盘片用来存储数据,磁臂则是用来读写数据的。如果您仔细观察还会发现,磁盘的盘片不止一个,而是由多个盘片叠加起来的。关于机械硬盘的更多细节在本文的后半部分会详细论述,接下来我们先了解一下硬盘的历史。
聊聊机械硬盘的历史
世界上第一块机械硬盘是由IBM发明的,发明时间是1956年。下面这张图是关于第一块机械硬盘的酷照,左侧是该硬盘的局部照,主要是盘片部分,右侧是通过专机运输的合影。可以看出,当时的硬盘确实是个大家伙,严格来说,这个磁盘不应该叫磁盘,而应该称为基于磁性介质存储系统。
从图中可以看出,这个设备比冰箱还要大(盘片大小是24寸),但是其存储容量仅仅只有5MB。没错,你没看错,仅仅只有5MB。对于那个年代的程序员,估计很难想象到未来的硬盘容量可以是当前硬盘容量的百万倍(16TB)。
直到20多年以后,也就是1980年,希捷才制造了世界上第一块与当前硬盘类似的硬磁盘。这个磁盘的尺寸为5.25寸,容量才200多KB!
纵观磁盘的发展史,从最早的24寸磁盘到现在最小的只有0.85寸的磁盘。虽然磁盘的尺寸不断变小,但容量却在急速变大。最近希捷推出了16TB的磁盘,而该磁盘的容量已经是其鼻祖容量的335万倍之多!
磁盘的内部结构
了解了硬盘的发展简史,接下来我们从硬盘的内部深入介绍一下硬盘。同时,结合磁盘的结构特点,我们将深入介绍一下磁盘的访问性能问题。
前面在实物图中我们已经看到磁盘是由很多个盘片组成的,数据正是存储在这些盘片上的。盘片在逻辑上被划分为一圈一圈的,数据是存储在这些圈圈上的。如下图所示盘片上的红色圈圈被称为磁道(track),从圆心向外画两条直线,可以形成一个扇面,称为扇区(Sector)。同时在每个磁道上会形成一个弧段,称为磁道扇区(图中蓝色部分)。磁道扇区是磁盘的最小组成单元,通常是512字节。
为了能够从盘片上读取数据,硬盘中有一个磁臂,磁臂上有磁头可以从盘片读取(写入)数据。从图中可以看出,磁头也是有多个的,每个盘面都有一个磁头。对于机械硬盘而言,如果要读写数据必须要先定位数据,其过程包括将磁臂摆动到对应的磁道和选择盘片到对应的扇区两个主要的步骤。
在机械硬盘中有个逻辑概念,也就是柱面。每个盘面上的相同位置的磁道在垂直方向上构成了一个圆柱体的外面,这个外面称为柱面。由此可以推断出,盘面有多少磁道,机械硬盘就有多少个柱面。磁臂来回摆动寻找磁道的过程其实就是寻找柱面的过程,这是因为磁臂上的多个磁头的摆动是一致的。所以多个盘片在容量上可以得到明显的提示,但对性能提升并不明显。
早期硬盘正是通过磁头、柱面和扇区的来寻址的,这种寻址方式称为CHS(Cylinder–Head– Sector)寻址。由于磁头、柱面和扇区都有编号,因此就可以在立体空间中对硬盘进行寻址。比如磁头0、柱面0和扇区3,这个位置是唯一确定的。
CHS虽然是非常直观的,但是它有一些缺点,所以已经基本被废弃了。这些缺点包括每个磁道的扇区数是相同的,磁头(255)、柱面(1024)和扇区(63)的数量都比较小。最终的结果就是硬的容量受到上述因素的限制,最大为7.844 GB(1024 x 255 x 63 x 512 = 8,422,686,720)。
上述最大容量的计算有一个公式,具体如下所示:
存储容量 = 磁头数 × 磁道(柱面)数 × 每道扇区数 × 每扇区字节数
假设一个硬盘包含 3个圆盘(盘片),6个磁头,7个柱面(每个盘片7个磁道) 的磁盘,每条磁道有12个扇区,因此,我们可以根据这些参数计算出磁盘的容量为6712*512字节,也即258048字节。
那么如何查询磁盘的参数信息呢?以Linux操作系统为例,可以通过fdisk -l命令查看磁盘的详细信息。如图所示,显示的磁盘的详细信息。
几何常识,外圈磁道比内圈磁道大,最外圈磁道显然要比最里面磁道的周长大很多。所以采用每个磁道具有相同的扇区的编址方式并不划算。现代硬盘采用等长扇区的方式,也就是磁道中扇区的数量与磁道周长相关,磁道周长越长,扇区数量越多。这种方式可以最大化的使用磁盘的物理空间,提高存储容量。
目前硬盘已经淘汰了CHS编址的方式,而是采用LBA(Logical block addressing)的编址方式。这种编址方式非常简单,是一种线性的编址方式,其中第一个扇区是LBA0, 第二个扇区是LBA1,以此类推。相对比CHS需要三个参数来进行硬盘空间的寻址,LBA只需要要给参数,所以对于普通用户来说简单了很多。
虽然从使用的角度来说寻址确实简单了很多,但是硬盘内部的物理结构并没有本质的变化,依然是多个盘片 ,每个盘片是多个磁道,每个磁道是多个扇区。因此硬盘控制器的一项非常重要的工作就是实现LBA地址到CHS地址的转换,也就是当我们想访问某个偏移LBAx的数据时,硬盘控制器需要转换具体的扇区。LBA到CHS的转换也称为映射,具体涉及多种方式,比如优先以盘面进行寻址,或者优先以柱面进行寻址等,具体细节本文不在赘述。
前面我们从硬盘的内部详细介绍了硬盘的相关内容,如果要访问硬盘内部的数据,必需要建立与硬盘的物理连接。换句话说,应该必需提供一个接口,以便于实现主板与硬盘的连接。目前硬盘常用的接口有两种,分别是SATA接口和SAS接口,这两种接口都是串行协议。两种接口的物理规格如图所示。至于SATA和SAS是两种不同的传输数据的协议,作者在其他文章有专门介绍,本文就不再赘述。
前面我们介绍了磁盘的内部结构和外部接口,接下来我们分析一下磁盘传输数据相关的内容,重点是关于其耗时的介绍,也就是其访问特性。
磁盘传输数据的大概流程是这样的。当上层下发读写请求时,磁盘的驱动器将请求转换为具体的磁道编号和扇区编号。然后定位到具体的位置进行数据的读写。这个定位过程可以分解为2步,也就是摆动磁臂到具体磁道的过程(寻道)和等待盘片旋转到指定扇区的过程。这两个过程也涉及两个不同的时间,也即寻道时间(Seek time)和旋转延迟(Rotational delay)。下面我们具体解释一下这两个时间。
寻道时间:寻道时间是指将读写磁头移动至正确的磁道上所需要的时间。寻道时间越短,I/O操作越快,目前磁盘的平均寻道时间一般在3-15ms。 如下图是某品牌磁盘寻道时间及寻道平均延时。
旋转延迟:旋转延迟是指盘片旋转将请求数据所在的扇区移动到读写磁盘下方所需要的时间。旋转延迟取决于磁盘转速,通常使用平均延迟,也就是用磁盘旋转一周所需时间的1/2表示。比如:7200rpm的磁盘平均旋转延迟大约为60*1000/7200/2 = 4.17ms,而转速为15000rpm的磁盘其平均旋转延迟为2ms。
定位成功后就可以进行数据读写了,数据读写的过程会扫描指定数量的扇区。比如读取1KB的数据,需要扫描2个扇区,这个也是需要消耗时间的。另外就是数据需要通过磁盘控制器经总线传输给CPU,这部分操作也是需要消耗时间的。我们将这部分时间总称为数据传输时间。数据传输时间通常远小于前两部分消耗时间,简单计算时可忽略。
通过对比上面的各种时间数据,我们可以看出寻道时间占比最大。这也正是机械磁盘在处理随机IO时性能非常差的根本原因。这里涉及一个随机IO的概念,与此对应的是顺序IO。所谓随机IO是指一些列的IO当中,前后IO的LBA值不连续,存在很大的随意性;而顺序IO则是指一些列IO的LBA值是连续的。
由于随机IO的LBA值不连续,当控制器转换为CHS时比如在扇区或者柱面方面存在跳跃的情况,这就需要寻道时间或者旋转等待时间,或者两者兼而有之。这样比如导致IO的时间延长。而对于顺序IO,在IO之间则不存在寻道时间和旋转延迟。如下表是另外两个品牌硬盘的具体的参数,大家可以了解一下上述参数的具体数值及大概关系。
说到硬盘数据传输,不得不提2个关键的指标,一个是IOPS,另外一个是吞吐量(上表中的Max Transfer)。下面我们简单介绍一下这两个指标。
IOPS(Input/Output Per Second)即每秒的输入输出量(或读写次数),即指每秒内系统能处理的I/O请求数量。IOPS是衡量随机小IO的关键衡量指标。可以通过如下公式推算出磁盘的IOPS:
IOPS = 1000ms/ (寻道时间 + 旋转延时 + 数据传输时间)
如果忽略数据传输时间,理论上可以计算出随机读写最大的IOPS。以15000转磁盘为例,其寻道时间大概是4ms,而旋转延时大概是2ms,因此可以计算出大概在167左右。
吞吐量(Throughput),指单位时间内可以成功传输的数据数量(字节数)。吞吐量是衡量连续IO的关键指标。由于是连续IO,因此寻道时间可以省略。这样吞吐量主要与旋转时间关系比较大,比较读取一个磁道上所有数据的耗时也要2ms。另外一个关键因素是磁盘的接口,不同的接口也有吞吐极限。比如SATA接口大概在100MB/s左右,而SAS磁盘则在200MB/s左右。
至此,我们对机械硬盘做了一个相对全面的介绍,并且对其读写特性进行了简要介绍。实际上机械硬盘的知识还很多,比如控制器相关的、接口的协议等等。控制器相关的内容对于做存储系统的同学来说并非必需,所以这里不再赘述。而协议相关的内容与存储系统协议是相通的,所以我们将在其他章节进行详述。