OS

大容量存储系统

Operating System Notes

Posted by AH on December 13, 2019

第11章 大容量存储系统

11.1 概述

  • 现代计算机的辅助存储块是硬盘驱动器(HDDs)和非易失性存储器(NVM)设备
  • HDDs在移动读写头下旋转带磁性涂层的盘
    • 驱动器每秒旋转60-250次
    • transfer rate(传输速率)是数据在驱动器和计算机之间流动的速率
    • positioning time/random-access time(定位时间/随机访问时间)是把磁盘臂移到目标柱面(cylinder)的时间(seek time寻道时间)+转到目标扇区(sector)的时间(rotational latency旋转延迟)
    • 磁头碰撞(head crash)是由磁头和磁盘表面接触发生的——真是太糟糕了

11.1.1 硬盘驱动(HDD)

  • 盘面尺寸历史上从0.85‘’到14‘’
    • 通常3.5‘’、2.5‘’或1.8‘’
  • 每个驱动器从30GB到3TB不等
  • 性能
    • 传输速率:理论上,6Gb/sec
    • 有效传输速率:实际上,1Gb/sec
    • 寻道时间:3ms到12ms,台式机驱动器一般9ms
    • 平均寻道时间是用1/3轨道测量或计算的
    • 基于主轴速度的延迟
      • 1/(RPM/60) = 60/RPM
    • 平均延迟 = 1/2延迟

硬盘性能:

  • 访问延迟 = 平均访问时间 = 平均寻道时间+平均延迟

    • 对于最快的硬盘:3ms+2ms = 5ms
    • 对于慢一点的硬盘:9ms+5.56ms = 14.56ms
  • 平均I/O时间 = 平均访问时间 + 传输量/传输速率 + 控制器开销

  • 例如:要在一个7200RPM、5ms平均寻道时间、1Gb/sec传输率和0.1ms控制器开销的硬盘上传输4KB的块

    • 平均延迟:7200RPM-》120转/s-》转半圈用1/240 s = 4.17ms

    • 平均访问时间 = 5ms + 4.17ms = 9.17ms

    • 1Gb/s = 0.125 GB/s = 0.125 * 1024^2 KB/s

      传输时间 = 4KB / (0.125*1024^2)KB/s = 0.031ms

    • 平均I/O时间 = 9.17ms + 0.031ms + 0.1ms = 9.301ms

11.1.2 非易失性存储器

11.1.2.1 概述
  • 如果像盘驱动,就叫固态硬盘SSDs
  • 其他形式还包括USB驱动器(拇指驱动器,闪存驱动器),替换DRAM磁盘,安装在主板表面以及智能手机等设备中的主存储
  • 比HDDs可靠
  • 每MB更贵
  • 生命周期可能更短——需要小心管理
  • 容量更少
  • 但更快
  • 总线就太慢了-》比如可以直接连到PCI
  • 没有移动部分,所以没有寻道时间和旋转延迟
  • 具有挑战性的特征
  • 以“页面”为增量进行读取和写入(以扇区为单位),但不能就位覆盖
    • 必须先被擦除,而且擦除发生在更大的块增量中
    • 擦除次数有限~100,000
    • 生命跨度由每天驱动器写入(DWPD)衡量
      • 1TB NAND驱动,5DWPD被认为是在保证期间有每天5TB写入量而不坏
11.1.2.2 NAND闪存控制器算法
  • NAND不能覆写(但可以擦除后再写),页中的数据可能无效或者有效,混合在一起
  • 为了能够追踪哪些逻辑块是正确的,控制器维护一个闪存转换层(FTL, flash translation layer)表
  • 还应用垃圾收集(garbage collection)来释放无效页的空间
    • 好的数据被复制到其它位置,空出可以被擦除的块,以备未来写入
  • 使用过度配置(overprovisioning)来为垃圾收集提供工作空间
    • 设备留出一定量的页,总可以往这个区域写入

  • 每个单元都有使用寿命,因此需要平均分配损耗,平等地写入所有单元

