try ai
科普
编辑
分享
反馈
  • 寻道时间和旋转延迟

寻道时间和旋转延迟

SciencePedia玻尔百科
核心要点
  • 总磁盘访问时间是寻道时间(磁头移动)、旋转延迟(盘片等待)和传输时间之和,其中两个机械延迟是主要的性能瓶颈。
  • 对于一个随机请求,平均旋转延迟是盘片旋转半圈的时间,但最坏情况下的系统设计必须考虑到完整一圈的延迟。
  • 诸如电梯算法、预读和请求合并等软件策略是关键的操作系统级优化,专门用于最大限度地减少机械磁盘延迟。
  • 像区域位记录(Zoned Bit Recording)和 4K 高级格式扇区(4K Advanced Format sectors)这样的物理磁盘特性会造成性能差异和潜在的性能惩罚(未对齐),软件必须对此加以考虑。
  • CPU(纳秒级)和 HDD(毫秒级)之间巨大的速度差异使得磁盘 I/O(例如在缺页期间)成为现代计算中最显著的性能悬崖之一。

引言

在数字世界中,数据为王,但访问数据是一个受制于无情运动定律的物理过程。几十年来,机械硬盘(HDD)一直是数据存储的主力,其性能由旋转的盘片和移动的执行器臂构成的机械芭蕾所决定。这场舞蹈的核心限制是寻道时间和旋转延迟——即移动磁头和等待数据旋转到位的耗时。理解这些概念不仅仅是一个硬件细节,它是解锁整个计算机系统性能的关键。

本文探讨了处理器所在的纳秒世界与机械硬盘所在的毫秒世界之间的根本性能差距。它揭示了软件工程师们几代以来一直在与之抗争的物理约束,展示了这些延迟如何形成一个塑造了现代计算的关键瓶颈。通过剖析这种“毫秒的暴政”,我们可以欣赏到为克服它而发展出的巧妙解决方案。

我们将展开一段分为两部分的旅程。首先,在“原理与机制”中,我们将探索寻道时间和旋转延迟背后的物理学和工程学,建立一个强大的模型来分析从平均情况到最坏情况的磁盘性能。然后,在“应用与跨学科联系”中,我们将看到这些物理现实如何向上传播,影响着从文件系统、操作系统调度器到应用程序架构乃至虚拟内存概念等方方面面的设计。

原理与机制

想象一下,你身处一个巨大的圆形图书馆,书架排列成同心圆环,而整个地板是一个不断旋转的转盘。你的任务是从一本特定的书中检索一句话。你会怎么做?首先,你必须从房间中心走到正确的书架环。然后,你必须站着等待旋转的转盘将正确的书架带到你面前。最后,一旦书在你面前,你打开它并阅读那句话。

这个小故事非常准确地比喻了机械硬盘(HDD)每次获取数据时所做的事情。这场机械之舞,一场由旋转盘片和抽动臂构成的芭蕾,受几个优美而基本的物理学原理支配。理解这场舞蹈不仅仅是一项学术练习,它是理解大部分数字世界性能的关键。这次检索的总时间,即​​访问时间​​ (taccesst_{\text{access}}taccess​),可以分解为三个主要部分:

  1. ​​寻道时间 (tseekt_{\text{seek}}tseek​):​​ 安装在执行器臂上的读写磁头从其当前位置移动到旋转盘片上正确的圆形路径,即​​磁道​​,所需的时间。这就是你走到正确书架环的过程。
  2. ​​旋转延迟 (trotationt_{\text{rotation}}trotation​):​​ 等待盘片旋转,使所需的数据块,即​​扇区​​,直接位于读写磁头下方所花费的时间。这就是你等待正确的书到来的过程。
  3. ​​传输时间 (ttransfert_{\text{transfer}}ttransfer​):​​ 当数据从磁头下流过时,实际从扇区读取数据所需的时间。这就是你从书中阅读句子的过程。

我们可以用简单的优雅来表达这种关系:

taccess=tseek+trotation+ttransfert_{\text{access}} = t_{\text{seek}} + t_{\text{rotation}} + t_{\text{transfer}}taccess​=tseek​+trotation​+ttransfer​

