磁盘和RAID
磁盘
- 持久化的、大容量的、低成本的存储设备:机械、速度慢
- 多种尺寸:3.5",2.5"
- 多种容量:100GB ~ 14TB
- 多种接口
- 典型的磁盘控制器
- 与主机的接口
- SATA,ATA: 面向对延迟、吞吐率要求不高,大容量的场景
- SAS,SCSI/Ultra-SCSI: 面向低延迟,高吞吐率,高可靠场景
- FC: Fiber Channel
- 缓冲:缓冲数据
- 控制逻辑
- 读写请求
- 请求调度
- 缓存替换
- 坏块检测和重映射
- 与主机的接口
- 磁盘的结构
- 盘片:一组
- 按固定速率旋转
- 磁道(Track)
- 位于盘片表面的同心圆
- 用于记录数据的磁介质
- bit沿着每条磁道顺序排列
- 扇区(Sector)
- 磁道划分为固定大小的单元,一般为512字节
- 磁头:一组
- 用于读写磁道上的数据
- 磁臂:一组
- 用于移动磁头(多个)
- 柱面(Cylinder)
- 由所有盘片上半径相同的磁道组成
- Zone
- 不同磁道的扇区个数不同:外道多,内道少
- 所有柱面划分为Zone,同一个Zone中每条磁道的扇区数相同
- 1000-5000个柱面/Zone,其中几个为备用柱面(Spare Cylinder)
- 盘片:一组
磁盘扇区(Sector)
- 扇区的创建
- 磁盘格式化
- 逻辑块地址映射到物理块地址
- 扇区的格式
- 头部:ID,损坏标志位,...
- 数据区:实际用于存储数据的区域,典型大小为 512B
- 尾部:ECC校验码
- 坏扇区
- 发现坏扇区 -> 先用ECC纠错
- 如果不能纠错,用备用扇区替代
- 坏的扇区不再使用
- 磁盘容量
- 格式化损耗20%左右:每个扇区的头部和尾部 + 坏扇区
- 读写操作(读写某个柱面的某个扇区)
- 定位柱面,移动磁臂使磁头对准柱面 -> 寻道seek
- 等待扇区旋转到磁头下方 -> 旋转 rotation
- 进行数据读写 -> 数据传输 transfer
磁盘性能
有效带宽 = 数据量 / 耗时
耗时
- 寻道时间(Seek Time)
- 把磁头移动到目标柱面的时间
- 典型:3.5 ~ 9.5ms
- 旋转延迟(Rotation Delay)
- 等待目标扇区旋转到磁头下方的时间
- 典型:7200 ~ 15000 RPM
- 数据传输时间(Data Transfer Time)
- 典型传输带宽:70~250 MB/Sec
- 寻道时间(Seek Time)
例如:假设磁盘的 BW = 100MB/s,seek=5ms,rotation=4ms
- 访问 1KB 数据的总时间 = 5ms + 4ms + 1KB/(100MB/s) = 9.01ms
- 有效带宽 = 1KB / 9.01ms 远小于 100MB/s
- 一次传输多少数据有效带宽才能达到磁盘带宽的90%
- size = BW(rotation + seek)0.9/(1-0.9) = 8.1MB
- 对于小粒度的访问,时间主要花在寻道时间和旋转时间上
- 磁盘的传输带宽被浪费
- 缓存:每次读写邻近的多个扇区,而不是一个扇区
- 调度算法:减少寻道开销
磁盘缓存
- 磁盘内通过少量 DRAM 来缓存最近访问的块
- 典型大小为 64~256MB
- 由控制器管理,OS无法控制
- 块替换策略:LRU
- 优点:如果访问具有局部性,则读性能受益
- 缺点:需要额外的机制来保障写的可靠性
- 磁盘内通过少量 DRAM 来缓存最近访问的块
磁盘调度算法
磁盘寻道算法FIFO(FCFS)
- 例子
- 请求到达顺序:11 -> 1 -> 36 -> 16 -> 34 -> 9 -> 12
- FIFO服务顺序:11 -> 1 -> 36 -> 16 -> 34 -> 9 -> 12
- FIFO寻道总距离:10 + 35 + 20 + 18 + 25 + 3 = 111
- 好处
- 公平性
- 磁盘请求的服务顺序是应用可以续期的
- 坏处
- 请求到来的随机性,经常长距离地寻道
- 可能发送极端情况,比如需要横扫整个磁盘
磁盘寻道算法SSF(Shortest Seek First)
- 方法
- 选择磁头移动距离最短的请求(需要缓冲一部分请求)
- 计入旋转时间
- 例子
- 请求到达顺序:11 -> 1 -> 36 -> 16 -> 34 -> 9 -> 12
- SSF服务顺序:11 -> 12 -> 9 -> 16 -> 1 -> 34 -> 36
- SSF寻道总距离:1 + 3 + 7 + 15 + 33 + 2 = 61
- 好处
- 减少寻道时间
- 坏处
- 可能产生饥饿
电梯调度(SCAN/LOOK)
- 方法
- 磁头按一个方向到另一端,再折回,按反方向回到这端,不断往返
- 只服务当前移动方向上寻道距离最近的请求
- LOOK:如果磁盘移动方向上没有请求,就折回
- 例子
- 请求到达顺序:11 -> 1 -> 36 -> 16 -> 34 -> 9 -> 12
- SCAN服务顺序:11 -> 12 -> 16 -> 34 -> 36 -> 9 -> 1
- SCAN寻道总距离:1 + 4 + 18 + 2 + 27 + 8 = 60
- 好处
- 消除饥饿、请求的服务时间有上限
- 坏处
- 反方向的请求需等到更长时间
环路电梯调度(C-SCAN/C-LOOK)
- 方法
- 将SCAN改为折回时不服务请求,立即回到磁盘最外层重新向内扫描
- 寻道类似连起来成一个环
- 好处
- 服务时间趋于一致
- 坏处
- 折回时不干事
磁盘调度算法对比
- 调度算法
- FIFO:实现简单,但寻道时间长
- SSF:贪心算法,可能造成饥饿现象(距离初始磁头位置较远的请求长期得不到服务)
- SCAN/LOOK:减少饥饿
- C-SCAN/C-LOOK:减少SCAN算法返回时的扫描开销
- 磁盘I/O请求缓冲
- 把请求缓冲在控制器缓冲区
- 缓冲时间取决于缓冲区大小
- 进一步的优化
- 既寻道最短,又旋转延迟最短
RAID(Redundant Array of Independent Disks)
- 主要思想
- 由多个磁盘构成一个存储设备
- 好处
- 提高性能:多个磁盘并行工作
- 增加容量:聚合多个磁盘的空间
- 提高可靠性:数据冗余,有磁盘损坏时,数据不损坏
- 坏处
- 控制器变得复杂
- 牵扯的问题
- 多块盘做块映射:逻辑块LBN -> <磁盘#,块#>
- 如何通过冗余机制保护数据可靠性
RAID-0
RAID Level 0
- 以条带(Stripe)为粒度映射到N块磁盘(轮转方式),条带宽度为N,即有N个条(strip)组成
- 1个Strip=K个块,即1个条由K个块组成
- 容量
- N * 单个磁盘容量(无冗余)
- 可靠性
- (单个磁盘可靠性)^ N
- 性能:
- 带宽:N * 单个磁盘带宽
- 延迟:单个磁盘延迟
RAID Level 1
- 以镜像的形式存储
- 镜像级别R:数据保存R份
- 通常与RAID-0结合使用
- RAID-01 或 RAID-10
- 容量
- (N * 单个磁盘容量) / R
- 可靠性
- 容忍任何一个磁盘坏
- 特殊情况下可以容忍N/R的磁盘坏
- 性能
- 写带宽:(N * 单个磁盘带宽) / R
- 读带宽:N * 单个磁盘带宽
- 延迟:单个磁盘延迟
RAID Level 4
- 条带化 + 1个校验块
- 所有校验块在同一块磁盘上(校验盘)
- 缺点:校验盘为写性能瓶颈,易损坏
- 每次写数据都需要更新校验快
- 方法一:读所有的数据盘
- 并行读所有磁盘的对应块
- 计算新校验块
- 并行写新块和新校验块
- 方法二:读一个数据盘和校验盘
- 并行读旧块和旧校验块
- 计算新校验块
- Pnew = (Bold ^ Bnew) ^ Pold
- 并行写新块和新校验块
- 方法一:读所有的数据盘
- 容量
- (N - 1) * 单个磁盘容量
- 可靠性
- 容忍任何一块磁盘坏
- 用XOR重构坏盘数据
- 延迟
- 读延迟等于单个磁盘的延迟
- 写延迟约等于2倍单个磁盘的延迟
- 带宽
- 读带宽 = (N-1)*单个磁盘带宽
- 校验盘为写瓶颈,所有校验块串行写
RAID Level 5
- 条带粒度映射 + 1个校验块
- 校验块分散在不同磁盘上
- Rebuild:复杂 & 速度慢
- 写带宽
- 写并行:校验块并行写
- 写带宽:(N*单个磁盘带宽) / 4
- 读带宽
- 正常状态:只读数据块
- 读带宽:N*单个磁盘带宽
其他RAID级别
- RAID Level 2
- 按位为粒度映射 + ECC
- 每4位 + 3位海明码
- 所有磁盘同步读写:寻道 + 旋转
- RAID Level 3
- 按位为粒度映射 + Parity位
- 已知坏磁盘时,可纠错
- RAID Level 6
- 条带粒度映射 + 2个校验块
- 能容忍两块磁盘同时坏
卷管理(Volume Manager)
- 虚拟块设备
- 在多个磁盘上创建一个或多个逻辑卷
- 逻辑卷:一个虚拟块设备
- 采用RAID技术将逻辑卷的块地址映射到物理设备
- 好处
- 提供虚拟的容量和性能
- 容错
- 实现
- OS内核的逻辑卷管理
- Windows MacOS Linux等
- 存储设备控制器(存储系统)
- EMC Hitachi HP IBM NetApp
- 接口:PCIe iSCSI FC等
- OS内核的逻辑卷管理