11.1.3 易失性存储(Volatile Memory)

  • DRAM经常被用作大容量存储设备
    • 从技术上讲,这不是二级存储,因为它易失,但它可以具有文件系统,就像使用非常快的二级存储一样
  • RAM驱动器(有很多名字,包括RAM盘)可以被用作生块设备,通常在上面部署文件系统
  • 计算机已经有了缓冲buffer和缓存cache,再用DRAM作为数据暂存器又是为什么?
    • cache和buffer被程序员和OS管理
    • RAM驱动允许用户(以及程序员)通过标准文件操作把数据暂时安全地放在内存里
    • 在各大主流OS中都有
  • 用足高速暂存
    • 程序可以通过读写RAM驱动快速共享块日期

11.1.4 辅助存储连接方法

  • 辅助存储设备通过系统总线或I/O总线连接到计算机
  • 有多种可用的总线,包括ATA、SATA、eSATA、SAS、USB和FC
  • 最常见的是SATA
  • 因为NVM比HDD快多了,新的NVM快速接口称作NVMe(NVM express),直接连到PCI总线
  • 在总线上的数据传输由特殊的电子处理器(称为控制器,或主机-总线适配器)完成
    • 主线控制器在总线的计算机端,设备控制器在设备端
    • 计算机在主机控制器上放指令,用的是内存映射的I/O端口
      • 主机控制器向设备控制器传递消息
      • 数据通过DMA在设备和计算机DRAM之间传输

11.1.5 地址映射

磁盘结构:

  • 磁盘驱动器以大型一维的逻辑块数组寻址,其中逻辑块是最小的传输单位
    • 低层次的结构在物理介质上创建逻辑块
  • 意味逻辑块数组被依次映射到磁盘的扇区
    • 扇区0是最外层柱面的第一条轨道的第一个扇区
    • 接着依次映射整条轨道,然后是这个柱面的其它轨道,再到剩下的柱面,从最外层到最内层
    • 逻辑地址到物理地址的映射理论上是容易的,但实际上有三个问题:
      • 在映射过程中要用其他空扇区来代替坏扇区
      • 每条轨道的扇区数量在某些驱动器上不是定值
      • 磁盘制造商在内部管理LBA(logical block address)到物理地址的映射,所以在目前的驱动器中,LBA和物理扇区的关系很小

11.2 HDD调度

  • OS负责高效地使用硬件,对于磁盘驱动器而言,这意味着快速访问时间和硬盘带宽
  • 最小寻道时间
  • 寻道时间约等于寻道距离
  • 磁盘带宽是传输的总字节数,除以第一次请求服务到最后一次传输完成之间的总时间

  • 磁盘I/O请求的源很多
    • OS
    • 系统进程
    • 用户进程
  • I/O请求包括输入和输出模式、磁盘地址、内存地址和要传输的扇区数量
  • OS为每个磁盘或设备维护请求队列
  • 空闲磁盘可以立马为I/O请求工作,忙碌磁盘意味着任务必须排队
    • 优化算法的说法只在队列存在的情况下成立
  • 在过去,OS负责管理队列和磁盘驱动器磁头的调度
    • 现在,内置在存储设备、控制器中
    • 只提供LBAs,处理请求的排序
      • 一些使用的算法将在下面介绍
  • 注意,驱动器控制器由很小的缓冲,可以管理一个I/O请求队列
  • 有几种算法来调度磁盘I/O请求的服务
  • 对于一个或多个盘面分析都是对的

11.2.1 FCFS调度

11.2.2 SCAN调度

11.2.3 C-SCAN调度

11.2.4 磁盘调度算法的选择

  • SSTF是最常见的
    • SSTF:shortest seek time first
  • SCAN和C-SCAN在磁盘负载重的系统表现很好
    • 更少的饥饿(starvation),但也不是不可能
  • 为了防止饥饿Linux应用了ddl调度器
    • 分开维护读和写队列,读优先
      • 因为进程更可能在读上阻塞而不是写
    • 应用四个队列:两个读两个写
      • 一个读和一个写队列以LBA顺序排序,本质上应用了C-SCAN
      • 另一个读和写队列以FCFS排序
      • 所有I/O请求都以批的形式发送并按照该队列的顺序排序
      • 在每一个批后,检查FCFS中的请求有没有比配置的年龄大的(默认是500ms)
        • 如果确实大,包含那个请求的LBA队列被选为I/O的下一个批