让我们来探究这些组成部分中的每一个,因为它们的细节中蕴含着关于物理学、工程学和优化艺术的迷人见解。

漫长的等待:理解延迟

此过程中两个最显著的延迟是机械延迟:寻道时间和旋转延迟。它们通常使实际的数据传输时间相形见绌,特别是对于小的、随机的请求。

​​寻道时间​​是移动磁头组件所需的时间。这不是一个单一的数字;它取决于臂需要移动多远。到相邻磁道的短距离跳跃可能不到一毫秒,而从最内圈磁道到最外圈磁道的“全程”寻道可能需要 151515 毫秒或更长时间。

​​旋转延迟​​则更有趣。一个典型的硬盘可能以 720072007200 转/分钟(RPM)的速度旋转。快速计算一下,我们可以得到一次完整旋转的时间:

Trev=60 seconds7200 revolutions≈8.33 millisecondsT_{\text{rev}} = \frac{60 \text{ seconds}}{7200 \text{ revolutions}} \approx 8.33 \text{ milliseconds}Trev​=7200 revolutions60 seconds​≈8.33 milliseconds

现在,在磁头到达正确的磁道之后,我们想要的数据在哪里?它可能即将到达,也可能刚刚过去。如果我们假设请求在随机时间到达,那么所需扇区的起始位置是完全不可预测的。它均匀地分布在圆的 360360360 度中的某个位置。那么,我们应该期望等待的平均时间是多少呢?

直觉可能会给出一个复杂的答案,但概率论给了我们一个极其简单的答案。如果在 000(数据立即就位)和 TrevT_{\text{rev}}Trev​(我们刚刚错过它,必须等待一整圈)之间的任何等待时间都是等可能的,那么平均等待时间就是半圈的时间。

E[trotation]=12TrevE[t_{\text{rotation}}] = \frac{1}{2} T_{\text{rev}}E[trotation​]=21​Trev​

对于我们这个 720072007200 RPM 的硬盘来说,这大约是 4.174.174.17 毫秒。这个单一而优雅的结果是磁盘性能分析的基石。它告诉我们,对于任何随机读取,我们平均要浪费超过 444 毫秒仅仅等待盘片旋转到位。当你将平均寻道时间(比如 8.58.58.5 毫秒)与这个平均旋转延迟结合起来时,总访问时间很快就攀升到两位数的毫秒级,这在计算领域是永恒般的时间。

但平均值可能具有欺骗性。如果你正在构建一个延迟是灾难性的系统呢?考虑一个发电厂的实时日志系统,它必须保证每个关键事件都在一个硬性的截止时间(比如 202020 毫秒)内写入磁盘。在这里,平均情况是无关紧要的;你必须为​​最坏情况​​做计划。最坏情况的寻道时间是制造商规定的最大值 (tseek,maxt_{\text{seek,max}}tseek,max​)。那么最坏情况的旋转延迟呢?它不是半圈,而是​​完整的一圈​​。你必须假设磁头在所需扇区刚刚经过的那一刻到达磁道,迫使其等待一整圈才能再次遇到。对于我们例子中的硬盘,最大寻道时间 151515 毫秒加上完整的旋转延迟 8.338.338.33 毫秒,总和超过了 232323 毫秒,悲剧性地错过了截止时间。这种平均情况和最坏情况性能之间的区别是工程学中一个至关重要的教训:正确的模型完全取决于你需要做出的承诺。

速度的地理学:为何位置很重要

盘片上的所有数据都是生而平等的吗?如果你在一个旋转的旋转木马上,你会知道站在外缘的朋友移动的距离要大得多——因此移动得也快得多——比站在中心附近的朋友快,尽管你们都在相同的时间内完成一圈。这是圆周运动物理学的直接结果,可以用简单的公式 v=ωrv = \omega rv=ωr 来描述,其中 vvv 是线速度,ω\omegaω 是恒定的角速度(RPM),rrr 是半径。

