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

第一章 计算机的IO世界

1.1 总线

1.1.1 总线的概念

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

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

1.1.2 总线的分类

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

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

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

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

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

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

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

接下来是发的过程。

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

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

控制器主要做:

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

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

第二章 磁盘原理

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

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

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

2.1 磁盘的结构


磁盘主要由盘片、磁头、步进电机构成

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

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

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

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

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

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

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


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

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线缆的对比

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总线连接图:

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

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

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

下图是SCSI总线与计算机总线的连接图

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

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

多通道SCSI控制器卡示意图

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通过总线发送指令给主板上的磁盘控制器,
磁盘控制器通过线缆发送指令给驱动器
驱动器控制磁盘进行读写。

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的硬盘在传输小块的不连续的数据具有优势。

原文地址:https://www.cnblogs.com/dy2903/p/8278438.html

时间: 2024-10-01 09:32:01

【大话存储】学习笔记(一),磁盘的相关文章

大话存储学习笔记(1)

一.存储历史 二.计算机IO 1.什么叫IO I表示in,对于CPU来说,从内存中取数据:O表示out,CPU运算完后将数据发送至内存 同理,对于磁盘来说,将数据写入磁盘表示in,将输入从磁盘读出来叫out 2.总线 PCI总线:一种南桥与外设连接的总线技术 PCI总线特点:中断共享,即不同设备使用同一中断而不发生冲突.硬件上采用电平触发:软件上采用中断链,即,假设系统启动时,发现板卡A用了中断7,就会将中断7对应的内存区指向A卡对应的中断服务程序入口ISR_A:系统发现板卡B也用了中断7,这是

大话存储学习笔记(4)

七.逻辑卷管理 逻辑卷管理(简称LVM),是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和分区之上的一个逻辑层. 通过LVM管理可以轻松管理磁盘分区,如:若干个磁盘分区连接为一整块的卷组,形成一个存储池.管理员可以在卷组上随意创建逻辑卷组,并进一步在逻辑卷组上创建文件系统.管理员通过LVM可以方便调整卷组大小,并且可以按照磁盘存储的方式进行命名.管理和分配. LVM的配置信息记录在叫做VGDA(Volume Group Descriptor Area)的区域,LVM就是通过读

大话存储学习笔记(3)

五.磁盘IOPS和传输带宽 磁盘IOPS:每秒能进行多少次IO,每次IO根据写入数据的大小,这个值也不是固定的. 如果IO每次都写入很大的一块连续的数据,则每秒所做的IO次数是比较低的: 如果磁头频繁换道,每次写入的数据还是较大的话,此时IOPS是这块硬盘的最低数值了. 如果在不频繁换道,每次写入最小的数据块,如512字节,则此时IOPS将是最高值. 传输带宽:指硬盘或设备在传输数据是数据流的速度,如果写入1000个1kb的文件需要10s,那么传输带宽只能达到每秒1MB,而写入一个10MB的文件

大话存储学习笔记(5)

九.磁盘阵列 1.关于LUN LUN是SCSI ID的更细一级的地址号,每个SCSI ID下有更多的LUN ID.对大型磁盘阵列来说,可以生产几百几千个虚拟磁盘,为每个磁盘分配一个SCSI ID是远远不够的.因为每个SCSI总线最多允许16个设备接入(目前32位SCSI标准可以接入32个).LUN是一个次级寻址ID.磁盘阵列可以在一个SCSI ID下虚拟多个LUN地址,每个LUN对应一个虚拟磁盘.硬件层次生成的虚拟磁盘,称为LUN:软件生成的虚拟磁盘,称为卷. 2.双控制器的磁盘阵列 如果盘阵内

大话设计模式学习笔记——面向对象基础

前言 好记性不如烂"笔头"系列--大话设计模式学习笔记 目录 面向对象基础 面向对象基础 什么是类与实例 一切事物皆为对象,即所有的东西老师对象,对象就是可以看到.感觉到.听到.触摸到.尝到.或闻到的东西.准确地说,对象是一个自包含的实体,用一组可识别的特性和行为来标识.面向对象编程,英文叫 Object-Oriented Programming,其实就是针对对象来进行编程的意思.类就是具有相同属性和功能的对象的抽象集合.实例就是一个真实的对象.比如我们属于'人'类,而个人就是'人'类

Linux学习笔记一 磁盘管理常用命令

Linux学习笔记一 磁盘管理常用命令 Linux系统下,一切均是文件,磁盘是一种特殊的块设备文件. 常用的硬盘接口类型 并口:IDE ,SCSI 串口:SATA,SAS 磁盘设备文件设备文件的命令规则: IDE: 设备名为/dev/hda, /dev/hdb-.  (末尾的a ,b-代表不同的IDE硬盘) SCSI:设备名为/dev/sda, /dev/sdb-.(末尾的a,b-代表不用的SCSI硬盘 机械式硬盘: track: 磁道(盘面上由外向里划分成不同的磁道) cylinder: 柱面

大话存储 3 - 七种磁盘RAID技术

RAID技术 Redundant Array of Independent Disks 由独立的磁盘组成的具有冗余特性的阵列. 有两个特性: 阵列:需要很多磁盘来组成 冗余:允许某块磁盘损坏之后,数据仍然可用 目前,单块磁盘容量只有几T,对于现代应用程序来说远远不够.为了提供容量更大的磁盘,发明了RAID技术. ? 1 七种RAID简介 RAID 0 4个磁盘组成一个阵列 4个扇区组成的块作为基本单元 不同磁盘的相同偏移处的块组合成Stripe 数据写入:数据被分成多块写入4个磁盘,而不是顺序写

大话设计模式学习笔记

大话设计模式笔记 1. 使用简单工厂模式(使用反射可以解决避免分支判断问题) 注重创建不同的对象 2. 使用策略模式处理 不同的时间应用不同的业务规则 3. 单一原则:一个类仅有一个变化的原因  发现职责并把职责分离 4. 开放-封闭原则:软件实体可以扩展但不能修改  对扩展开放 对更改封闭 开发人员对程序中呈频繁变化的那部分做出抽象 5. 依赖倒转原则: A.高层模块不应依赖底层模块.两者都应该依赖抽象. B.抽象不应该依赖细节,细节应该依赖于抽象.即针对接口编程, 不应针对实现编程. 里氏替

[大话设计模式]学习笔记——简单工厂模式

序 说好的每天进步一点点的,结果工作太忙,一直在加班,都没有学习新东西.我还要进BAT呢. 坚持每天学习新东西. 写代码时,意识到在代码结构上还是有点欠缺.赶紧补上. 纪录对设计模式的认识.小菜变大鸟.进攻BAT. 应用场景: 编写一个计算器控制台程序,要求输入两个数和运算符号,得到结果. 这本书使用C#写的.已有博主用JAVA写出来,参考:http://blog.csdn.net/ghsau/article/details/8163418 常见的做法: 写一个方法封装计算机的功能,我们只需传参

Linux学习笔记——Linux磁盘管理

Linux中的分区管理工具主要有:fdisk, parted, sfdisk fdisk命令 对于一块硬盘最多只能管理15个分区 命令格式:fdisk -l [-u] [device...] fdisk device 之后可以键入相应键值进行操作 p: print, 显示已有分区: n: new, 创建 e:创建扩展分区 p:创建主分区 d: delete, 删除 w: write, 写入磁盘并退出 q: quit, 放弃更新并退出 m: 获取帮助 l: 列表所分区id t: 调整分区id 创建