【大话存储】学习笔记(一),磁盘

clip_image001[12]

第一章 计算机的IO世界

1.1 总线

1.1.1 总线的概念

计算机中所有的IO都通过共享总线的方式来实现。

总线实际上就是一条或多条的物理导线。密密麻麻的印到电路板上,而且为了避免高频振荡的干扰,一般都会分组印刷到不同的电路板上,然后压合起来。

1.1.2 总线的分类

clip_image002[11]

PCI总线是目前PC机与x86服务器普遍使用的南桥与外设连接的总线技术。

PCI总线的地址总线和数据总线是分时复用的,这样可以节省管脚数量。

在数据传输时,PCI协议上有三种不同的角色

  • 主,也就是发起者
  • 从,Target或者Slave
  • 仲裁者Arbiter

1.2 CPU、内存、磁盘交互过程

CPU、内存、磁盘通过总线相互连接,所以通路的因素具备了。

然后需要上通路上的设备有不同的标识,这样才可以区分开。所以每个IO设备在启动的时候,都需要向物理机的内存中映射一个地址。

接下来是发的过程。

CPU首先将IO地址放到系统总线上,接下来传三条指令

  • 是想读还是想写,是否开磁盘缓存等。
  • 从哪儿读:磁盘的LBA地址
  • 读到地址放到内存那里?
    通过总线传到磁盘控制器上。

控制器主要做:

  • 查找并寻道
  • 通过DMA技术,也就是磁盘控制器可以直接对内存寻址并进行写操作。(这样可以解放CPU)

上述所说的过程均为CPU对磁盘发送某种指令的信息,告诉磁盘控制器应该怎么操作。而这一类的指令可以分为SCSI指令集和ATA指令集。SCSI指令集更高效。

第二章 磁盘原理

本章所提到的磁盘主要指的是机械磁盘。

要了解磁盘主要需要通过如下几个方面;

  • 磁盘的结构
  • 数据的组织方式
  • 高层技术:队列、无序存储、磁盘缓存
  • 磁盘接口技术
  • 磁盘驱动程序

2.1 磁盘的结构

clip_image003[12]
磁盘主要由盘片、磁头、步进电机构成
clip_image004[10]

  • 硬盘一般是多个盘片固定在一个公共的转轴上
  • 主轴电机带动盘片组高速旋转产品高速气流,将磁头浮起;
  • 磁头组在电机的带动下作径向运动

通俗的说来,盘片上步满磁性介质,类似于一张白纸,如果想在上面记录的话,一般需要划格子,划格子的过程就是低级格式化。

因为盘片是圆的,所以就每个同心圆(磁道)就是类似于稿纸的一行,每一行上再分为若干的格子(扇区),磁头就类似于打印喷头

对于打印机来说,需要纸不断的移动,但是这样效率太低了,对于磁盘来说可以让磁盘不断的旋转,然后移动磁头来进行换行。

目前服务器中一般选择1万转/s,可以获得比较高的性价比。

  • 磁道:同心圆
  • 扇区:每个同心圆的上每段圆弧,是读写的最小单位
  • 柱面:所有盘面上的同一磁道,在竖直方向上构成一个圆柱。

需要注意的是,数据的读写是按照柱面来进行的,也就是说首先在同一柱面的内从0磁头开始,依次向下在同一柱面的不同盘面上进行操作。因为

clip_image005[12]
如图所示,这样才操作只需要改变电流,只需要通过电子切换,而不需要改变磁道(机械切换),速度更快。

2.1.1 扇区寻址

通过柱面、磁头、扇区一定可以知道当前处于盘片上的哪个位置。

磁盘对外提供线性地址,即LBA(Logical block address)地址。也就是将磁盘想象成只有一个磁道,是无限长的直线,扇区为上面的等长的线段,这样可以屏蔽柱面、磁头等比较复杂的东西,对外而言寻址方式更为简便。

而LBA地址与磁道磁头扇区的对应关系保存在磁盘控制电路的ROM里面,可以在磁盘初始化的时候载入缓存以便查询。

也就是说通过磁盘控制器可以对外屏蔽查找具体扇区的细节,进行逻辑的抽象,这样就完成了物理地址到逻辑地址的抽象、虚拟、映射

2.2 磁盘高层技术

2.2.1 队列技术

第一个指令向让读最外圈的数据,第二个指令向读最内圈的数据,第三个指令又向读最外圈的数据,如果按照这个顺序来,需要频繁的换道,我们知道换道时间非常长,是性能的瓶颈。

所以可以先切换到最外圈,执行完第一个指令,然后先执行第三个指令,最后再执行第二个指令,类似于电梯,每次把同方向的人都搭载上去。

2.3 无序传输技术

要求读某些扇区的内容,不是从初始扇区开始读,而是读离磁头近的扇区。

2.3.1 磁盘缓存