硬盘盘片的工作方式相同。它们以​​恒定角速度(CAV)​​旋转。这意味着外圈磁道物理上经过读写磁头的速度比内圈磁道快得多。如果我们在所有地方都以相同的物理间距封装数据位,那么磁头从外圈磁道每秒读取的位数将远远多于从内圈磁道读取的位数。对于一个外半径为 454545 毫米、内半径为 202020 毫米的硬盘,边缘的线速度——以及因此的数据传输率——将是中心附近的 2.252.252.25 倍!。

工程师们很聪明,他们不认为这是个问题,而是一个机会。为什么要浪费外缘所有那些宝贵的高速空间呢?这导致了​​区域位记录(ZBR)​​的发明。盘片被划分为同心区域,而不是在每个磁道上都有相同数量的扇区。外层区域,由于其周长更大,被填充了比内层区域更多的扇区。结果是整个盘片上的数据密度更加均匀,并且至关重要的是,传输速率分步变化:外缘最快,内芯最慢。

这提出了一个绝妙的问题:作为外部观察者,我们如何能绘制出这个秘密的区域地理图?我们可以通过一个聪明的实验来做到这一点!首先,我们会测量整个磁盘的持续顺序读取速度,从第一个逻辑块到最后一个。这将揭示一个性能的“阶梯”曲线,每一步对应一个不同的区域。在绘制出区域边界后,我们可以测试一个更微妙的假设:寻道时间本身在跨越区域边界时是否会改变?也许驱动器的电子设备需要一点时间来为不同的数据速率和磁道间距重新校准。通过仔细测量数千次相同长度的随机寻道——一些停留在区域内,另一些跨越边界——并使用统计分析从旋转延迟的噪声中分离出微小的时间差异,我们可以科学地验证这种效应。这个绘制和有针对性测量的两阶段过程是一个美丽的例子,说明了我们如何利用精心的实验来逆向工程我们日常使用的设备的复杂内部运作。

瓶颈游戏:钱该花在哪里

有了我们精炼的磁盘访问模型,我们现在可以问一些实际问题。想象你有一笔预算来升级一个磁盘驱动器,以提高其为一个执行许多小型随机读取的数据库服务器的性能。你有两个选择:一个新驱动器,其平均寻道时间快 30%30\%30%;或者一个转速高达 150001500015000 RPM 而不是 720072007200 RPM 的驱动器。哪个能给你带来更大的效益?

这是一个经典的工程权衡。一个随机 I/O 的总服务时间是其各部分之和。假设我们的基准驱动器有 999 毫秒的平均寻道时间,4.174.174.17 毫秒的平均旋转延迟(720072007200 RPM),以及对于小块数据可忽略不计的传输时间。总时间约为 13.1713.1713.17 毫秒。

  • ​​改变 S(寻道):​​ 将寻道时间减少 30%30\%30% 可节省 2.72.72.7 毫秒。新的总时间是 6.3+4.17=10.476.3 + 4.17 = 10.476.3+4.17=10.47 毫秒。
  • ​​改变 R(旋转):​​ 增加到 150001500015000 RPM 将旋转延迟减少到仅 222 毫秒。新的总时间是 9+2=11.09 + 2 = 11.09+2=11.0 毫秒。

在这种情况下,改善寻道时间产生了更好的整体性能增益。原因是寻道时间是延迟的最大组成部分——即​​瓶颈​​。这说明了一个类似于阿姆达尔定律的原则:你能获得的性能提升受限于你没有改进的系统部分。要使系统更快,你必须始终识别并攻击其最大的瓶颈。

细节中的魔鬼

我们的模型已经相当强大,但磁盘的物理现实还包含一些更美妙的微妙之处,这些微妙之处对软件有着深远的影响。

磁头切换的成本

磁盘的执行器臂会同步移动所有磁头(每个盘面一个)。它们总是定位在各自盘面上相同编号的磁道上,形成一个“柱面”。从一个磁道移动到另一个磁道需要一次寻道。但是,从读取一个盘片的上表面切换到下表面,在同一个柱面内呢?这不需要移动臂,但也不是瞬时的。驱动器的电子设备必须停用一个磁头并激活另一个,这需要一个虽小但可测量的时间,即​​磁头切换时间​​ (tht_hth​),大约为 0.60.60.6 毫秒。

