机械硬盘的性能评估

概述

从个人 PC 到数据中心,机械硬盘都扮演着不可或缺的角色。从性能、存储容量等方面来考虑,机械硬盘一直都是一个不错的选择。因此,了解机械硬盘的性能评估方式也很有必要。

机械硬盘的组成结构

从物理视角来看,主要组件如下:

  1. 盘片(Platter): 一个机械硬盘一般由多个盘片组成,每个盘片都有两面,每一面都可以存储数据。
  2. 转轴(Spindle): 转轴会连接到一个电机上,驱动盘片的转动。常见的转速有:5400 rpm, 7200 rpm, 10000 rpm 和 15000 rpm。
  3. 读写磁头(Read/Write Head): 每个盘片的面都有一个对应的读写磁头,负责在该盘面上进行读写。
  4. 机械臂杆(Actuator Arm): 磁头连接到机械臂杆上,所有磁头在不同的磁道上移动时是同步的。
  5. 驱动控制主板:上面包括了微信处理器,内存,电路以及一些固件。这些固件负责控制转轴电机的电源,电机的速度。同时也控制了硬盘和主机的通信。此外,通过移动磁头,以及在不同磁头间的切换来控制硬盘的读写操作。

从逻辑视角来看:

  1. 磁道:盘片的每一面上都有多个磁道,每个磁道都是一个同心圆。
  2. 扇区:每个磁道被划分成多个扇区。

详细信息可参考:https://www.jianshu.com/p/cf100e39ccdf

性能评估维度

寻道时间(Seek Time)

机械硬盘在读写数据时,首先需要将磁头移动到指定的磁道上。这个时间为 Seek Time。一般情况下,机械硬盘的厂商会提供以下几个场景的 Seek Time 参数:

  • Full Stroke: 这个时间用来描述磁头从最里面的磁道移动到最外面的磁道所需要的时间。
  • Average: 从随机的磁道移动到另一个磁道所需的时间。一般是 1/3 的 Full Stroke 时间。
  • Track-to-Track: 在相邻的磁道之间移动磁头所需要的时间。

现在的机械硬盘 Average 时间一般在 3~15ms 左右。

旋转延迟(Rotational Latency)

在将磁头移动到指定磁道后,还需要转动磁盘盘片,将磁头指到特定的扇区以供读写。这个时间为 Rotational Latency,和硬盘的转速紧密相关。一般情况下,Average Rotational Latency 为 Full Rotational Latency 的一半。

以 5400 rpm 转速的硬盘为例,每分钟转动 5400 转,即 Full Rotational Latency 为 60*1000/5400 = 11.11ms。那么 Average Rotational Latency 就是 5.5 ms 左右。

数据传输速率(Data Transfer Rate)

image-20220211001141721

如上图所示,机械硬盘的数据传输速率有两个检测点:

  • 外部数据传输速率(External transfer rate): 这个是从硬盘外写入到硬盘内 Buffer 区域的速度。
  • 内部数据传输速率(Internal transfer rate): 这个是从硬盘内 Buffer 通过磁头写入到盘片中的速度。

一般来说,External transfer rate 都要远大于 Internal transfer rate。

IOPS

从上面总结到的三个维度,我们可以知道,一次 I/O 的时间为:

T(s) = T + L + X

其中,T 为平均的寻道时间,L 为平均旋转延迟,X 为数据传输时间。对于一块 7200rpm,平均寻道时间为 5ms,内部数据传输速率为 40MB/s 的机械硬盘来说。每次大小为 32KB 的 I/O 需要的时间为:

T(s) = 5ms + (60*1000ms/7200)/2 + 32KB/40MB*1000ms = 5ms + 4.17ms + 0.78ms = 9.95 ms

IOPS 描述的是每秒的 I/O 次数,那么可以得出该硬盘的 IOPS 为:1000/9.95 = 100.5 IOPS。

硬盘 I/O 控制器的利用率

除了上述硬盘本身的性能参数,我们还可以从实际使用时磁盘 I/O 控制器的利用率来评估。我们可以将硬盘当作黑盒,只有以下两个组件构成:

  • 队列:在 I/O 请求被处理之前,都被存放在队列中等待。
  • 硬盘 I/O 控制器:控制器负责从队列中取出 I/O 请求并处理。

disk-io-rate

如上图所示,应用产生的 I/O 请求先到达 I/O 队列中,由 I/O 控制器取出并处理。如果该队列的长度持续增加,那么每个 I/O 的平均响应时间也是持续增加的。可以得出:

平均响应时间 = T(s)/(1-利用率)。

根据该公式可以得出下图:

graph

平均响应时间的增长并不是线性的,当利用率越高,增长会越快。整个增长的拐点大概在 70% 处。所以一般情况下,我们要保证我们的应用使用的磁盘利用率在 70% 左右,才能保证一个较好的性能。