11.3 NVM调度

  • 没有磁头和旋转延迟,但仍有优化空间
  • I/O可以按顺序或随机发生。
    • 顺序存取对于像HDD和磁带这样的机械设备来说是最佳的,因为要读或写的数据在读/写磁头附近。以每秒输入/输出操作(IOPS)度量的随机访问I/O会导致HDD磁头移动
    • 随机访问I/O在NVM上要快得多。一个硬盘可以产生数百IOPS,而一个固态硬盘可以产生几十万IOPS
  • HDD的写入性能在生命周期内一致,但NVM由于垃圾收集和磨损等原因,性能会随时间变差

11.4 错误检测和纠正

  • 这对于计算的很多领域都很重要,包括内存、网络和存储
  • 错误检测确定一个问题有没有发生
    • 如果检测到了,能暂停操作
    • 检测经常通过奇偶校验位完成
  • 奇偶校验(parity)是检查和(checksum)的一种形式:用取模运算来计算、存储和比较固定长度字的值
    • 另一种在网络中常见的错误检测方式是周期性冗余检查(CRC, cyclic redundancy check):用哈希函数来检测多位错误
  • 错误纠正码(ECC, error-correction code)不仅能检测,还能纠正一些错误
    • 软件上的错误是能纠正的,硬件上的错误能被检测但不能被纠正

11.5 存储设备管理

  • 低层次结构(或 物理结构)把磁盘分成扇区,使得磁盘控制器能够读和写
    • 每个扇区能保存磁头信息、数据以及错误纠正码(ECC)
    • 通常数据512字节,但可选
  • 为了用磁盘保存文件,OS仍然需要在磁盘上记录自己的数据结构
    • 把磁盘分成一个或更多个柱面组,每个都被当成逻辑磁盘
    • 可以使用逻辑结构或者自己构造文件系统
    • 为了提升效率,大部分文件系统把块聚集成簇
      • 磁盘I/O在块里完成
      • 文件I/O在簇里完成
  • 根分区包含OS,其它分区可以包含其它OS、其它文件系统,或者原始分区(raw)
    • 在引导(boot)时挂载(mount)
    • 其它分区可以自动或手动挂载
  • 在挂载的时候,检查文件系统一致性
    • 所有元数据都正确吗?
      • 如果不正确,修复,再试一次
      • 如果正确,加入挂载表,允许访问
  • 引导块可以指向引导卷或引导加载程序块集,这些块包含足够的代码来知道如何从文件系统加载内核
    • 或者,对于多OS引导来说,用一个引导管理程序
  • 原始磁盘访问那些想自己进行块管理、不让操作系统碍事的应用程序(例如数据库)

  • 引导块初始化系统
    • 引导程序(bootstrap)存在ROM,固件中
    • 引导加载程序(bootstrap loader)存在引导分区的引导块中
  • 备用扇区等方法被用来处理坏块

11.6 交换空间管理

  • 用来从DRAM到辅助存储移动整个进程(交换),或页(分页),当DRAM不足以容纳所有进程时
  • OS提供交换空间管理
    • 辅助存储比DRAM慢,所有优化很重要
    • 通常可能有多个交换空间——降低在任何给定设备上的I/O负载
    • 最好是有专用设备
    • 交换空间的位置可以在原始分区或者文件系统中的一个文件
    • Linux用来交换的数据结构

11.7 存储附件

  • 计算机以三种方式访问存储
    • 主机附属
    • 网络附属

11.7.1 主机附属存储

  • 主机附属访问通过本地I/O端口,使用几种技术中的一种
    • 为了附属很多设备,用存储总线,例如USB、火线、雷电
    • 高端系统使用光纤通道(FC,fibre channel)
      • 高速串行架构使用光纤或铜缆
      • 多个主机和存储设备能连接到FC光纤

