07

磁盘

I/O设备

阅读量:3 · 预计 20 分钟读完

磁盘调度RAIDSSD
阅读进度4%

第七章 磁盘

导读

磁盘(Disk)是计算机系统中最重要的持久化存储设备。尽管固态硬盘(SSD)正在快速普及,传统机械硬盘(HDD)仍然在大容量存储领域占据重要地位。理解磁盘的工作原理、性能特性和优化策略,对于设计高效的存储系统、优化I/O密集型应用至关重要。

本章将系统介绍磁盘硬件的基本结构、磁盘调度算法、磁盘性能分析、SSD与闪存技术、以及RAID等高级存储技术。我们将从物理层面理解磁盘如何存储数据,分析影响磁盘性能的关键因素,探讨如何通过调度和缓存优化I/O性能,最后介绍现代存储系统的前沿技术。


7.1 磁盘硬件

7.1.1 机械硬盘(HDD)的结构

机械硬盘由以下主要部件组成:

盘片(Platter)

  • 圆盘形的磁性存储介质,两面都可以存储数据。
  • 一个硬盘可以包含多个盘片,堆叠在同一主轴上。
  • 盘片以恒定速度旋转(常见转速:5400RPM、7200RPM、10000RPM、15000RPM)。

磁头(Head)

  • 读写数据的电磁装置。
  • 每个盘片的两面各有一个磁头。
  • 磁头悬浮在盘片上方极小的距离(约几纳米),不接触盘片表面。

磁道(Track)

  • 盘片上的同心圆环,每个磁道存储一圈数据。
  • 盘片从外到内有数千个磁道。

扇区(Sector)

  • 磁道被划分为多个扇区,每个扇区是磁盘读写的基本单位。
  • 传统扇区大小为512字节,现代硬盘使用4KB扇区(Advanced Format)。
  • 每个扇区包含:同步标记、地址标记、数据区、ECC校验区。

柱面(Cylinder)

  • 所有盘片上相同半径的磁道组成一个柱面。
  • 柱面是磁盘调度的重要概念——访问同一柱面的不同磁道不需要移动磁头。

磁头臂(Actuator Arm)

  • 连接所有磁头的机械臂,负责在盘片径向上移动磁头。
  • 磁头臂的移动称为"寻道"(Seek),是磁盘访问中最耗时的操作之一。

7.1.2 磁盘访问的时间组成

一次磁盘I/O操作的总时间由以下部分组成:

寻道时间(Seek Time)

  • 磁头臂移动到目标磁道所需的时间。
  • 典型值:平均3-15毫秒,取决于起始和目标磁道的距离。
  • 是磁盘访问中最耗时的部分。

旋转延迟(Rotational Latency)

  • 盘片旋转,使目标扇区到达磁头下方所需的时间。
  • 平均旋转延迟 = 旋转一圈时间 / 2。
  • 7200RPM硬盘:60/7200 = 8.33毫秒/圈,平均延迟约4.17毫秒。

传输时间(Transfer Time)

  • 数据从磁盘传输到内存的时间。
  • 取决于数据量和磁盘转速。
  • 通常远小于寻道时间和旋转延迟。

总访问时间 = 寻道时间 + 旋转延迟 + 传输时间

对于典型的7200RPM硬盘,一次随机I/O的平均访问时间约为8-12毫秒。

7.1.3 磁盘容量计算

磁盘容量 = 盘片数 × 每盘片面数 × 每面磁道数 × 每磁道扇区数 × 每扇区字节数

例如:

  • 4个盘片(8个面)
  • 每面20000个磁道
  • 每磁道1000个扇区
  • 每扇区512字节

容量 = 4 × 2 × 20000 × 1000 × 512 = 8,192,000,000,000 字节 ≈ 8TB

7.1.4 磁盘接口

SATA(Serial ATA)

  • 消费级硬盘的主流接口。
  • SATA III:最大传输速率6Gbps。
  • 支持热插拔、NCQ(Native Command Queuing)。

