计算磁盘上读取字节的平均时间

计算磁盘上读取字节的平均时间

问题给了我以下参数:

寻道时间 = 10ms(毫秒)。

磁盘旋转速度=每分钟9000转

每条磁道上的扇区数 = 600

每个扇区可以存储512字节的数据。

问题要求我计算读取1024字节的平均时间。

我需要知道我是否做对了。如果有人能看看我的解决方案,我将不胜感激。

解决方案

寻道时间方程,摘自 William Stallings,《计算机体系结构与组织》第 10 版

答案1

要读取 1024 个字节 (1024 / 512 = 2 个扇区),您需要:

  • 寻找第一个扇区的轨道。10ms
  • 等待第一个扇区开始到达头部位置。等待时间 - 最小 0 毫秒,最大 60*1000/9000 = 6.67 毫秒,平均 3.33 毫秒
  • 读取扇区。1/(600*(9000/60)) = 0.011ms。忽略。
  • 第二个扇区可能位于同一磁道或另一磁道上。寻道时间 - 最小 0 毫秒,最大 10 毫秒,平均 5 毫秒
  • 等待第二个扇区起始位置到达头部位置。等待时间 - 最小 0 毫秒,最大 6.67 毫秒,平均 3.33 毫秒
  • 读取扇区。忽略。

总计:10+3.33+5+3.33 ~ 21.7 毫秒

PS. 不要认为“如果扇区之间没有寻道,等待时间为 0”。没有人说扇区是相邻的。

答案2

我暂时假设您确实想了解决定实际数据速率的部分因素,而不仅仅是理论上的因素。通常,除非您像我公司曾经做的那样为操作系统编写设备驱动程序,或者编写数据库引擎本身,否则所有这些细节在今天都有些平凡。这些实际细节大多被许多硬件和操作系统因素掩盖、过滤、补偿和隐藏,因此您通常无法直接观察到正在发生的事情。

了解什么会导致性能问题以及不会导致性能问题仍然很重要。

数据库的平均“读取数据速率”主要取决于您一次移动的 IO 的大小,以及它是否连续。它还取决于磁盘本身,报告其真实的硬件参数,这些参数通常只是模拟的。(例如,每个磁道真的有 600 个扇区吗?由于磁盘的外磁道要大得多,因此过去 30 年中的任何磁盘外磁道上的扇区都会比内磁道上的扇区多得多。)如果这些是真实参数,以下是一些性能示例:

数据库读取:通常意味着扇区号将在整个磁盘上随机读取(大概是 2 个连续的 512 个扇区的 1024 个字节),并且没有任何扇区位于内存或任何其他缓存中: 在这种情况下,您的平均数据速率将是:

10 MS = 磁头寻道重新定位:(请注意,这意味着您只能在 1 秒内进行 100 次寻道,因此 100 KB/秒将是您可以随机读取 1024 的最快速度。)

1 ? MS = 命令开销 = 未知:这曾经很重要,高达 8 MS。如今,它可能更依赖于您的操作系统,高效处理您的请求。因此,如果您的系统还将许多 MB 交换到磁盘,您的系统将显著减速。今天,磁盘的 IO 可能不到 1 MS。这可以使用 SSD 轻松测试,以模拟旋转 HD 的总线和固件开销。这里通常包括切换读取头的时间,假设您已经在正确的轨道或柱面。这还包括将移动的数据返回到操作系统。观察您的总 CPU 中断时间是否保持 < 1%,这可能表明磁盘硬件存在问题。猜猜?< 1 MS,这仍然很重要。

3.3 MS = 旋转直到扇区位于磁头下方:9000 RPM/60 秒 = 6.67 MS。最近或最远的几率为 50%,因此每个 IO 的延迟为 3.33 MS。注意:这意味着如果磁头已经位于正确的轨道上,随机读取仍将为 3.33 MS,这意味着在 1k IO 下,您的最大数据速率永远不会超过 300 KB/秒。

0.022 MS = 磁头读取时间:6.67 MS / 600 个扇区 * 2 = 1024 次读取 ==> 0.022 MS。这意味着此磁盘的最大数据速率为 1 / 0.022 MS = 45,000 * 1024 = 46 MB / 秒。对于数据库读取/查询,这完全无关紧要,但如果移动整个数据库,这将是最重要的因素。

因此,在这种情况下,您的“数据库读取”速率将为 ~14.355 MS = 70 KB / 秒。请注意,如果 IO 为 512(忽略 .022 MS),则速率是其一半。使用 2,048,速率将翻倍。因此,最重要的参数是连续扇区的大小,直到您获得完整的磁道读取(假设所有磁盘扇区本身都是连续的)。

相关内容