「HDD」- 概述原理

队列深度

相对于 CPU 来说,硬盘属于慢速设备,所有操作系统会给每个硬盘分配一个专门的队列用于缓冲 IO 请求。—— 该说法有待考究:磁盘本身是支持并行写入的。队列深度更象是操作系统特性,而非磁盘特性;

在某个时刻,有 N个inflight 的IO 请求,包括在队列中的 IO 请求、磁盘正在处理的 IO 请求。 N就是队列深度。

增加队列深度

加大硬盘队列深度就是让硬盘不断工作,减少硬盘的空闲时间。加大队列深度 →提高利用率 →获得 IOPS 和MBPS 峰值 →注意响应时间在可接受的范围内。

1)使用异步 IO ,同时发起多个 IO 请求,相当于队列中有多个 IO 请求。
2)多线程发起同步 IO 请求,相当于队列中有多个 IO 请求。
3)增大应用 IO 大小,到达底层之后,会变成多个 IO 请求,相当于队列中有多个 IO 请求队列深度增加了。

常见问题

Q:Queue Depth 决定速度?
A:对磁盘的命令数量也是有重要意义的。而将多个命令批量运行,也是新一代硬盘的功能。当 Queue Depth 增加时,表示更大量文件的 访问或是多个用户对磁盘的访问;

Q:队列深度增加,但是磁盘的性能却下降?
A:队列深度增加了, IO 在队列的等待时间也会增加,导致 IO 响应时间变大,这需要权衡。

磁盘缓存

Wikipedia/Disk buffer

#!/bin/sh

# 查看
hdparm -W /dev/sdxN

# 启用
hdparm -W1 /dev/sdxN

# 关闭
hdparm -W0 /dev/sdxN

注意:在部分磁盘中,当主机重启后,该配置会被重置。因此在配置后,可根据需要重启主机,以进行验证配置是否会被重置;

硬盘的工作方式

硬盘的工作方式如下:
1)收到 IO 请求,得到地址和数据大小。
2)移动磁头(寻址)。
3)找到相应的磁道(寻址)。
4)读取数据。
5)传输数据。

磁盘的随机 IO 服务时间 = 寻道时间 + 旋转时间 + 传输时间

对于 10000 转速的 SATA 硬盘来说,一般寻道时间是 7 ms ,旋转时间是 3 ms ,64KB 的传输时间是 0.8 ms ,则 SATA 硬盘每秒可以进行随机 IO 操作是 1000/ (7+3+0.8 )=93 。所以,我们估算SATA 硬盘 64KB 随机写的 IOPS 是93 。一般的硬盘厂商都会标明顺序读写的 MBPS (吞吐量)。

我们在列出 IOPS 时,需要说明 IO 大小、寻址空间、读写模式、顺序 /随机和队列深度。一般常用的 IO 大小是 4KB ,这是因为文件系统常用的块大小是 4KB 。

提高性能的方法

硬盘厂商提高硬盘性能的方法主要是降低服务时间(延迟)。
1)提高转速(降低旋转时间和传输时间)。
2)增加 Cache (降低写延迟,但不会提高 IOPS )。
3)提高单磁道密度(变相提高传输时间)。