SAS(Serial Attached SCSI)

  • 企业级硬盘接口。
  • 更高的可靠性和性能。
  • 支持全双工通信。

NVMe(Non-Volatile Memory Express)

  • 专为SSD设计的高速接口。
  • 基于PCIe总线,延迟极低。
  • 支持大规模并行队列。

7.2 磁盘调度

7.2.1 磁盘调度的必要性

磁盘I/O请求到达的速度可能超过磁盘处理的速度,形成I/O队列。磁盘调度算法决定队列中请求的执行顺序,目标是:

  • 最小化平均寻道时间。
  • 最大化磁盘吞吐量。
  • 保证公平性(避免某些请求长期等待)。

7.2.2 FCFS(先来先服务)

按请求到达的顺序依次执行。

优点:公平、简单。

缺点:性能差——磁头可能在盘片上来回移动("之字形"运动),寻道时间很长。

示例:磁头当前位置在柱面50,请求队列为:[82, 170, 43, 140, 10, 76]

FCFS执行顺序:50 → 82 → 170 → 43 → 140 → 10 → 76

总移动距离:32 + 88 + 127 + 97 + 130 + 66 = 540 柱面

7.2.3 SSTF(最短寻道时间优先)

选择距离当前磁头位置最近的请求优先执行。

优点:减少平均寻道时间,提高吞吐量。

缺点:可能导致远端请求饥饿。

示例:磁头当前位置在柱面50,请求队列为:[82, 170, 43, 140, 10, 76]

SSTF执行顺序:50 → 43 → 10 → 76 → 82 → 140 → 170

总移动距离:7 + 33 + 66 + 6 + 58 + 30 = 200 柱面

7.2.4 SCAN(电梯算法)

磁头从盘片一端(最内圈)移动到另一端(最外圈),途中服务经过的请求。到达端点后反向移动,继续服务请求。

优点:避免饥饿,提供较均匀的等待时间。

缺点:刚经过的请求需要等待磁头到达另一端再返回。

示例:磁头当前位置在柱面50,向外移动,请求队列为:[82, 170, 43, 140, 10, 76]

SCAN执行顺序:50 → 76 → 82 → 140 → 170 → 43 → 10

总移动距离:26 + 6 + 58 + 30 + 127 + 33 = 280 柱面

7.2.5 C-SCAN(循环扫描)

类似SCAN,但磁头只在一个方向(从内到外)服务请求。到达最外圈后,磁头快速返回最内圈,不服务返回途中的请求。

优点:提供更均匀的等待时间(所有请求都在同一方向被服务)。

缺点:返回时不服务请求,可能降低吞吐量。

7.2.6 LOOK 和 C-LOOK

LOOK是SCAN的优化版本:磁头不需要到达盘片端点才转向,而是在没有更多请求的方向上立即转向。C-LOOK是C-SCAN的优化版本,原理类似。

优点:减少不必要的移动,提高效率。

7.2.7 调度算法的比较

算法吞吐量公平性实现复杂度
FCFS
SSTF
SCAN
C-SCAN
LOOK

现代操作系统通常使用更复杂的调度算法,如Linux的CFQ(Completely Fair Queuing)或BFQ(Budget Fair Queuing),在性能和公平性之间取得平衡。


7.3 磁盘性能

7.3.1 顺序I/O vs 随机I/O

顺序I/O:连续访问相邻的磁盘块。

  • 寻道时间短(磁头移动距离小)。
  • 传输时间占比大。
  • 性能接近磁盘的最大传输速率。

随机I/O:访问分散的磁盘块。

  • 寻道时间长(磁头需要大幅移动)。
  • 寻道时间占比大。
  • 性能远低于磁盘的最大传输速率。

示例(7200RPM硬盘):

  • 顺序读取1GB:约150MB/s,耗时约7秒。
  • 随机读取1GB(4KB块,1MB间隔):约100 IOPS,耗时约3小时。

