存储层次结构

现代计算机存储具有高度层次化的结构。它由不同速度和大小的多个缓存层(cache layer)组成,其中高层通常存储低层中最常访问的数据以减少延迟:每高一层通常都要快一个数量级,但也会更小和/或更贵。

抽象来说,各类存储设备可以被描述为这样的模块:具有一定存储容量MM,并且可以一次读写尺寸为B的数据块(而非单个字节!),每次读写在固定的时间内来完成。

从这个角度看,各种类型的内存都有一些重要的特性:

  • 总大小(total size)MM
  • 数据块大小(block size)BB
  • 延迟(latency),即获取一个字节需要多少时间;
  • 带宽(bandwidth),可能高于单纯用数据块大小乘以延迟时间,这意味着I/O操作可能有重叠;
  • 摊销成本,包括芯片的价格、功耗、维护等。

下面是2021年的消费级硬件的大致对比表:

Type M B Latency Bandwidth $/GB/mo1^1
L1 10K 64B 2ns 80G/s -
L2 100K 64B 5ns 40G/s -
L3 1M/core 64B 20ns 20G/s -
RAM GBs 64B 100ns 10G/s 1.5
SSD TBs 4K 0.1ms 5G/s 0.17
HDD TBs - 10ms 1G/s 0.04
S3 - 150ms 0.022^2

事实上,每种类型的存储都有各自的特点,我们会大致介绍一遍。

易失性存储器

RAM层级以上的存储都被称为易失性存储器(volatile memory),因为在出现断电和其他故障时,它不会持久保存数据。但它的速度很快,这也是为什么在计算机上电时用它来存储临时数据。

从快到慢:

  • CPU寄存器,这是CPU用来储存其所有中间值的零耗时数据访问单元,也可以理解为一种存储类型。它们的数量有限(例如,只有16个“通用”寄存器),在某些情况下,出于性能原因你可能想要使用所有的寄存器。
  • CPU缓存,现代CPU拥有多层缓存(L1,L2,通常是L3,很少有L4)。最低层是核心之间共享的,通常与核心的数量成比例(例如,一个10核心的CPU应该有大约10M的L3缓存)。
  • 随机访问内存(RAM,random access memory),是第一种可扩展的内存类型:现在,你可以在公有云上租用带0.5T RAM的机器。这是你大部分的工作数据应该储存的地方。

CPU缓存系统有一个重要的概念——缓存行(chche line),这是CPU和RAM之间进行数据传输的基本单元。在大多数架构上,缓存行的大小是64字节,这意味着所有主内存都被划分为64字节的块,无论你是否需要,只要你请求(读取或写入)一个字节,你也会获取它所有的63个缓存行“邻居”。

CPU级别的缓存操作会根据缓存行的最后访问时间自动完成。被访问时,缓存行的内容会被放置在最低的缓存层(L1),然后被逐渐“驱逐”到更高的级别,除非在短时间内被再次访问。程序员无法显式地控制这个过程,但是深入了解其工作原理是非常有价值的,我们会在下一章中详细讨论。

非易失性存储器

CPU缓存和RAM中的数据单元只地储存了少量的电子(这些电子会周期性地泄露并需要周期性地刷新),而非易失性存储(non-volatile memory)类型中的数据单元却储存了数百个电子。这让数据能在断电的情况下长期保持,但代价是性能和耐用性——因为当你有更多的电子时,它们与硅原子碰撞的机会也就更多。

有许多方法可以持久地储存数据,但从程序员的角度看,以下是主要的:

  • 固态硬盘(SSD,solid state drives)。这些硬盘的延迟相对较低,大约为0.1毫秒(10510^5纳秒),但它们的价格也相对较高,特别是考虑到每个数据单元只能被写入有限的次数,因此它们的寿命有限。这是移动设备和大多数笔记本电脑使用的硬盘,因为SSD结构紧凑,没有活动部件(更耐摔)。
  • 机械硬盘(HDD,Hard disk drives)很特别,因为它们实际上是旋转的物理磁盘,磁头附着在上面。要读取一个存储位置,你需要等待磁盘旋转到正确的位置,然后非常精确地移动磁头到那个位置。这就导致一些非常奇特的访问模式,例如随机读取一个字节可能需要与读取接下来的1MB数据相同的时间 —— 这通常在毫秒级别。由于机械硬盘是计算机中唯一一个有机械运动部件的部分(除了冷却系统外),因此机械硬盘经常出故障(数据中心的HDD平均寿命约为3年)。
  • 网络附加存储(Network-attached storage),这是利用其他网络设备进行数据存储的做法。主要有两种类型。第一种是网络文件系统(Network File System,NFS),这是一种通过网络挂载另一台计算机的文件系统的协议。另一种是基于API的分布式存储系统,最著名的是Amazon S3,它们由公共云的一群做过存储优化的机器支持,内部通常使用便宜的HDD或一些更特化的存储类型。虽然位于同一数据中心的NFS有时甚至可以比HDD工作得更快,但存储在公共云中的对象通常具有50-100毫秒的延迟。这些存储系统通常会采用分布式并进行数据复制,以提高数据的可用性。

SSD和HDD的速度显著低于RAM,因此通常将这个级别及以下的所有存储设备称为外部存储(external memory)。

与CPU缓存不同,外部存储可以被显式控制,这在许多情况下是有用的。然而,大部分程序员更愿意对其进行抽象处理,将其作为主内存的扩展使用。操作系统通过虚拟内存的方式能够实现这种抽象化,用户可以像操作内存一样直接操作这些外部存储,更简便地执行各种存储操作。

参考资料

  1. 价格信息取自Google Cloud Platform
  2. 云存储通常有多个价位,访问数据的频率越低,价格就越便宜。