磁盘大致由盘片、读写头、马达、底座、电路板等几大项组合而成。
磁头运行时距离磁盘表面的高度由下图可以随意感受一下:
1 磁盘上的数据组织
磁盘在逻辑上被划分为磁道、柱面以及扇区。
启停区:每个盘片的每个面都有一个读写磁头,磁头期初停在盘片的最内圈,即线速度最小的地方。这是一个特殊区域,它不存放任何数据。
0磁道:在最外圈,离主轴最远的地方是0磁道,硬盘数据的存放就是从最外圈开始的。有一个0磁道检测器,由它来完成硬盘的初始定位。
0磁道存放着用于操作系统启动所必需的程序代码,因为PC启动后BIOS程序在加载任何操作系统或其他程序,总是默认从磁盘的0磁道读取程序代码来运行。
扇区
扇区的结构如下图所示
扇区:将每个环形磁道等距离切割,形成等长度的圆弧,每个圆弧就是一个扇区。
每个扇区可以存放512B的数据和一些其他信息。
一个扇区有两个主要部分:存储数据地点的标识符和存储数据的数据段。
扇区头标:扇区头标包括组成扇区三级地址的三个数字
- 扇区所在的柱面(磁道)
- 磁头编号
- 扇区在磁道上的位置,即扇区号
柱面、磁头和扇区三者简称CHS,所以扇区的地址又称为CHS地址。
现在CHS编址方式已经不再使用,而转为LBA编址方式。
LBA地址:LBA编址方式不再划分柱面和磁头号,这些数据由磁盘自身保留,而磁盘对外提供的地址全部为线性的地址,即LBA地址。
所谓线性,指的是把磁盘想象成只有一个磁道,这个磁道是无限长的直线,扇区为这条直线上的等长线段,从1开始顺序编号,直到无限远。这种方式屏蔽了柱面、磁头这些复杂的东西。
某个LBA地址到底对应着哪个磁道上的哪个扇区,这种对应关系保存在磁盘控制电路的ROM芯片中,磁盘初始化的时候载入缓存汇总以便随时查询。
磁盘的IO单位
单位:磁盘读写都是以扇区为最小寻址单位的。也就是说不可能往某某扇区的前半部分写入某某数据。
一次IO:对于磁盘来说,一次磁头的连续读或者写叫做一次IO。
性能瓶颈:磁盘的读写是通过盘片的转动实现的,相对于盘片的转动而言,步进(换道速度)的速度就慢多了,所以制约磁盘性能的主要因素就是这个步进速度,也就是寻道速度。
目前磁盘的平均寻道速度最高可以达到5ms多,不同磁盘的寻道速度不同,普通IDE磁盘可能会超过10ms。
SCSI接口协议:专门用于计算机和其外设交互数据的一套接口系统。
2 磁盘相关技术
2.1 无序传输技术
目的:提高磁盘性能
无序传输:控制器发出一条指令要求读取某些扇区中的内容,磁盘可以不从数据所在的初始扇区开始读,而是采取就近原则。比如,磁盘恰好处于待读取数据的尾部几个扇区,磁盘按照能读多少就读多少的原则,在尾部时就先读取尾部的数据,然后立即发给控制器,控制器立即通过DMA数据放到内存,等磁盘旋转到数据块头部扇区时再读取剩余的部分。这样做避免了“旋转延迟”。
通过指令排队和无序传输可以最大化利用磁盘资源。
2.2 磁头扫描方式
- FCFS:First Come First Serve,磁头完全按照IO进入的先后顺序执行寻道操作。
- SSTF:Shortest Seek Time First,控制器会优先让磁头跳到离当前磁头位置最近的一个IO磁道去读写。
- SCAN:回旋扫描模式,类似于电梯模型,从一端到另一端,然后折返,如果当前队列中有某个磁道的IO在等待,就停下处理,否则不再该磁道停留。优点是不会饿死任何IO。
- C-SCAN:单向扫描模式,磁头总是从内圈向外圈扫描,达到外圈之后迅速返回内圈,返回途中不接受任何IO。
- LOOK:智能监察扫描模式,相对于SCAN模式的区别在于,磁头不必达到内外圈终点后才折返,而只要完成最两端的IO即可折返。
- C-LOOK:智能监察单向扫描模式。
扫描模式的选择:
1 负载不高的情况下,SSTF模式可以获得最佳的性能
2 高负载条件下,SCAN或者C-SCAN,C-LOOK模式更为合适,可以防止造成某些较远的IO饿死的问题。
2.3 磁盘缓存
缓存的作用:用于接收指令和数据,还被用来进行预读。
磁盘缓存时刻处于打开状态。
“禁用”缓存:并非真的关闭缓存,而是磁盘收到写入指令和数据后,必须先将其写入盘片,然后才向控制器返回成功信号,这样就相当于禁用了缓存,但是实际上,指令和数据首先到达的一定是缓存。
强制盘片访问:FUA指令,Force Unit Access,对于写操作,磁盘必须将受到的数据写入盘片才返回成功信号,也就是进行write through。对于读操作,磁盘受到指令后,直接去盘片上读数据,不搜索缓存。
2.4 影响磁盘性能的因素
影响磁盘性能的因素包括以下几种:
- 转速:影响磁盘连续IO时吞吐性能的首要因素。
- 寻到速度:影响磁盘随机IO性能的首要因素。
- 单碟容量:间接因素。
- 接口速度:最不重要的因素。目前的接口速度在理论上都已经满足了磁盘所能达到的最高外部传输带宽。
3 SCSI磁盘接口
凡是作为一个通信协议,就可以按照OSI模型来将其划分层次。
划分了层次之后,我们可以把这个协议进行分解,提取每个层次的功能和各个层次之间的接口,从而可以将这个协议融合到其他协议之中,来适应各种不同的环境。
SCSI的全称是Small Computer System Interface,即小型计算机系统接口,具备多种类型的外设通信能力。
需要:一块相当于CPU的SCSI的控制器,对SCSI设备进行控制,减少了对CPU的负担。
4 磁盘控制器、磁盘驱动器和他们的驱动程序(控制电路)
磁盘控制器
- 参与底层的总线初始化,仲裁等过程,以及指令传输过程、指令传输状态机、重传、ACK确认等,将这些泰国底层的机制过滤掉,从而向驱动程序提供一种简洁的几口。
- 驱动程序只要将要读写的设备号、起始地址等信息,也就是指令描述块传递给控制器即可,控制器接收指令并做相应动作,将执行后的结果信号返回给驱动程序。
磁盘驱动器控制电路
磁盘驱动器控制电路位于磁盘驱动器上,专门负责直接驱动磁头臂做运动来读写数据
磁盘控制器位于主板上,专门用来向磁盘驱动器控制电路发送指令,从而控制磁盘驱动器读写数据。
整个流程如下:
- SCSI或者ATA执行指令(即CDB),是由OS内核的磁盘控制器驱动程序生成的
- CPU将CDB通过主板导线发送给同样处于主板上的磁盘控制器
- 磁盘控制器继而通过线缆将指令发送给磁盘驱动器
- 磁盘驱动器解析收到的指令从而根据指令的要求来控制磁头臂
下图表示了磁盘空气驱动程序、磁盘控制器和磁盘驱动器控制电路三者之间的关系
操作系统初始化过程中,和磁盘相关的流程
操作系统还没有启动起来加载磁盘控制器驱动的时候,是怎么访问磁盘的呢?
因为,CPU必须执行磁盘控制器驱动程序才能产生指令,进而才能读写磁盘数据。
所以,系统BIOS可以加载一个简化版的磁盘控制器驱动程序。
操作系统初始化时,通过执行这个驱动程序,会向系统BIOS报告控制器所掌管的磁盘设备的情况。
最后BIOS通过执行驱动程序,使得CPU可以发送对应的读指令,提取磁盘的0磁道的第一个扇区中的代码载入内存执行,从而加载OS。
Queue Depth
再介绍一个影响磁盘性能的概念,叫做Queue Depth
在上面的介绍中,我们会默认理解,磁盘控制器向存储设备发起的指令,是一条一条顺序发送的。
而实际上,这些指令是一批一批地发送的,存储目标设备批量执行IO。
在IO比较少的时候,处理一条指令和同时处理多条指令将会耗费几乎相同的时间。
Queue Depth决定了批量指令处理的最大条数。
随着Queue Depth的增加,IO延迟也会随机增加。
5 小结
这一章,主要介绍了磁盘原理,影响磁盘性能的一些因素。
通过对这些基本原理和概念的理解,不仅了解了磁盘是如何工作的,在遇到底层应用程序的性能问题时,也提供了另外一种思路来定位问题,即对IO读写性能的分析,来定位性能问题。
再啰嗦几句,虽然目前存储这个工作方向很有意思,也很有挑战,但是存储这个方向,更多偏向的是稳定,没有很多fancy的功能开发,所以个人觉得对新人来说,并不是很好的锻炼方向。
最近也愈发对工作分配不满意,更多做的是支持、调查问题之类的没有挑战又费时的工作,可能会考虑换个方向试试吧。
参考资料
《大话存储2-存储系统架构与底层原理极限剖析》
4 磁盘控制器、磁盘驱动器和他们的驱动程序(控制电路)