物理存储系统¶
存储级别¶
物理存储按照对通电的需求可以分为:
- 易失性存储 (volatile storage),断电后数据会丢失,如缓存、内存
- 非易失性存储 (non-volatile storage),断电后数据不会丢失,如闪存、磁盘、光盘和磁带
存储级别 (Storage Hierarchy) 从上到下依次为:
- 一级存储 (primary storage),从上到下依次为缓存 (cache) 和内存 (main memory)
- 二级存储 (secondary/on-line storage),从上到下依次为闪存 (flash memory) 和磁盘 (magnetic disk)
- 三级存储 (tertiary/off-line storage),从上到下依次为光盘 (optical disk) 和磁带 (magnetic tape)
这些存储介质从上到下速度逐渐变慢,容量逐渐变大,价格逐渐变低。
磁盘¶
磁盘结构¶
磁盘由一个或多个盘片 (platter) 组成,每个盘片被划分为若干个同心圆的磁道 (track),每个磁道被划分为若干个扇区 (sector)。磁盘的容量由磁道数、每个磁道的扇区数和每个扇区的大小决定。一般来说,每个扇区的大小是 512 字节。
盘片上的数据通过磁头 (head) 进行读写,磁头可以移动到盘片的任意位置。当要读写一个扇区时,磁头会移动到该扇区所在的磁道,然后等待该扇区旋转到磁头下方。
为了实现并行读写,磁盘会让多个盘片堆叠在同一个轴 (spindle) 上,每个盘片有一个磁头,这些磁头共用一个机械臂 (arm assembly)。这样,磁盘可以同时读写多个盘片上的数据。
磁盘控制器 (disk controller) 是磁盘和计算机系统之间的接口和硬件驱动,接受高级命令来读写扇区,执行诸如移动磁头、读写数据等操作。磁盘控制器会为每个扇区计算并附加校验和,以验证数据是否正确读取。如果数据损坏,存储的校验和会与重新计算的校验和不匹配。磁盘控制器在写入后会读取扇区,以确保写入成功。磁盘控制器还会对坏扇区进行重新映射。
磁盘性能¶
访问时间 (access time) 是磁盘读写一个扇区所需的时间,包括:
- 寻道时间 (seek time):磁头移动到目标磁道所需的时间,平均寻道时间是最坏寻道时间的一半,一般是 4-10ms
- 旋转延迟 (rotational latency):等待目标扇区旋转到磁头下方所需的时间,平均旋转延迟是最坏情况下的一半,一般是 4-11ms
数据传输速率 (Data-transfer rate) 是磁盘读写数据的速度,一般是 25-100 MB/s。
为了提高磁盘性能,在读写时会以磁盘块 (disk block) 为单位,磁盘块是一个逻辑存储单元,一般是 4-16KB。磁盘块大小的选择需要权衡读写性能和空间利用率。
当以顺序访问模式 (Sequential access pattern) 读写数据时,磁盘性能会更好,因为只需要进行一次寻道。而以随机访问模式 (Random access pattern) 读写数据时,每次读写都需要进行寻道,性能会更差。
每秒 I/O 操作数 (I/O operations per second, IOPS) 是另一个衡量磁盘性能的指标,表示磁盘每秒能够支持的随机块读取次数。当前磁盘的 IOPS 一般在 50-200 之间。
磁盘的平均故障时间 (Mean time to failure, MTTF) 是磁盘在没有任何故障的情况下预计能够连续运行的平均时间,一般是 3-5 年。新磁盘的故障概率非常低,但随着磁盘的老化,MTTF 会降低。
磁盘块访问优化¶
为了优化磁盘块的访问,可以采取以下措施:
- 缓冲 (Buffering):使用内存缓冲区缓存磁盘块,减少磁盘读写次数
- 预读 (Read-ahead):预读取磁盘块,以便在未来可能被请求时能够更快地访问
- 磁盘臂调度算法 (Disk-arm-scheduling algorithms):重新排序块请求,以减少磁盘臂的移动
- 文件组织 (File organization):尽可能连续地分配文件块,以减少磁盘碎片化。一些系统会定期整理文件系统,减少碎片,以加快文件访问速度
- 非易失性写缓存 (Nonvolatile write buffers):将块先写入非易失性 RAM 缓冲区中,比如说闪存,即使断电也不会丢失数据。当磁盘没有其他请求或者请求已经等待一段时间后,再将数据写入磁盘。这样可以加快写入速度,同时数据库操作可以在数据写入磁盘之前继续进行,此外还可以在写入磁盘时重新排序写入请求,减少磁盘臂的移动
- 日志磁盘 (Log disk):只会顺序写入一系列更新日志,不需要进行寻道,写入速度非常快
闪存¶
NAND 闪存是一种广泛用于存储的闪存,比 NOR 闪存便宜。NAND 闪存需要以页为单位进行读取,页的大小一般是 512 字节到 4 KB。NAND 闪存的顺序读取和随机读取性能差异不大。每个页只能写入一次,必须擦除后才能重新写入。
SSD (Solid State Disks) 就是使用 NAND 闪存的硬盘。SSD 使用标准的面向块的磁盘接口,但在内部使用多个闪存存储设备存储数据。
擦除操作以擦除块为单位进行,擦除块的大小一般是 256 KB 到 1 MB (128 到 256 页),一般需要 2 到 5 毫秒。这时可以通过从逻辑页地址到物理页地址的重新映射来避免等待擦除,由闪存翻译表 (Flash translation table) 来跟踪映射。
擦除块通常在 100,000 到 1,000,000 次擦除后会变得不可靠,无法再使用。磨损均衡 (Wear leveling) 可以使擦除操作均匀分布在物理块上,从而避免某些块过快损坏。