这看起来微不足道,但考虑一个恰好在两个盘面之间交替请求数据的工作负载。每个请求都会产生 0.60.60.6 毫秒的磁头切换惩罚!这是极大的浪费。但在这里,软件可以成为英雄。一个智能的磁盘调度器可以查看待处理请求的队列并重新排序它们。它不是交替服务,而是可以先服务一组(比如 101010 个)在第一个盘面上的请求,然后产生一次磁头切换,再服务第二个盘面上的 101010 个请求。通过这种方式对请求进行分组,磁头切换的成本被摊销到许多操作上,将其每次请求的影响减少到几乎为零。这是软件智能如何驯服物理硬件怪癖的一个典型例子。

未对齐的陷阱

也许现代最重要的教训来自于磁盘的物理格式与呈现给操作系统的逻辑视图之间的相互作用。为了增加容量和改善纠错能力,制造商转向了​​高级格式(AF)​​驱动器,它使用更大的 409640964096 字节(444 KiB)的​​物理扇区​​。然而,为了向后兼容那些期望 512512512 字节扇区的旧操作系统,大多数这些驱动器实现了一个称为 ​​512e​​ 的仿真层。驱动器报告它有 512512512 字节的逻辑扇区,而内部它是在 444 KiB 的块上操作的。

如果操作系统没有意识到这个底层现实,发出了一个未对齐的 444 KiB 写请求会发生什么?例如,它从逻辑扇区 111 开始,而不是逻辑扇区 000。这个写操作现在跨越了两个物理 444 KiB 扇区——它试图修改第一个物理扇区的最后 358435843584 字节和第二个物理扇区的前 512512512 字节。

驱动器不能简单地写入这些部分。为了保存在那些物理扇区中未被修改的数据,它必须执行一个成本高昂的​​读-修改-写(RMW)​​周期。对于受影响的两个物理扇区中的每一个,驱动器必须:

  1. ​​读取​​ 整个旧的 444-KiB 扇区到其内部缓存中。
  2. ​​修改​​ 缓存中相关字节为新数据。
  3. ​​写入​​ 整个新的 444-KiB 扇区回盘片。

一个看似无害的 444 KiB 逻辑写入,在介质层面竟演变成了两次物理读取和两次物理写入——总共 161616 KiB 的数据移动,仅仅为了写入 444 KiB 的新数据!这会严重影响写入性能,增加一个纯粹由额外介质传输时间构成的显著时间惩罚。解决方案纯粹是软件纪律的问题:确保磁盘分区、文件系统和应用程序都将其 I/O 操作与真实的 444 KiB 物理边界对齐。

这最后一个例子也许是最深刻的。它教导我们,抽象虽然强大,但从来不是免费的。将磁盘的物理性质隐藏在一个方便的仿真层后面,会创造一个隐藏的陷阱。真正的性能和精通来自于理解整个技术栈,从应用程序的请求一直到盘片表面旋转的原子。磁盘驱动器的舞蹈是一场机械之舞,要有效地引领它,我们必须首先学会它的舞步。

应用与跨学科联系

我们已经穿越了旋转盘片和飞速读写磁头组成的复杂芭蕾,探索了支配寻道时间和旋转延迟的基本物理学。这些不仅仅是硬件工程师的深奥细节;它们是构建如山般软件的基石约束。就像重力对于土木工程师一样,这些机械延迟是系统设计者必须尊重、规避甚至巧妙利用的基本现实。在许多方面,计算的历史就是我们与这些毫秒级暴政进行巧妙斗争的历史。现在让我们看看这些物理限制的回响如何贯穿整个计算机系统的架构,从你磁盘上的文件到你屏幕上的应用程序。

布局的艺术:文件系统设计

想象一下,你有一个很长的故事要写,但你必须使用一堆索引卡。你可以把一句话写在一张卡片上,然后把它们随机散布在整个图书馆里。要阅读这个故事,你必须在整个建筑里跑来跑去,这是一个耗时且令人沮丧的过程。或者,你可以把故事写在一叠连续的卡片上,整齐地归档在一个抽屉里。这样,阅读它就变得像从一张卡片翻到下一张一样简单。