磁盘上的缓存其实就是一块电路板上的RAM芯片,如果断电的话,里面的数据会丢失。
主要的作用是:

  • 接收指令和数据
  • 进行预读

有些资料说禁用磁盘缓存,这种说法容易造成误解。

实际上禁用磁盘缓存就是Write Through(直通)模式,也就是说磁盘收到指令和数据并需要进行写入的时候,不能够在数据到达缓存的时候就返回成功,而是应该等到数据都落入盘片以后,才向控制器返回成功信号。相当于禁用了缓存

实际上这种模式,数据还是会到达缓存。
SCSI指令中有两个参数可以控制缓存:

  • DPO(Disable PageOut):禁止缓存中的数据页被换出,置了这个位的数据不能将其他数据换出。
  • FUA:Force Unit Access:强制盘片访问,也就是Write Through

所以如果DPO和FUA都置1了, 相当于完全不使用缓存的提速作用。

2.3.2 影响磁盘性能的因素
  • 转速:主要影响连续IO的吞吐量。因为转得越快,数据传输时间越短。
  • 寻道速度:主要影响随机IO。因为随机IO下,必须频繁的换道。
  • 单碟容量:单碟容量越高,单位空间内的数据量越大
  • 接口速度:最不重要,因为目前的接口速度已经满足了磁盘能达道的最高传输带宽。

2.4 磁盘接口技术

不管硬盘内部多么复杂,一定需要向使用者提供接口,以屏蔽访问的细节,这个接口不是物理的接口,而是硬盘面向外部的时候,为了被方便的使用,所提供的抽象的协议。
目前硬盘提供的物理接口

  • 用于ATA指令的IDE接口
  • 用于ATA指令的SATA接口
  • 用于SCSI指令的并行SCSI接口
  • 用于SCSI指令的串行SCSI(SAS)接口
  • 用于SCSI指令系统,并且承载于FC协议的串行FC接口

列成表格如下

接口

英文

指令系统

备注

IDE接口

Parallel ATA(Advanced Technology Attachment)

ATA指令系统

Integrated Drive Electronics

SATA接口

Serial ATA

ATA指令系统

 

并行SCSI接口

Parallel SCSI(small computer system interface)

SCSI指令系统

 

SAS接口

serial SCSI

SCSI指令系统

 

FC接口

Fibre Channel

SCSI指令系统

承载FC协议的串行SCSI接口

2.4.1 IDE硬盘接口

IDE,integrated Drive Electronics ,电子集成驱动器,本意是把控制电路、盘片、磁头放到一个容器中的硬盘驱动器,制造比较容易。

IDE接口,也称PATA接口,也即并行ATA

ATA协议需要主机更多参与IO,无法支持大量的并发访问,适用于家用电脑和低端服务器;

2.4.2 SATA硬盘接口

SATA:串性ATA,用串行线路传输数据,但是指令集仍然是ATA。

下图是IDE与SATA线缆的对比

clip_image006[10]

SATA的优点是:

  • 可以对指令及数据包进行CRC,而PATA只能对来回传输的数据进行较验。
  • 相对于IDE的80芯更节省空间。

目前SATA规范中接口速率为6Gb/s,有于SATA使用8bit/10bit编码,所以6Gb/s相当于600MB/s的接口速率,但是实际上性能没有得到多大的提升。

因为硬盘的速率瓶颈在于硬盘内部的寻道,而非传输,接口速率的提高最直接影响从缓存中的读写。

2.4.3 SCSI硬盘接口

SCSI接口更为灵活,而且性能也较高。

可以有8个或者16个SCSI设备连接在SCSI通道上,缺点是比较贵。因为一般需要配备价格不菲的SCSI卡,而且SCSI接口的设备在安装、设置时比较麻烦。
SCSI总线连接图:
clip_image007[10]

一条总线上最多16个节点,各分配一个SCSI ID ,其中SCSI控制器需要占一个ID

SCSI卡上有一块类似CPU的芯片可以对SCSI设备进行控制,减少了CPU的负担,所以适合大量并发访问场景,适用于企业级数据中心

SCSI卡将SCSI总线上的设备,经过PCI总线传递给内存中运行的SCSI卡的驱动程序,OS知道所有设备。

下图是SCSI总线与计算机总线的连接图
clip_image008[10]

可以看出SCSI卡一端接主机的PCI,一端用SCSI控制器接入SCSI总线。

多通道SCSI卡:如果一张卡上有多个控制器,每个控制器独立掌管一条总线

多通道SCSI控制器卡示意图
clip_image009[10]

2.4.3.1 SCSI协议寻址方式

SCSI协议的寻址方式按照“控制器——通道——SCSI ID —— LUN ID ”。

LUN:logic unit number

一个主机IO总线上可以有多个控制器,每个控制器可以有多条后端的SCSI总线(通道),每个SCSI总线上挂着8个或者16个SCSI设备,通过SCSI ID来区分。

