磁盘和RAID

磁盘

  1. 持久化的、大容量的、低成本的存储设备:机械、速度慢
    • 多种尺寸:3.5",2.5"
    • 多种容量:100GB ~ 14TB
    • 多种接口
  2. 典型的磁盘控制器
    • 与主机的接口
      • SATA,ATA: 面向对延迟、吞吐率要求不高,大容量的场景
      • SAS,SCSI/Ultra-SCSI: 面向低延迟,高吞吐率,高可靠场景
      • FC: Fiber Channel
    • 缓冲:缓冲数据
    • 控制逻辑
      • 读写请求
      • 请求调度
      • 缓存替换
      • 坏块检测和重映射
  3. 磁盘的结构
    • 盘片:一组
      • 按固定速率旋转
    • 磁道(Track)
      • 位于盘片表面的同心圆
      • 用于记录数据的磁介质
      • bit沿着每条磁道顺序排列
    • 扇区(Sector)
      • 磁道划分为固定大小的单元,一般为512字节
    • 磁头:一组
      • 用于读写磁道上的数据
    • 磁臂:一组
      • 用于移动磁头(多个)
    • 柱面(Cylinder)
      • 由所有盘片上半径相同的磁道组成
    • Zone
      • 不同磁道的扇区个数不同:外道多,内道少
      • 所有柱面划分为Zone,同一个Zone中每条磁道的扇区数相同
      • 1000-5000个柱面/Zone,其中几个为备用柱面(Spare Cylinder)

磁盘扇区(Sector)

  1. 扇区的创建
    • 磁盘格式化
    • 逻辑块地址映射到物理块地址
  2. 扇区的格式
    • 头部:ID,损坏标志位,...
    • 数据区:实际用于存储数据的区域,典型大小为 512B
    • 尾部:ECC校验码
  3. 坏扇区
    • 发现坏扇区 -> 先用ECC纠错
    • 如果不能纠错,用备用扇区替代
    • 坏的扇区不再使用
  4. 磁盘容量
    • 格式化损耗20%左右:每个扇区的头部和尾部 + 坏扇区
  5. 读写操作(读写某个柱面的某个扇区)
    • 定位柱面,移动磁臂使磁头对准柱面 -> 寻道seek
    • 等待扇区旋转到磁头下方 -> 旋转 rotation
    • 进行数据读写 -> 数据传输 transfer

磁盘性能

  1. 有效带宽 = 数据量 / 耗时

  2. 耗时

    • 寻道时间(Seek Time)
      • 把磁头移动到目标柱面的时间
      • 典型:3.5 ~ 9.5ms
    • 旋转延迟(Rotation Delay)
      • 等待目标扇区旋转到磁头下方的时间
      • 典型:7200 ~ 15000 RPM
    • 数据传输时间(Data Transfer Time)
      • 典型传输带宽:70~250 MB/Sec
  3. 例如:假设磁盘的 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
    • 对于小粒度的访问,时间主要花在寻道时间和旋转时间上
      • 磁盘的传输带宽被浪费
      • 缓存:每次读写邻近的多个扇区,而不是一个扇区
      • 调度算法:减少寻道开销
  4. 磁盘缓存

    • 磁盘内通过少量 DRAM 来缓存最近访问的块
      • 典型大小为 64~256MB
    • 由控制器管理,OS无法控制
    • 块替换策略:LRU
    • 优点:如果访问具有局部性,则读性能受益
    • 缺点:需要额外的机制来保障写的可靠性

磁盘调度算法

磁盘寻道算法FIFO(FCFS)

  1. 例子
    • 请求到达顺序:11 -> 1 -> 36 -> 16 -> 34 -> 9 -> 12
    • FIFO服务顺序:11 -> 1 -> 36 -> 16 -> 34 -> 9 -> 12
    • FIFO寻道总距离:10 + 35 + 20 + 18 + 25 + 3 = 111
  2. 好处
    • 公平性
    • 磁盘请求的服务顺序是应用可以续期的
  3. 坏处
    • 请求到来的随机性,经常长距离地寻道
    • 可能发送极端情况,比如需要横扫整个磁盘

磁盘寻道算法SSF(Shortest Seek First)

  1. 方法
    • 选择磁头移动距离最短的请求(需要缓冲一部分请求)
    • 计入旋转时间
  2. 例子
    • 请求到达顺序:11 -> 1 -> 36 -> 16 -> 34 -> 9 -> 12
    • SSF服务顺序:11 -> 12 -> 9 -> 16 -> 1 -> 34 -> 36
    • SSF寻道总距离:1 + 3 + 7 + 15 + 33 + 2 = 61
  3. 好处
    • 减少寻道时间
  4. 坏处
    • 可能产生饥饿

电梯调度(SCAN/LOOK)

  1. 方法
    • 磁头按一个方向到另一端,再折回,按反方向回到这端,不断往返
    • 只服务当前移动方向上寻道距离最近的请求
    • LOOK:如果磁盘移动方向上没有请求,就折回
  2. 例子
    • 请求到达顺序:11 -> 1 -> 36 -> 16 -> 34 -> 9 -> 12
    • SCAN服务顺序:11 -> 12 -> 16 -> 34 -> 36 -> 9 -> 1
    • SCAN寻道总距离:1 + 4 + 18 + 2 + 27 + 8 = 60
  3. 好处
    • 消除饥饿、请求的服务时间有上限
  4. 坏处
    • 反方向的请求需等到更长时间