这是文件系统面临的基本选择。将文件存储为一堆分散的块(一种“链式块”布局)意味着访问每个后续块可能需要一次新的、漫长的随机寻道和旋转等待。相比之下,将文件存储在一个连续的“区段(extent)”中,则将问题转化了。在初次寻道到文件开头之后,磁头只需要执行最小的、磁道到磁道的寻道来从文件的一部分移动到下一部分,这要快上几个数量级。这个简单的几何考虑解释了为什么你的电脑会如此努力地防止文件变得“碎片化”,以及为什么碎片整理工具曾经是必不可少的维护工具。

但是这些连续的块,或“区段”,应该有多大呢?这里存在一个优美的权衡。对于任何磁盘操作,都有一个固定的时间“入场费”,即定位成本 tseek+trotationt_{\text{seek}} + t_{\text{rotation}}tseek​+trotation​(寻道时间加旋转延迟)。然后,你要根据传输速率支付一个“每字节”的成本。如果你只传输极少量的数据,入场费将主导总时间。如果你传输大量数据,传输时间将占主导。这意味着存在一个“盈亏平衡点”,一个区段大小 E⋆E^{\star}E⋆,此时定位磁头所花的时间正好等于传输数据所花的时间。一个简单的模型揭示了这种优雅的关系:E⋆=(tseek+trotation)×rateE^{\star} = (t_{\text{seek}} + t_{\text{rotation}}) \times \text{rate}E⋆=(tseek​+trotation​)×rate。使用基于区段分配的文件系统,实际上是在试图确保大多数 I/O 操作的块大小都大于这个“拐点”,从而使磁盘将其宝贵的时间更多地用于实际移动数据,而不是仅仅为了就位。

指挥家:操作系统的锦囊妙计

操作系统(OS)扮演着一位大师级的指挥家,精心编排流向磁盘的请求,以最小化机械延迟的影响。它无法改变物理定律,但它可以在操作顺序上变得极其聪明。

最直观的策略之一是​​电梯算法(SCAN)​​。操作系统不是按请求到达的顺序(先进先出)来服务,这会导致磁头在盘片上疯狂地来回移动,而是按它们的物理位置(柱面号)对它们进行排序。然后,磁头会像服务楼层的电梯一样,朝一个方向扫过磁盘,处理其路径上的所有请求。然后它会反向,再扫回来。这通过将许多大的、随机的寻道变成一次长的、平滑的旅程,极大地减少了总寻道时间。

然而,这种优化是有代价的:​​公平性​​。想象一下,你在 10 楼等电梯,而电梯在 2 楼正向上运行。但一群人不断在 3、4、5 楼到达。电梯可能会一直服务那些较低的楼层,你的等待时间可能会变得非常长。同样,一个请求磁盘偏远末端数据的请求可能会被反复“饿死”,而调度器则在服务另一个区域密集的请求集群。追求最大吞吐量可能会导致某些进程出现不可接受的延迟,这是调度器必须应对的典型工程权衡。

为了进一步提高效率,操作系统可以​​合并​​小的、相邻的请求成一个更大的请求。对于 HDD 来说,这是一个巨大的胜利。你不是为两个小的读取支付两次寻道和延迟的代价,而是只为一次合并后的、更大的读取支付一次。这在某些情况下几乎可以将性能提高一倍。有趣的是,这一技巧对于固态硬盘(SSD)几乎没有任何好处,因为 SSD 没有移动部件,因此没有寻道或旋转延迟。这个对比完美地说明了我们的软件在多大程度上被旋转盘片的物理特性所塑造。

另一个强大的操作系统技术是​​预读​​,或称预取。如果你开始读取一个大文件的开头,操作系统会做出一个有根据的猜测,即你会继续顺序读取它。然后,它会主动为文件的接下来几个块发出一个单一的、大的读取请求。这将在一次更大的数据传输上摊销一次寻道和旋转等待的高昂固定成本。其原理与区段的“拐点”相同:通过获取一连串的 kkk 个页面,每个页面的定位开销变为 (tseek+trotation)/k(t_{\text{seek}} + t_{\text{rotation}})/k(tseek​+trotation​)/k。操作系统甚至可以计算出盈亏平衡的运行长度,当这个摊销开销变得小于简单传输单个页面所需的时间时,确保预取是净收益的。