顺序I/O和随机I/O的性能差距可达数百倍。这是磁盘性能优化的核心挑战。

7.3.2 IOPS(I/O Operations Per Second)

IOPS衡量磁盘每秒能处理的I/O操作次数,是评估磁盘性能的重要指标。

典型IOPS值:

  • 7200RPM HDD:约75-100 IOPS(随机4KB读)
  • 15000RPM HDD:约175-210 IOPS
  • SATA SSD:约50,000-100,000 IOPS
  • NVMe SSD:约500,000-1,000,000 IOPS

7.3.3 带宽(Bandwidth)

带宽衡量磁盘每秒能传输的数据量(MB/s),适用于顺序I/O场景。

典型带宽值:

  • 7200RPM HDD:约100-200 MB/s
  • SATA SSD:约500-550 MB/s
  • NVMe SSD:约3000-7000 MB/s

7.3.4 影响磁盘性能的因素

队列深度(Queue Depth):同时排队的I/O请求数量。适当的队列深度可以让调度算法优化请求顺序,提高性能。

I/O大小:大块I/O的带宽更高,小块I/O的IOPS更高。

读写比例:读操作通常比写操作快(写操作可能需要额外的元数据更新和日志写入)。

数据局部性:良好的局部性可以减少寻道时间。

磁盘碎片:文件碎片化会增加随机I/O。


7.4 SSD与闪存

7.4.1 闪存的基本原理

闪存(Flash Memory)是一种非易失性存储技术,断电后数据不会丢失。闪存的基本存储单元是浮栅晶体管(Floating Gate Transistor),通过捕获电子来存储数据。

NAND闪存的层次结构

  • 单元(Cell):存储1位或多位数据。
  • 页(Page):闪存读写的基本单位,通常为4KB-16KB。
  • 块(Block):闪存擦除的基本单位,通常为128KB-512KB(包含多个页)。

闪存的特性

  • 读操作:以页为单位,速度快。
  • 写操作:以页为单位,但只能写入空白页。
  • 擦除操作:以块为单位,速度慢,且有寿命限制。

7.4.2 SSD的结构

SSD(Solid State Drive)由以下主要部件组成:

闪存芯片

  • 存储数据的NAND闪存。
  • 多个芯片并行工作,提高带宽。

闪存转换层(FTL, Flash Translation Layer)

  • SSD的"固件",管理闪存的读写和擦除。
  • 实现逻辑块地址(LBA)到物理页地址的映射。
  • 处理磨损均衡(Wear Leveling)、垃圾回收(Garbage Collection)等。

缓存(DRAM Cache)

  • 存储FTL映射表和临时数据。
  • 提高随机读写性能。

主控芯片(Controller)

  • 执行FTL算法、ECC校验、加密等。
  • 是SSD性能的关键因素。

7.4.3 SSD vs HDD

特性HDDSSD
寻道时间3-15ms~0.1ms
随机读IOPS75-20050K-1M
顺序读带宽100-200MB/s500-7000MB/s
功耗6-15W2-5W
噪音
抗震性
价格/GB
寿命有限(写入次数)

7.4.4 磨损均衡(Wear Leveling)

闪存的每个块有有限的擦除次数(SLC约10万次,MLC约1万次,TLC约1000次)。如果不加管理,频繁写入的块会很快损坏。

磨损均衡算法将写入均匀分布到所有块上,延长SSD寿命:

  • 动态磨损均衡:只在新写入的数据之间均衡。
  • 静态磨损均衡:将冷数据(不常修改的数据)迁移,使所有块的擦除次数均衡。

7.4.5 垃圾回收(Garbage Collection)

由于闪存只能写入空白页,当需要修改数据时,SSD需要将整个块的有效页复制到新块,然后擦除旧块。这个过程称为垃圾回收。