然而SCSI ID不是最后一层地址,还有一个LUN ID 。 SCSI设备不能物理上再分割了,所以只能在逻辑上分,每个SCSI ID下面可以区分出若干的LUN ID 。这样一条SCSI总线上可接入的逻辑存储单元数量大大增加。

LUN对于传统的SCSI总线意义不大,但是对带RAID功能的SCSI接口磁盘阵列来说,因为会产生很多虚拟磁盘,所以可以使用LUN来扩充可寻址范围。习惯上称磁盘阵列生成的虚拟磁盘为LUN。

SCSI控制器也是总线上的一个节点,不过优先级必须是最高的。

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

2.5.1 磁盘控制器

硬盘的接口:

  • 物理接口:硬盘接入磁盘控制器需要的接口
  • 逻辑接口:指令系统,指令集定义了“怎么样向磁盘发送数据和读数据”,这套指令集是由专门的芯片来生成,这就是磁盘控制器

磁盘控制器的作用:参与底层总线的初始化、仲裁过程,向驱动程序提供简单的接口。

所以驱动程序只需要将要读写的设备号、读写的初始地址、长度告诉控制器即可,其他的由控制器来完成

2.5.2 驱动器控制器电路
  • 驱动器控制电路:位于磁盘驱动器上,负责驱动磁头臂来读写数据
  • 磁盘控制器:向磁盘驱动器的控制器电路发送指令。

所以流程是,CPU通过总线发送指令给主板上的磁盘控制器,
磁盘控制器通过线缆发送指令给驱动器
驱动器控制磁盘进行读写。
clip_image010[10]

CPU操作磁盘控制器的指令系统叫磁盘控制器驱动程序
控制器收到指令通过电路逻辑运算生成的指令就是常说的ATA指令集或者SCSI指令集。

2.5.3 为什么在SCSI磁盘上安装操作系统需要手动加载SCSI驱动?

机器刚通电,OS还没启动起来,所以也没加载磁盘控制器驱动,如何访问磁盘的呢?

这要从机器启动的流程说起,系统的BIOS中存放了初始化系统的基本代码,所以机器启动后执行系统BIOS里面的代码,里面有一步就是去查找磁盘控制器上的BIOS地址,然后去这个地方再执行其中的代码以初始化控制器。

最后此BIOS让CPU提取0磁道中的第1扇区的代码,从而加载OS。

从上面的流程可以看出,系统BIOS会指示CPU查找磁盘控制器的BIOS地址,具有最基本的磁盘控制器驱动程序。但是因为不完善,所以在OS内核启动的过程中,会用自己的驱动来接管。

那么向SCSI磁盘上安装OS,必须手动加载SCSI驱动就原因就不难解释了。

因为CPU必须通过执行驱动程序才能向磁盘驱动器发指令,而磁盘控制器BIOS里面的代码非常简单,功能很有限,只能适用于启动OS这种临时任务。所以必须加载完整功能的驱动程序。

对于ATA磁盘来说,ATA已经是非常成熟的技术了,控制器一般都是Intel的,所以操作系统安装程序在初始化执行的时候已经自行加载了驱动。

而SCSI磁盘的生产厂商很多,所以必须手动加载。

安装了OS的系统,启动之初从磁盘BIOS(ROM)中读取驱动程序,此时的执行速度很慢,但是一旦将OS本身的驱动程序读到了内存中以后,速度就可以增加。由于操作系统安装以后,就具有磁盘的驱动程序了,所以不需要每次手动加载。

2.6 磁盘IOPS和吞吐量

衡量磁盘的性能最重要的两个参数就是IOPS和吞吐量。

IOPS关注的就是每秒进行多少次的IO,跟随机读写的快慢有关。
而吞吐量关注的是硬盘在传输数据的时候数据流的速度。

2.6.1 IOPS

IOPS:也就是每秒能进行多少次IO。这个值也不是固定的。

写入10000个大小为1KB的文件,比写入一个10MB的文件耗费更多的时间。

因为10000个文件需要做好几万次IO,而写入10MB的大文件,因为是连续存放,所以只需要几十个IO。
对于写入10000个小文件,因为每秒需要的IO非常高,如果用具有较高IOPS的磁盘,将提速不少。写入10MB文件,就算用了较高的IOPS也不会提升速度。因为只需要少量的IO。只有用较大传输带宽的才会体现优势。

2.7 传输带宽

传输带宽:硬盘在传输数据时的数据流的速度。

在同一块硬盘写入不同大小的数据,带宽不同。

硬盘的带宽如果高,在传输大块的连续的数据时有优势。

而具有高IOPS的硬盘在传输小块的不连续的数据具有优势。

posted @ 2018-01-13 09:56  dy2903  阅读(1565)  评论(0编辑  收藏  举报