环路电梯调度(C-SCAN/C-LOOK)

  1. 方法
    • 将SCAN改为折回时不服务请求,立即回到磁盘最外层重新向内扫描
    • 寻道类似连起来成一个环
  2. 好处
    • 服务时间趋于一致
  3. 坏处
    • 折回时不干事

磁盘调度算法对比

  1. 调度算法
    • FIFO:实现简单,但寻道时间长
    • SSF:贪心算法,可能造成饥饿现象(距离初始磁头位置较远的请求长期得不到服务)
    • SCAN/LOOK:减少饥饿
    • C-SCAN/C-LOOK:减少SCAN算法返回时的扫描开销
  2. 磁盘I/O请求缓冲
    • 把请求缓冲在控制器缓冲区
    • 缓冲时间取决于缓冲区大小
  3. 进一步的优化
    • 既寻道最短,又旋转延迟最短

RAID(Redundant Array of Independent Disks)

  1. 主要思想
    • 由多个磁盘构成一个存储设备
  2. 好处
    • 提高性能:多个磁盘并行工作
    • 增加容量:聚合多个磁盘的空间
    • 提高可靠性:数据冗余,有磁盘损坏时,数据不损坏
  3. 坏处
    • 控制器变得复杂
  4. 牵扯的问题
    • 多块盘做块映射:逻辑块LBN -> <磁盘#,块#>
    • 如何通过冗余机制保护数据可靠性

RAID-0

RAID Level 0

  1. 以条带(Stripe)为粒度映射到N块磁盘(轮转方式),条带宽度为N,即有N个条(strip)组成
  2. 1个Strip=K个块,即1个条由K个块组成
  3. 容量
    • N * 单个磁盘容量(无冗余)
  4. 可靠性
    • (单个磁盘可靠性)^ N
  5. 性能:
    • 带宽:N * 单个磁盘带宽
    • 延迟:单个磁盘延迟

RAID Level 1

  1. 以镜像的形式存储
    • 镜像级别R:数据保存R份
  2. 通常与RAID-0结合使用
    • RAID-01 或 RAID-10
  3. 容量
    • (N * 单个磁盘容量) / R
  4. 可靠性
    • 容忍任何一个磁盘坏
    • 特殊情况下可以容忍N/R的磁盘坏
  5. 性能
    • 写带宽:(N * 单个磁盘带宽) / R
    • 读带宽:N * 单个磁盘带宽
    • 延迟:单个磁盘延迟

RAID Level 4

  1. 条带化 + 1个校验块
    • 所有校验块在同一块磁盘上(校验盘)
    • 缺点:校验盘为写性能瓶颈,易损坏
  2. 每次写数据都需要更新校验快
    • 方法一:读所有的数据盘
      • 并行读所有磁盘的对应块
      • 计算新校验块
      • 并行写新块和新校验块
    • 方法二:读一个数据盘和校验盘
      • 并行读旧块和旧校验块
      • 计算新校验块
        • Pnew = (Bold ^ Bnew) ^ Pold
      • 并行写新块和新校验块
  3. 容量
    • (N - 1) * 单个磁盘容量
  4. 可靠性
    • 容忍任何一块磁盘坏
    • 用XOR重构坏盘数据
  5. 延迟
    • 读延迟等于单个磁盘的延迟
    • 写延迟约等于2倍单个磁盘的延迟
  6. 带宽
    • 读带宽 = (N-1)*单个磁盘带宽
    • 校验盘为写瓶颈,所有校验块串行写

RAID Level 5

  1. 条带粒度映射 + 1个校验块
    • 校验块分散在不同磁盘上
    • Rebuild:复杂 & 速度慢
  2. 写带宽
    • 写并行:校验块并行写
    • 写带宽:(N*单个磁盘带宽) / 4
  3. 读带宽
    • 正常状态:只读数据块
    • 读带宽:N*单个磁盘带宽

其他RAID级别

  1. RAID Level 2
    • 按位为粒度映射 + ECC
    • 每4位 + 3位海明码
    • 所有磁盘同步读写:寻道 + 旋转
  2. RAID Level 3
    • 按位为粒度映射 + Parity位
    • 已知坏磁盘时,可纠错
  3. RAID Level 6
    • 条带粒度映射 + 2个校验块
    • 能容忍两块磁盘同时坏

卷管理(Volume Manager)

  1. 虚拟块设备
    • 在多个磁盘上创建一个或多个逻辑卷
    • 逻辑卷:一个虚拟块设备
    • 采用RAID技术将逻辑卷的块地址映射到物理设备
  2. 好处
    • 提供虚拟的容量和性能
    • 容错
  3. 实现
    • OS内核的逻辑卷管理
      • Windows MacOS Linux等
    • 存储设备控制器(存储系统)
      • EMC Hitachi HP IBM NetApp
      • 接口:PCIe iSCSI FC等