垃圾回收的开销(写放大,Write Amplification):

  • 用户写入1页数据,可能需要复制多页有效数据。
  • 写放大 = 实际写入闪存的页数 / 用户请求写入的页数。
  • 写放大会降低SSD性能和寿命。

7.4.6 TRIM命令

TRIM命令允许操作系统通知SSD哪些逻辑块不再使用。SSD可以在垃圾回收时跳过这些块,减少写放大,提高性能。

bash
# 在Linux中启用TRIM
fstrim -v /

# 或设置定时TRIM
systemctl enable fstrim.timer

7.5 RAID

7.5.1 RAID的概念

RAID(Redundant Array of Independent Disks,独立磁盘冗余阵列)是一种将多个物理磁盘组合成一个逻辑磁盘的技术,目标是提高性能、可靠性或两者兼顾。

7.5.2 RAID级别

RAID 0(条带化,Striping)

  • 数据分散存储在多个磁盘上。
  • 优点:提高读写性能(并行访问)。
  • 缺点:无冗余,任一磁盘故障数据全部丢失。
  • 适用场景:高性能、非关键数据。

RAID 1(镜像,Mirroring)

  • 数据同时写入两个磁盘,互为备份。
  • 优点:高可靠性,读性能提升。
  • 缺点:写性能略降,磁盘利用率50%。
  • 适用场景:关键数据、高可靠性需求。

RAID 5(条带化+分布式奇偶校验)

  • 数据和奇偶校验分散存储在所有磁盘上。
  • 允许任一一个磁盘故障而不丢失数据。
  • 优点:读性能好,磁盘利用率高((n-1)/n)。
  • 缺点:写性能较差(需要计算和更新奇偶校验),重建时间长。
  • 适用场景:平衡性能和可靠性。

RAID 6(条带化+双奇偶校验)

  • 类似RAID 5,但使用两个独立的奇偶校验。
  • 允许任意两个磁盘同时故障。
  • 优点:更高的可靠性。
  • 缺点:写性能更差,磁盘利用率较低((n-2)/n)。
  • 适用场景:大容量存储、高可靠性需求。

RAID 10(RAID 1+0)

  • 先镜像再条带化。
  • 结合了RAID 1的可靠性和RAID 0的性能。
  • 优点:高性能、高可靠性。
  • 缺点:磁盘利用率50%。
  • 适用场景:数据库、高性能关键应用。

7.5.3 RAID的性能分析

读性能

  • RAID 0/5/6/10:多个磁盘并行读取,性能接近单盘的N倍(N为磁盘数)。
  • RAID 1:读性能提升(可以从任一镜像盘读取)。

写性能

  • RAID 0:写性能提升(并行写入)。
  • RAID 1:写性能略降(需要写入两个盘)。
  • RAID 5/6:写性能下降(需要读取旧数据和奇偶校验,计算新奇偶校验,写入新数据和奇偶校验——"读-修改-写"循环)。

7.5.4 软件RAID vs 硬件RAID

软件RAID

  • 由操作系统实现(如Linux的mdadm)。
  • 优点:成本低、灵活。
  • 缺点:占用CPU资源。

硬件RAID

  • 由专用RAID控制器实现。
  • 优点:不占用CPU、性能更好、有缓存。
  • 缺点:成本高、与硬件绑定。

7.6 磁盘错误与可靠性

7.6.1 磁盘错误类型

可恢复错误(Recoverable Error)

  • 由介质缺陷或信号干扰引起。
  • 通过ECC(Error Correction Code)可以纠正。
  • 现代磁盘可以纠正多位错误。

不可恢复错误(Unrecoverable Error)

  • 介质损坏严重,ECC无法纠正。
  • 通常通过冗余(RAID)恢复数据。
  • 不可恢复读取错误率(URE):通常每10^14位读取发生一次。

7.6.2 磁盘故障模型