作为对延迟响应的软件架构

寻道和旋转延迟的影响深深地延伸到应用程序和核心系统软件(如数据库和现代文件系统)的设计中。

考虑一下文件系统如何找到一个文件。在一个简单的​​索引分配​​方案中,为了获取数据的第一个字节,系统可能需要执行三次独立的、随机的磁盘 I/O:首先,读取文件的元数据(“inode”);其次,读取包含数据指针的索引块;第三,最终读取第一个数据块本身。在缓存冷的情况下,每一步都会产生一次完整的寻道和旋转延迟惩罚。如果一次随机 I/O 需要,比如说, 888 毫秒,那么在你的程序甚至看到其数据之前,“首字节时间”可能高达 242424 毫秒!作为一个绝妙的优化,许多文件系统会直接在其 inode 结构中​​内联​​非常小的文件。如果一个文件足够小,数据在第一次 I/O 中就被获取,完全消除了后续两次随机 I/O,并极大地加快了对小型配置文件或文档的访问速度。

可靠性又如何呢?​​日志文件系统​​通过将数据写入两次来提供防止系统崩溃导致数据损坏的保障:首先写入一个顺序日志(journal),然后才写入其最终位置。这种“预写式日志”确保文件系统可以恢复到一个一致的状态。但这种安全性并非没有代价。它引入了额外的 I/O 操作——至少一次寻道以到达日志区域,以及几次旋转等待来写入日志条目。这额外的时间就是数据完整性的物理代价。

鸿沟:虚拟内存与缺页

也许对磁盘延迟影响最戏剧性的说明是​​缺页​​。你的计算机的 CPU 和内存在纳秒的时间尺度上运行。而硬盘则在毫秒的时间尺度上运行——慢了一百万倍。当你的程序试图访问一块当前不在 RAM 中的内存时,就会发生缺页。CPU,这个速度的奇迹,会戛然而止并陷入操作系统。然后操作系统必须启动一次磁盘 I/O,从磁盘上的交换空间中获取所需的“页面”。

这个操作的总时间是惊人的。它始于纳秒级的 TLB 未命中和页表遍历。然后升级到微秒级的操作系统陷入。接着是灾难:一次毫秒级的磁盘访问,包括一次寻道、一次旋转等待,以及最后的数据传输。整个系统,从 CPU 向下,都处于停滞状态,等待一个物理臂移动和一个盘片旋转到位。这种时间尺度上的巨大差异是许多系统中最大的单一性能瓶颈。甚至交换空间的布局也很重要;与连续的交换分区相比,碎片化的交换文件可能会招致额外的寻道,进一步加剧缺页的惩罚。

宏观视角:从 RAID 到 SSD 革命

理解寻道和旋转延迟是设计大规模存储系统的关键。考虑 RAID 3,这是一种在多个具有同步主轴的磁盘上按字节进行数据条带化的架构。对于大型顺序传输,它是一个冠军。所有数据磁盘并行地进行流式传输,使吞吐量成倍增加。但对于小型随机请求,它是一场灾难。因为每次 I/O 都要求所有磁盘同步地寻道和旋转,所以阵列一次只能服务一个随机请求。其随机 I/O 性能并不比单个磁盘好。这种鲜明的权衡是其物理设计的直接结果。

最终,整个为寻道时间和旋转延迟而优化的领域,是人类在面对物理极限时独创性的证明。而赢得这场游戏的最好方式是改变规则。固态硬盘(SSD)的发明正是如此。通过用闪存取代旋转的盘片和移动的磁头,SSD 完全消除了寻道时间和旋转延迟。纳秒的世界不再受制于毫秒的世界。我们讨论过的许多复杂的调度算法、预取启发式方法和布局优化,虽然仍然有其意义,但在一个全 SSD 的世界里失去了它们的紧迫性。它们作为一座优美而复杂的纪念碑,见证了我们与旋转磁盘物理学进行的漫长而成功的斗争。