11.7.2 网络附属存储

  • 网络附属存储(NAS,network-attached storage)是通过网络而不是通过本地连接(如总线)提供的存储
    • 远程附属于文件系统
  • NFS和CIFS都是常见的协议
  • 远程过程调用(RPC)通过IP网络上的TCP或UDP承载
  • iSCSI准则用IP网络来承载SCSI准则
    • 远程附属于设备(块)

11.7.3 云存储

  • 和NAS相似,提供了通过网络的对存储的访问
    • 与NAS不同,通过Internet或WAN访问远程数据中心
  • NAS只是另一个文件系统,而云存储是基于API的,使用该API的程序可以提供访问权限
    • 例子包括Dropbox、Amazon S3、Microsoft OneDrive、Apple iCloud
    • 用API是因为存在延迟和故障情况(NAS协议不太好用)

11.7.4 存储区域网络和存储阵列

存储阵列:

  • 可以只附加磁盘或磁盘阵列
  • 避免了使用网络带宽的NAS的缺点
  • 存储阵列具有控制器,为连接的主机提供功能
    • 将主机连接到阵列的端口
    • 内存,控制软件(有时是NVRAM等)
    • 几千个磁盘
    • RAID,热备件,热插拔(稍后讨论)
    • 共享存储->提高效率
    • 一些文件系统中的功能
    • 快照,克隆,精简配置,复制, 重复数据删除等

11.8 RAID结构

  • RAID:廉价磁盘冗余阵列
    • 通过冗余,多个磁盘驱动器提供了可靠性
  • 提升了平均故障时间
  • 平均修复时间
  • 平均数据损失
  • 经常和NVRAM结合在一起来提升写的性能
  • 磁盘使用技术的一些改进包括使用多个协同工作的磁盘
  • 磁盘分条(striping)用一组磁盘作为一个存储单元
  • RAID分为六个不同级别
  • RAID方案通过存储冗余数据来提高性能并提高存储系统的可靠性
    • 镜像(mirroring)或阴影(shadowing)(RAID 1)保留了每个磁盘的副本
    • 条纹镜像(striped mirrors)(RAID 1 + 0)或镜像条纹(mirrored stripes)(RAID 0 + 1)提供了高性能和高可靠性
    • 块交错奇偶校验(block interleaved parity)(RAID 4,5,6)使用的冗余少得多
  • 如果阵列故障了,阵列中存储的RAID仍然可能发生故障,因此阵列之间自动复制数据很常见
  • 经常有少量的热备用磁盘未分配,从而能够自动替换发生故障的磁盘并在其上重建数据

其他特点:

  • 无论RAID应用在哪里,都能增加一些有用的特点
  • 快照是在进行一组更改之前文件系统的视图
    • 详见Chap 12
  • replication是在不同站点之间自动复制写入
    • 为了冗余和灾难恢复
    • 可以同步也可以异步
  • 如果磁盘无法替换发生故障的磁盘并在可能的情况下重建RAID集,RAID会自动使用热备份磁盘
    • 降低了平均修复时间

扩展:

  • 单独使用RAID并不能防止或者检测数据损坏或其他错误
  • Solaris ZFS加入了所有数据和元数据的检查和
  • 见车和保存了指向对象的指针,来检测对象是不是对的那个,以及它变了没
  • 可以检测和纠正数据、元数据损坏
  • ZFS还移除卷和分区
    • 磁盘在缓冲池里被分配
    • 具有池的文件系统共享该池,以使用和释放空间,例如malloc()和free()这样的内存分配/释放调用

对象存储:

  • 通用计算,文件系统不足以实现超大规模
  • 另一种方法:从存储池开始,然后在其中放置对象
    • 对象只是一个数据容器
    • 无法导航这个池以查找对象(目录结构,服务很少)
    • 面向计算机而非面向用户
  • 典型顺序
    • 在池中创建对象,接收对象ID
    • 通过该ID访问对象
    • 通过该ID删除对象
  • 诸如Hadoop文件系统(HDFS)和Ceph之类的对象存储管理软件哪里存储对象,管理数据保护
    • 通常,保存N个副本,横跨N各系统,在对象存储簇中
    • 水平扩展
    • 内容可寻址,非结构化