年故障率(AFR, Annualized Failure Rate)

  • 硬盘在一年内的故障概率。
  • 典型值:消费级硬盘1-3%,企业级硬盘0.5-1%。

MTBF(Mean Time Between Failures)

  • 平均无故障时间。
  • 企业级硬盘:通常200万小时以上。

浴盆曲线(Bathtub Curve)

  • 硬盘故障率随时间的变化:早期故障率高(制造缺陷)→ 稳定期故障率低 → 磨损期故障率升高。

7.6.3 数据完整性保护

校验和(Checksum)

  • 为每个数据块计算校验和,读取时验证。
  • 可以检测数据损坏(Silent Data Corruption)。

ZFS和Btrfs

  • 现代文件系统内置数据完整性保护。
  • 每次写入都计算校验和,读取时验证。
  • 发现损坏时可以从冗余副本自动修复。

S.M.A.R.T.

  • Self-Monitoring, Analysis and Reporting Technology。
  • 硬盘内置的监控机制,跟踪各种健康指标。
  • 可以预测潜在故障,提前备份数据。
bash
# 查看硬盘S.M.A.R.T.信息
smartctl -a /dev/sda

# 运行短自检
smartctl -t short /dev/sda

# 运行长自检
smartctl -t long /dev/sda

7.7 新型存储技术

7.7.1 计算存储(Computational Storage)

计算存储将计算能力嵌入存储设备中,在存储端完成数据处理(如压缩、加密、过滤、排序),减少主机与存储之间的数据传输。

优势:

  • 减少主机CPU负载。
  • 减少数据传输延迟。
  • 提高整体系统效率。

7.7.2 持久内存(Persistent Memory)

持久内存(如Intel Optane DC Persistent Memory)介于DRAM和SSD之间:

  • 容量大(可达TB级)。
  • 字节可寻址(像内存一样访问)。
  • 数据持久化(断电不丢失)。
  • 延迟低于SSD,高于DRAM。

持久内存可以通过内存映射(mmap)直接访问,为程序设计带来新的可能性。

7.7.3 存储类内存(Storage Class Memory, SCM)

SCM是一类新兴的非易失性存储技术,目标是填补DRAM和NAND闪存之间的性能和成本差距。候选技术包括:

  • 相变内存(PCM, Phase Change Memory)
  • 磁阻内存(MRAM, Magnetoresistive RAM)
  • 电阻内存(ReRAM, Resistive RAM)

这些技术具有接近DRAM的速度和非易失性,可能在未来改变存储层次结构。


7.8 常见误区

误区一:SSD不需要碎片整理

SSD确实不需要传统意义上的碎片整理(因为寻道时间几乎为零),但过度的碎片化仍然会增加FTL映射表的复杂度和垃圾回收的开销。不过,现代SSD的FTL已经能够很好地处理碎片化问题,通常不需要手动整理。

误区二:RAID可以替代备份

RAID提供的是冗余而非备份。RAID可以防止磁盘故障导致的数据丢失,但无法防止以下情况:

  • 文件被误删除(所有副本同时被删除)。
  • 文件系统损坏(影响所有磁盘)。
  • 恶意软件攻击(所有副本被加密或破坏)。
  • 自然灾害(所有设备同时损坏)。

因此,RAID不能替代定期备份。

误区三:磁盘缓存越大性能一定越好

磁盘缓存可以加速频繁访问的数据,但缓存大小不是性能的唯一决定因素。缓存管理算法、缓存替换策略、I/O模式等因素同样重要。在某些场景下(如大数据顺序扫描),大缓存的利用率反而很低。

误区四:7200RPM硬盘一定比5400RPM快

转速只是影响磁盘性能的因素之一。缓存大小、记录密度、接口速度、固件优化等都会影响实际性能。在某些场景下(如大容量顺序读取),5400RPM的高密度硬盘可能比7200RPM的低密度硬盘更快。

误区五:SSD的寿命很短,不适合长期使用

现代SSD的写入寿命已经非常长。以典型的消费级SSD为例,其TBW(Total Bytes Written)通常在150-600TBW之间。即使每天写入100GB数据,也可以使用4-16年。对于大多数用户来说,SSD的寿命不是问题。


7.9 实践应用

7.9.1 查看磁盘信息

bash
# 查看磁盘基本信息
lsblk

# 查看磁盘详细参数
hdparm -I /dev/sda

# 查看磁盘SMART信息
smartctl -a /dev/sda

# 查看磁盘性能
hdparm -Tt /dev/sda

7.9.2 磁盘性能测试

bash
# 使用fio进行随机读测试
fio --name=randread --ioengine=libaio --iodepth=32 \
    --rw=randread --bs=4k --direct=1 --size=1G \
    --numjobs=4 --runtime=60 --group_reporting

# 使用fio进行顺序写测试
fio --name=seqwrite --ioengine=libaio --iodepth=1 \
    --rw=write --bs=1m --direct=1 --size=1G \
    --numjobs=1 --runtime=60 --group_reporting

# 使用fio进行混合随机读写测试(70%读/30%写)
fio --name=randrw --ioengine=libaio --iodepth=32 \
    --rw=randrw --rwmixread=70 --bs=4k --direct=1 \
    --size=1G --numjobs=4 --runtime=60 --group_reporting

7.9.3 磁盘调度算法查看与切换

bash
# 查看当前调度算法
cat /sys/block/sda/queue/scheduler

# 切换调度算法
echo mq-deadline > /sys/block/sda/queue/scheduler

# 永久设置(在GRUB中添加内核参数)
# elevator=mq-deadline

7.9.4 磁盘健康监控

bash
# 安装smartmontools
apt install smartmontools

# 查看磁盘健康状态
smartctl -H /dev/sda

# 查看错误日志
smartctl -l error /dev/sda

# 运行自检
smartctl -t short /dev/sda
smartctl -l selftest /dev/sda

7.9.5 优化I/O性能

c
// 使用O_DIRECT绕过页面缓存进行直接I/O
int fd = open("data.bin", O_RDONLY | O_DIRECT);

// 使用posix_fadvise提示内核访问模式
posix_fadvise(fd, 0, 0, POSIX_FADV_SEQUENTIAL);  // 顺序访问
posix_fadvise(fd, 0, 0, POSIX_FADV_RANDOM);       // 随机访问
posix_fadvise(fd, 0, 0, POSIX_FADV_WILLNEED);     // 即将访问

// 使用mmap进行高效文件访问
void *mapped = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0);
madvise(mapped, size, MADV_SEQUENTIAL);

7.10 本章小结

本章系统介绍了磁盘硬件和存储技术,主要内容包括:

磁盘硬件:机械硬盘由盘片、磁头、磁道、扇区、柱面等部件组成。磁盘访问时间由寻道时间、旋转延迟和传输时间三部分组成。

磁盘调度:FCFS、SSTF、SCAN、C-SCAN、LOOK等算法优化I/O请求的执行顺序,减少寻道时间,提高吞吐量。

磁盘性能:顺序I/O和随机I/O性能差距巨大。IOPS和带宽是衡量磁盘性能的关键指标。

SSD与闪存:SSD使用NAND闪存,通过FTL管理磨损均衡和垃圾回收。SSD在随机I/O性能上远超HDD,但价格更高、写入寿命有限。

RAID:通过多个磁盘的组合提高性能(RAID 0)、可靠性(RAID 1)或两者兼顾(RAID 5/6/10)。

磁盘错误与可靠性:ECC纠错、S.M.A.R.T.监控、校验和等技术保证数据完整性。

新型存储技术:计算存储、持久内存、存储类内存等新兴技术正在改变存储层次结构。

磁盘是计算机系统中最重要的持久化存储设备。深入理解磁盘的工作原理和性能特性,对于设计高效的存储系统和优化I/O密集型应用至关重要。